montana/_internal-private/MontanaOS-archived-20260521/SECURITY_CARD-montana-node-process.md
2026-05-26 21:14:51 +03:00

80 lines
8.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Карта Безопасности — процесс узла Монтаны на 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) проходит на тестовом устройстве.
Невыполнение любого пункта — блокер для релиза.