102 lines
6.0 KiB
Markdown
102 lines
6.0 KiB
Markdown
# Открытые риски — 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 из 3–5 популярных доменов (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 |
|