montana/Node/External-Audit/THREAT-MODEL.md
2026-05-21 03:44:38 +03:00

56 lines
4.3 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.

# Модель угроз — 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 секция «Что мы НЕ гарантируем» (N1N7).