montana/Монтана-Протокол/Код/montana-vpn/docs/threat-model.md

100 lines
9.5 KiB
Markdown
Raw Permalink 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.

# Threat model — Montana VPN (Reality endpoint)
Что закрывает Reality + decoy nginx, а что — нет. Рассматриваются классы атак, не конкретные техники, которые меняются по мере появления новых DPI-плагинов.
## Покрытые атаки
### 1. Пассивный DPI (signature-based)
**Атака.** Провайдер/госрегулятор смотрит TLS ClientHello каждого исходящего соединения. Знакомые VPN-протоколы (WireGuard handshake, OpenVPN, классический Shadowsocks с ASCII-маркерами) определяются по сигнатурам и блокируются.
**Закрытие.** Reality прокидывает реальный TLS handshake к `www.googletagmanager.com`. С точки зрения DPI — это легитимный TLS 1.3 к Google, fingerprint-неотличим от обычного HTTPS-браузера. Дополнительно `xtls-rprx-vision` устраняет «TLS-in-TLS» fingerprint после handshake.
### 2. Active probing — connection replay
**Атака.** Цензор замечает «подозрительный» :443-эндпоинт. Скриптом подключается на тот же IP с тем же ClientHello, что использовал реальный клиент, и смотрит ответ. Если сервер отдаёт паттерн VPN-протокола (короткий handshake, специфический response), цель идентифицирована.
**Закрытие.** Reality верифицирует `short_id` + handshake-secret клиента. Если они не совпадают (а у пробера их нет) — Reality **проксирует** запрос к настоящему `www.googletagmanager.com:443` и отдаёт пробру реальный Google response. Пробер видит только Google.
### 3. Active probing — port scan
**Атака.** Цензор сканирует все open-ports VPS. Хочет понять «зачем» :443 открыт.
**Закрытие.** :443 → реальный TLS handshake к Google (через Reality fallback). :80 → nginx static decoy «It works!». Всё выглядит как обычный VPS с дефолтной конфигурацией. Никаких VPN-маркеров.
### 4. SNI fingerprinting + ClientHello fingerprinting
**Атака.** DPI смотрит TLS ClientHello extensions, ECH, GREASE, supported groups, signature algorithms. Сравнивает с известными VPN-клиентами.
**Закрытие.** Xray uTLS-фингерпринт `chrome` — точная репликация Chrome 124 ClientHello. Отличить от настоящего Chrome — невозможно без поломки протокола.
### 5. SSH brute-force
**Атака.** Сканеры пробуют password/key brute-force через SSH :22.
**Закрытие.** fail2ban (maxretry=3, ban 1h→1w incremental). Crowdsec (community IP-reputation, auto-ban 4h). Дополнительно рекомендуется `PasswordAuthentication no` в sshd, ключ-only.
### 6. ASN-based blocking
**Атака.** Цензор блокирует целые AS-номера известных VPN-провайдеров (DigitalOcean, Vultr, OVH).
**Закрытие частичное.** Helsinki (THE.Hosting / IPRoute Latvia / etc) — менее известный провайдер чем DigitalOcean. Но если цензор расширяет список AS — рано или поздно VPS будет в списке. Полное закрытие — резидентный IP (домашний) или ASN ротация (выходит за scope этого пакета).
## НЕ покрытые атаки
### 1. Endpoint compromise
Если на клиентском устройстве установлен RAT/spyware — VPN не помогает. Атакующий читает данные **до** шифрования.
**Митигация:** secure boot, hardware-key auth, regular OS patches, минимизация attack surface.
### 2. Global passive adversary
Атакующий который видит **одновременно** трафик клиента (от него к Helsinki) и трафик Helsinki (к target site). Через timing-correlation и packet-size patterns может с высокой вероятностью восстановить связь «client → target», даже если содержимое зашифровано.
**Митигация:** Tor (multi-hop, traffic mixing). Для среднего пользователя global passive adversary — нерелевантная угроза (требует ресурсов NSA-class).
### 3. Server-side compromise
Если VPS-провайдер или хостер скомпрометирован, либо сам оператор VPN злоумышленник — он видит всё содержимое трафика выходящее из exit-node (после расшифровки).
**Митигация:** end-to-end шифрование на уровне приложения (HTTPS, Signal). VPN защищает **on-path** между клиентом и exit-node, не **at-exit**. Это не баг, это фундамент proxy-модели.
### 4. Корреляция через RTT/timing
Если цензор видит весь трафик между клиентом и провайдером, он может через timing latencies восстановить (примерно) «клиент сделал запрос, через 80ms Helsinki сделал такой же запрос наружу». Не криптографическое доказательство, но достаточно для targeted-investigation.
**Митигация:** padding traffic, randomized delays — не реализовано в xray по умолчанию. Доступно как отдельные плагины.
### 5. Long-term traffic-volume analysis
Постоянный исходящий трафик 50 GB/месяц от **одного** клиента **только** на один Helsinki IP — статистически выделяется vs обычного web-серфинга. Цензор может пометить такого пользователя как «VPN-suspect» даже без расшифровки.
**Митигация:** ротация exit-IP (несколько Helsinki/Frankfurt/etc), периодическая смена), смешивание с обычным трафиком.
## Лестница атакующего по сложности
| Уровень | Кто | Что может |
|---|---|---|
| 1 | Местный провайдер | Базовый DPI signature → закрыто Reality |
| 2 | Госрегулятор (РФ ТСПУ, Иран) | Active probing + ASN-banlist → закрыто Reality + decoy + (потенциально) ASN-rotation |
| 3 | Сильный регулятор (Китай GFW) | ML-based timing/volume detection → требует traffic padding (не покрыто) |
| 4 | NSA-class global adversary | Global passive observation + targeted-implant → требует Tor/multi-hop (не покрыто) |
Этот пакет закрывает уровни 1-2, частично 3. Уровни 3-4 требуют отдельных архитектурных решений.
## Failure modes — когда стек ломается
1. **Цензор блокирует dest SNI (`www.googletagmanager.com`).** Вероятность низкая — Google domain слишком важен. Митигация: смена `DECOY_HOST` на `www.cloudflare.com` или другой.
2. **Уязвимость в xray.** Уровень атак на Go-binary с pure-software TLS — низкий (xray активно поддерживается, security-issues закрываются ≤30 дней).
3. **Compromise xray credentials.** `state.env` mode 0600, читается только root. Если root scompromised → утрачен и VPN, и узел Montana, и весь VPS.
4. **Reality-protocol weakness обнаружен.** Reality введён 2022, активно изучается. Известные проблемы исправляются upstream. Старые xray-версии могут содержать уязвимости — требуется auto-update (`unattended-upgrades` для Ubuntu или периодический ручной `xray update`).
## Рекомендации оператору
- Использовать VPN **в дополнение** к threat model приложения, не как замену.
- Хранить мнемонику узла Montana и VPN-state.env в **разных** местах (компрометация одного не даёт второго).
- Регулярно обновлять xray (`bash <(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh) @ install`).
- Мониторить `journalctl -u xray --since today` на аномальные failures.
- Если VPS из «горячей» юрисдикции (US, RU, CN) — рассматривать как **компрометированный по умолчанию** и не доверять ему хранение секретов длительного срока.