# Открытые риски — 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 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 |