Axion Платформа Скачать
Security

Безопасность, встроенная в рантайм

Модель Axion построена на принципе «всё запрещено, пока не разрешено». Capabilities, default deny и единый Permission Broker не позволяют приложению получить полный доступ к системе одним кликом установки.

# Модель угроз

Axion исходит из того, что любое приложение может быть скомпрометировано или оказаться вредоносным. Безопасность не опирается на «доверие к коду»: каждое системное действие проходит через контролируемую проверку на стороне движка.

  • Вредоносный пакет — приложение запрашивает больше прав, чем нужно для его функций.
  • Уязвимый интерфейс — XSS или инъекция в HTML/JS приложения не должны автоматически превращаться в права операционной системы.
  • Подделка пакета — подмена .axn при распространении или обновлении.
  • Самовольное повышение прав — приложение не может выдать себе разрешение без явного решения пользователя.

Этим сценариям Axion противопоставляет модель возможностей (capabilities), изоляцию WebView и одноразовые токены разрешений.

# Принципы безопасности

Default deny
Без явного решения пользователя любое системное действие блокируется. Отсутствие записи о разрешении означает запрет.
Минимальные привилегии
Приложение получает ровно те возможности, которые заявило в manifest: конкретный scope и цели — домены, команды, пути.
Единая точка контроля
Все чувствительные операции проходят через Permission Broker движка — JS-код приложения не участвует в проверке прав.

# Capabilities вместо «полного доступа»

Вместо одного бинарного разрешения «всё или ничего» приложение декларирует узкие возможности. Пример из manifest.json:

{
  "capabilities": {
    "filesystem.read":  { "scope": "workspace" },
    "process.execute": { "scope": "values", "targets": ["git"] },
    "network.connect": { "scope": "values", "targets": ["api.example.com"] }
  }
}

Декларация проверяется при установке пакета. При обновлении приложения расширение прав невозможно без нового согласия пользователя.

Полный список стандартных capabilities — в документации.

# Как запрашивается доступ

  1. Приложение вызывает, например, window.axion.fs.readFile().
  2. Engine проверяет: capability заявлена в manifest, а решение пользователя ещё не принято.
  3. Движок возвращает структурированную ошибку AXION_PERMISSION_NEEDED ticket=<uuid>.
  4. Мост показывает диалог: «Приложение запрашивает доступ: filesystem.read».
  5. Пользователь нажимает «Разрешить» или «Отказать» — решение запоминается.
Одноразовые ticket'ы. Каждый запрос привязан к конкретному приложению и теряет силу после ответа — приложение не может «отозвать» за себя токен позже.

# Хранилище решений

Выданные права и запреты хранятся локально в ~/.axion/permissions.json, привязаны к extension_id приложения и переживают перезапуск.

{
  "com.example.notes": {
    "filesystem.read": "granted",
    "network.connect": "denied"
  }
}

Управление из командной строки:

axion permissions                       # текущая политика
axion permissions grant com.example.notes filesystem.read
axion permissions revoke com.example.notes network.connect

Права, выданные в диалоге, и права, выданные через CLI, — единый источник истины: тот же самый файл.

# Целостность пакетов

.axn — самодостаточный пакет: manifest, точка входа, ресурсы и иконка. При установке Engine выполняет проверки:

  • структура пакета и наличие заявленной точки входа;
  • корректность manifest.json и валидность capabilities;
  • контрольная сумма пакета и (в производственном пайплайне) подпись издателя;
  • сравнение прав с уже установленной версией при обновлении.
Дорожная карта. Подпись пакетов и верификация издателей находятся в планах развития; до их включения устанавливайте пакеты только из доверенных источников.

# Изоляция и границы доверия

  • Нет прямого доступа к ОС. WebView не вызывает системные API — любой системный вызов это запрос к Rust-ядру через мост.
  • Проверка прав не в JS. Capability-проверка и Permission Broker выполняются на стороне Engine, а не в коде приложения.
  • Секреты отдельно. Ключи и токены хранятся через secrets, а не в storage или рядом с интерфейсом.
  • Явная сеть. Внешние соединения открываются только через network.connect с перечисленными целями.
Соберите приложение с правильными правамиРаздел «Разрешения» — как движок принимает решения о доступе.
Разрешения в документации