montana/_internal-private/MontanaOS-archived-20260521/SECURITY_CARD-montana-node-process.md

80 lines
8.6 KiB
Markdown
Raw Normal View History

2026-05-26 21:14:51 +03:00
# Карта Безопасности — процесс узла Монтаны на MontanaOS
Версия: 0.2
Привязка к спецификации: MontanaOS v0.2, раздел 6.2
Эта Карта Безопасности фиксирует контракт окружения исполнения для процесса `montana-node` на устройстве MontanaOS. Любое нарушение любого пункта — блокирующий дефект, не повод для предупреждения.
## 1. Защита от подкачки
Требование. Ни одна страница памяти процесса узла не попадает в подкачку.
Реализация. Подкачка отключена глобально на этапе ранней инициализации командой `swapoff -a` в [init.montana-node.rc](system/init.montana-node.rc). Дополнительно процесс узла блокирует свои рабочие сегменты, содержащие приватные ключи, через системный вызов `mlock`.
Проверка. Файл `/proc/<pid>/status` процесса узла содержит поле `VmLck` со значением больше нуля. Сторожевой таймер проверяет это в каждом цикле опроса. При нарушении узел останавливается, не перезапускается до ручного вмешательства.
## 2. Защита от аварийных дампов
Требование. Аварийный дамп процесса узла не создаётся ни при каких обстоятельствах.
Реализация — два слоя.
Слой системы инициализации. Жёсткий лимит размера ядра при аварии установлен в ноль ноль через директиву `rlimit core 0 0` в сервисной записи. Это предотвращает создание дампа на уровне ядра до того, как сам процесс получит возможность его запретить.
Слой процесса. Двоичный файл узла обязан вызывать системный вызов `prctl(PR_SET_DUMPABLE, 0)` до загрузки приватных ключей в память. Это требование контракта двоичного файла, документированное в спецификации MontanaOS v0.2 раздел 5.4.
Проверка. Файл `/proc/<pid>/status` процесса узла содержит поле `Dumpable` со значением ноль. Сторожевой таймер проверяет это в каждом цикле опроса. При нарушении узел останавливается, не перезапускается.
## 3. Защита от отладчика
Требование. Никакой процесс, кроме самого процесса узла, не может присоединиться к процессу узла как отладчик.
Реализация. Политика обязательного контроля доступа SELinux запрещает разрешение `ptrace` на домен `montana_node` со всех остальных доменов, включая системные (`u:r:system_app:s0`, `u:r:adbd:s0`, и так далее). Конкретный файл политики — `system/sepolicy/montana_node.te` (создаётся в Фазе 2 дорожной карты).
Проверка. Попытка `strace -p <pid>` или эквивалент со стороны любого пользователя, включая root, завершается отказом доступа.
## 4. Защита от вытеснения при нехватке памяти
Требование. Процесс узла не убивается убийцей при нехватке памяти раньше критических системных приложений.
Реализация. Сервисная запись узла содержит директиву `oom_score_adj -800`. Это ставит процесс в категорию «системные приложения с высоким приоритетом», но не выше системного сервера (минус девятьсот) и не выше системы инициализации (минус тысяча).
Проверка. Файл `/proc/<pid>/oom_score_adj` процесса узла содержит значение минус восемьсот.
## 5. Минимизация системных привилегий
Требование. Процесс узла располагает только теми системными привилегиями, которые ему действительно нужны.
Реализация. Сервисная запись узла объявляет capabilities `NET_BIND_SERVICE` (привязка к привилегированному порту) и `IPC_LOCK` (блокировка памяти). Все остальные системные привилегии узлу недоступны.
Проверка. Файл `/proc/<pid>/status` процесса узла содержит поле `CapEff` (effective capabilities) с битами только для двух перечисленных привилегий.
## 6. Изоляция файловой системы
Требование. Процесс узла читает и пишет только в свои каталоги: `/data/montana/keys/` (только чтение в момент загрузки, потом закрытый дескриптор), `/data/montana/state/` (чтение и запись), `/data/montana/` (только чтение конфигурации).
Реализация. Политика SELinux привязывает процесс узла к домену `montana_node` и разрешает доступ только к меткам `montana_keys`, `montana_state`, `montana_config`. Сетевой доступ ограничен tcp-сокетами в инициированном направлении и принимающим сокетом на порту восемь тысяч четыреста сорок четыре.
Проверка. Сторонний процесс не может прочитать ни один файл в `/data/montana/`. Процесс узла не может записать в файловую систему за пределами `/data/montana/state/`.
## 7. Очистка секретов при завершении
Требование. При нормальном или аварийном завершении процесса узла все рабочие копии секретов в памяти затираются нулями до возвращения страниц операционной системе.
Реализация. Контракт двоичного файла узла. Узел регистрирует обработчик сигналов аварии (`SIGSEGV`, `SIGBUS`, `SIGABRT`, `SIGTERM`, `SIGINT`), который выполняет затирание перед завершением. Это требование документировано в спецификации MontanaOS v0.2 раздел 5.4.
Проверка. Тест-критерий проверяется фаззингом: посылка `SIGSEGV` процессу узла, дамп всей памяти системы (через `kdump`), проверка, что байт-паттерны секретных ключей не встречаются в дампе.
---
## Тест-критерии для приёмки
Карта Безопасности считается выполненной, если:
1. Все семь требований выше проверены автоматическими тестами в составе `montana-node` testsuite.
2. Сторожевой таймер успешно обнаруживает и реагирует на нарушение требований 1, 2, 4, 5.
3. Политика SELinux проходит compile-time проверку через `secilc` без предупреждений.
4. Тест фаззинга на затирание секретов (требование 7) проходит на тестовом устройстве.
Невыполнение любого пункта — блокер для релиза.