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

102 lines
6.0 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**
Реестр рисков, принятых сознательно или отложенных до пост-аудита. Каждый риск имеет ID, оценку и план.
## Принятые риски (live с обоснованием)
### R-1. Один SNI (www.googletagmanager.com) → single point of fingerprint
- **Severity:** medium
- **Vector:** AT-3 (DPI/цензор) выпускает rule «block any TLS to <our IPs> with SNI=googletagmanager»
- **Текущая митигация:** SNI популярный, реальный Google handshake; mass-block нанесёт collateral на Google
- **План:** SNI-pool из 35 популярных доменов (gstatic, googleapis, fonts.google, и т.п.), rotation по странам
- **Срок:** до mainnet v2 (Q3 2026)
### R-2. CF DNSSEC выключен
- **Severity:** medium
- **Vector:** AT-2 (active MITM) может подменить ответ DNS на ложный IP
- **Митигация-факт:** клиент Reality верифит сервер через `pbk` — даже если IP подменён, без правильного privateKey клиент не получит коннект; max damage — DoS
- **План:** включить DNSSEC в Cloudflare для зоны montana.quest
- **Срок:** ближайшая неделя
### R-3. DDoS на :443 узлов
- **Severity:** medium
- **Vector:** AT-7 (DDoS) кладёт один узел; остальные продолжают работать благодаря multi-A
- **Митигация-факт:** auto-prune убирает упавший IP за ≤ 120s, клиенты переключаются
- **План:** Cloudflare Spectrum на front-уровне (но это убьёт Reality direct-cooн — несовместимо). Альтернатива — anti-DDoS уровня хостинга
- **Срок:** не блокирующий
### R-4. Один Reality privateKey на все узлы
- **Severity:** medium-high (blast radius)
- **Vector:** AT-4/AT-6 — утечка с одного узла = компрометация всей сети
- **Митигация-факт:** privateKey 0600 root:root; не в публичных артефактах; не в репозитории
- **План:** регулярная ротация (раз в 6 месяцев или по триггеру)
- **Срок:** процесс описан в OPERATIONS.md → "Ротация ключей Reality"
### R-5. Reality `xtls-rprx-vision` может deprecate
- **Severity:** low-medium
- **Vector:** XTLS-team меняет протокол, новые клиенты несовместимы со старым сервером
- **Митигация:** мониторинг XTLS releases; pin xray-install
- **План:** при выпуске нового flow — миграция всех узлов одним rolling-update
## TODO (P0/P1 закрыть до mainnet)
### TODO-1. Endpoint `/vpn/node/deregister` уязвим к replay attack
- **Текущее:** проверка только secret в body; атакующий, перехвативший один валидный запрос, может повторить
- **Severity:** low (запрос идёт по HTTPS, secret в Keychain)
- **Фикс:** добавить timestamp + HMAC + nonce
- **Срок:** до mainnet
### TODO-2. xray-core версия не pinned
- **Текущее:** pinned только Xray-install; core качается latest
- **Severity:** low (XTLS обычно semver, breaking changes редко)
- **Фикс:** `xray-install install --version v25.x.y`
- **Срок:** до mainnet
### TODO-3. montana-node бинарь без verify
- **Текущее:** join.sh качает бинарь с hub.montana.quest без SHA256
- **Severity:** medium (если hub скомпрометирован — RCE на новых узлах)
- **Фикс:** SHA256 в genesis-manifest.json + verify в join.sh
- **Срок:** до mainnet
### TODO-4. Нет HMAC между orchestrator → Cloudflare
- **Текущее:** orchestrator → CF API через bearer token; нормально, но любой кто украл token из Moscow имеет full DNS write
- **Severity:** medium
- **Фикс:** scope token максимально (Zone.DNS:Edit only, ip allowlist)
- **Срок:** ближайшая неделя
### TODO-5. orchestrator работает на dev Flask server
- **Текущее:** Flask dev `app.run()` — некачественно для prod
- **Severity:** low (трафик низкий, локальный, за nginx)
- **Фикс:** gunicorn или uwsgi
- **Срок:** не блокирующий
## Out of scope для текущего аудита
- Корректность Reality cryptography (это XTLS upstream)
- Корректность TimeChain proto on :8444 (отдельный аудит `Montana-Protocol/Code/AUDIT.md`)
- Корректность iOS/Android клиентов (Happ, v2rayNG)
## Закрытые риски (для истории)
| ID | Описание | Закрыто |
|---|---|---|
| ~~R-old-1~~ | privateKey зашит в публичном `join.sh` → утечка через hub | 2026-05-18: env-driven (C5) |
| ~~R-old-2~~ | Helsinki cascade — single point of failure | 2026-05-18: переход на multi-A pool |
| ~~R-old-3~~ | xray под `nobody`, systemd warning | 2026-05-18: dedicated `xray:xray` |
| ~~R-old-4~~ | RestartPreventExitStatus=23 блокирует Restart=always | 2026-05-18: удалён из unit |
| ~~R-old-5~~ | CrowdSec FRA банит Moscow IP → watchdog не работает | 2026-05-18: permanent whitelist |
| ~~R-old-6~~ | watchdog state desync с CF после ручного register | 2026-05-18: sync каждый цикл |
| ~~R-old-7~~ | US ufw whitelist только Helsinki → клиенты не подключаются | 2026-05-18: :443 ALLOW Anywhere |