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

9.5 KiB
Raw Permalink Blame History

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) — рассматривать как компрометированный по умолчанию и не доверять ему хранение секретов длительного срока.