Безопасность, встроенная в рантайм
Модель Axion построена на принципе «всё запрещено, пока не разрешено». Capabilities, default deny и единый Permission Broker не позволяют приложению получить полный доступ к системе одним кликом установки.
# Модель угроз
Axion исходит из того, что любое приложение может быть скомпрометировано или оказаться вредоносным. Безопасность не опирается на «доверие к коду»: каждое системное действие проходит через контролируемую проверку на стороне движка.
- Вредоносный пакет — приложение запрашивает больше прав, чем нужно для его функций.
- Уязвимый интерфейс — XSS или инъекция в HTML/JS приложения не должны автоматически превращаться в права операционной системы.
- Подделка пакета — подмена
.axnпри распространении или обновлении. - Самовольное повышение прав — приложение не может выдать себе разрешение без явного решения пользователя.
Этим сценариям Axion противопоставляет модель возможностей (capabilities), изоляцию WebView и одноразовые токены разрешений.
# Принципы безопасности
# Capabilities вместо «полного доступа»
Вместо одного бинарного разрешения «всё или ничего» приложение декларирует узкие возможности. Пример из manifest.json:
{
"capabilities": {
"filesystem.read": { "scope": "workspace" },
"process.execute": { "scope": "values", "targets": ["git"] },
"network.connect": { "scope": "values", "targets": ["api.example.com"] }
}
}
Декларация проверяется при установке пакета. При обновлении приложения расширение прав невозможно без нового согласия пользователя.
Полный список стандартных capabilities — в документации.
# Как запрашивается доступ
- Приложение вызывает, например,
window.axion.fs.readFile(). - Engine проверяет: capability заявлена в manifest, а решение пользователя ещё не принято.
- Движок возвращает структурированную ошибку
AXION_PERMISSION_NEEDED ticket=<uuid>. - Мост показывает диалог: «Приложение запрашивает доступ: filesystem.read».
- Пользователь нажимает «Разрешить» или «Отказать» — решение запоминается.
# Хранилище решений
Выданные права и запреты хранятся локально в ~/.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с перечисленными целями.