# Модель угроз — VPN-сеть Montana Версия: **2026-05-18** ## Активы - A1: privacy трафика пользователя (содержимое, метаданные) - A2: доступность сервиса (uptime) - A3: untraceability подключения (DPI не должен распознать Reality) - A4: целостность DNS multi-A pool (только живые/наши узлы) - A5: integrity конфигов узлов и orchestrator ## Атакующие | Кто | Возможности | |---|---| | **AT-1 Passive observer на пути** | Снифать трафик, не модифицировать | | **AT-2 Active MITM (BGP/ISP)** | Подменять трафик, terminate TLS | | **AT-3 DPI/цензор** | Сигнатурный анализ, активный probing | | **AT-4 Compromised hosting** | Image dump VM, доступ к файлам узла | | **AT-5 Insider с admin TOKEN** | Изменения multi-A, добавление узлов | | **AT-6 Утечка одного privateKey** | Поднять «фейковый» Reality на любом IP | | **AT-7 DDoS на :443** | Заваливать сетевой стек узла | | **AT-8 SSH brute-force** | Пытаться войти на узел | ## Угрозы и митигации | ID | Угроза | Атакующий | Митигация | Остаточный риск | |---|---|---|---|---| | T-1 | Snooping трафика | AT-1 | TLS 1.3 + Reality auth | низкий | | T-2 | Identity spoofing Reality-узла | AT-6 | privateKey 0600 root + не утечёт в git/hub (C1, C5) | средний (один ключ — один blast radius) | | T-3 | DPI fingerprinting | AT-3 | Reality имитирует Google TLS handshake | средний (зависит от устойчивости Reality к новым DPI) | | T-4 | Active probing узла | AT-3 | Reality short_id-gating: чужой клиент получает реальный Google response | низкий | | T-5 | Подмена DNS-pool | AT-2 | Cloudflare DNSSEC выключен сейчас — РИСК; митигация: TTL 120s + клиент верифит cert через pbk | **средний — см. OPEN-RISKS R-2** | | T-6 | Compromised узел читает чужой трафик | AT-4 | freedom outbound = прямо в интернет, узел видит destination как любой VPN | принято (см. N5) | | T-7 | Утечка admin TOKEN | AT-5 | Только в Keychain (macOS) + /etc/montana/orchestrator-admin-token (0600); ротация по требованию | низкий | | T-8 | Утечка CF API token | AT-5 | Token scoped только на zone montana.quest; ротация по требованию | низкий | | T-9 | Узел падает — клиент таймаут | — | Orchestrator watchdog 30s + multi-A auto-prune; iPhone DNS TTL 120s | низкий | | T-10 | Orchestrator падает — нет prune | — | systemd Restart=on-failure; ручной trigger возможен через `/register` | низкий (deg-graceful: pool остаётся как был) | | T-11 | Crash-loop xray = CPU burn | — | StartLimitBurst=10/300s | низкий | | T-12 | SSH brute force на узел | AT-8 | fail2ban + ufw + CrowdSec на FRA | низкий | | T-13 | DDoS на :443 | AT-7 | Опираемся на хостинг-провайдера, BGP-уровень | **средний — см. OPEN-RISKS R-3** | | T-14 | Подмена `cdn.montana.quest` через CF account takeover | AT-5+CF | CF account 2FA, API token scoped | низкий-средний | | T-15 | Утечка privateKey через `join.sh` в публичный hub | — | Закрыто 2026-05-18: privateKey в env/защищённом файле, не в скрипте (C5) | **закрыто** | ## Доверенные элементы (assumed trusted) - Cloudflare (DNS + API) — single trust anchor management plane - macOS Keychain — где живут все управляющие токены - Хостинг провайдеры (Timeweb FI/RU, THE.Hosting FRA/US) — image confidentiality - Reality protocol (XTLS) — корректность реализации `xtls-rprx-vision` ## Out of scope См. AUDIT-READINESS.md секция «Что мы НЕ гарантируем» (N1–N7).