# Карта Безопасности — процесс узла Монтаны на 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//status` процесса узла содержит поле `VmLck` со значением больше нуля. Сторожевой таймер проверяет это в каждом цикле опроса. При нарушении узел останавливается, не перезапускается до ручного вмешательства. ## 2. Защита от аварийных дампов Требование. Аварийный дамп процесса узла не создаётся ни при каких обстоятельствах. Реализация — два слоя. Слой системы инициализации. Жёсткий лимит размера ядра при аварии установлен в ноль ноль через директиву `rlimit core 0 0` в сервисной записи. Это предотвращает создание дампа на уровне ядра до того, как сам процесс получит возможность его запретить. Слой процесса. Двоичный файл узла обязан вызывать системный вызов `prctl(PR_SET_DUMPABLE, 0)` до загрузки приватных ключей в память. Это требование контракта двоичного файла, документированное в спецификации MontanaOS v0.2 раздел 5.4. Проверка. Файл `/proc//status` процесса узла содержит поле `Dumpable` со значением ноль. Сторожевой таймер проверяет это в каждом цикле опроса. При нарушении узел останавливается, не перезапускается. ## 3. Защита от отладчика Требование. Никакой процесс, кроме самого процесса узла, не может присоединиться к процессу узла как отладчик. Реализация. Политика обязательного контроля доступа SELinux запрещает разрешение `ptrace` на домен `montana_node` со всех остальных доменов, включая системные (`u:r:system_app:s0`, `u:r:adbd:s0`, и так далее). Конкретный файл политики — `system/sepolicy/montana_node.te` (создаётся в Фазе 2 дорожной карты). Проверка. Попытка `strace -p ` или эквивалент со стороны любого пользователя, включая root, завершается отказом доступа. ## 4. Защита от вытеснения при нехватке памяти Требование. Процесс узла не убивается убийцей при нехватке памяти раньше критических системных приложений. Реализация. Сервисная запись узла содержит директиву `oom_score_adj -800`. Это ставит процесс в категорию «системные приложения с высоким приоритетом», но не выше системного сервера (минус девятьсот) и не выше системы инициализации (минус тысяча). Проверка. Файл `/proc//oom_score_adj` процесса узла содержит значение минус восемьсот. ## 5. Минимизация системных привилегий Требование. Процесс узла располагает только теми системными привилегиями, которые ему действительно нужны. Реализация. Сервисная запись узла объявляет capabilities `NET_BIND_SERVICE` (привязка к привилегированному порту) и `IPC_LOCK` (блокировка памяти). Все остальные системные привилегии узлу недоступны. Проверка. Файл `/proc//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) проходит на тестовом устройстве. Невыполнение любого пункта — блокер для релиза.