montana/Node/External-Audit/OPEN-RISKS.md

102 lines
6.0 KiB
Markdown
Raw Normal View History

2026-05-21 03:44:38 +03:00
# Открытые риски — 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 |