Семейство Project Paranoia

PROJECT PANDORA

Техническое описание архитектуры. Как устроено ядро: модель угроз, транспорты, свой TLS, внутренний протокол, режимы сети и подписанный профиль. Спутник документа о намерениях — с техническими подробностями.
2026 · черновик, все капсулы обсуждаются
01 · Модель угроз

Что делает ТСПУ, детально

Нарушитель — цензор-провайдер: полная запись трафика, исходный код любого известного туннеля, пассивная классификация, репутационные списки. Ограничен не алгоритмами, а вычислительным ресурсом на магистрали. Механизмы ниже — из разведки и своего мониторинга из РФ; численные пороги — реконструкции источников, не наши измерения.

01Поведение после рукопожатия

Соединение устанавливается, а затем замирает или сбрасывается по объёму, числу сессий и таймингам. Вложенный TLS-хендшейк детектируется по размерам и направлениям первых бёрстов; разрыв RTT транспорт/приложение паддингом не лечится.

02Лимитер рукопожатий

3–12 параллельных TLS к одному IP или SNI за минуту дают заморозку 120 с; смена отпечатка под заморозкой — 600 с; повтор продлевает. Состояние по паре (IP назначения, отпечаток клиента). Клиент без мультиплекса попадает по построению.

03TLS-отпечаток как ключ

Отпечаток клиента — ось классификации. Chrome/Safari/iOS на подозрительных префиксах под подозрением, Firefox/OkHttp проходят. Статический отпечаток любой библиотеки живёт месяцы и попадает в базу; ловится неточная копия браузера.

04Репутация /24 и ASN

Весит больше формы протокола. Свежий IP живёт часы; один палящий сервис валит весь IP; несовпадение ASN сервера и владельца донора — пассивный признак. Форму протокола можно вылизать, репутацию адреса — нет.

05Объёмный лимит

Поток к адресам из подозрительных ASN замораживается после 16–20 КБ от сервера — TCP и QUIC одинаково. Диагностический признак: короткий ответ проходит, длинный обрывается на пороге.

06Триггеры per-абонент

Обращение к маркерному SNI или известному IP переводит абонента в бан к целому ASN на 5–15 мин. Выходной IP светится через российские приложения: двойные запросы к .ru и .com, RTT против геолокации.

07Белые списки

Штатный режим в 64–77 регионах по расписанию. L3 CIDR не пробивается подменой SNI; живёт только TCP 80/443 к белым IP, UDP мёртв; релей в белом облаке закрыт административно с 24.01.2026. Фильтр L7 по SNI поверх L3.

08ОРИ и офлайн-анализ

Организатор распространения информации по 374-ФЗ хранит содержимое и ведёт ОТЛОЖЕННЫЙ выборочный офлайн-анализ медиапотоков — вне бюджета реального времени. Российский ОРИ по закону имеет доступ к расшифрованному WebRTC.

02 · Принципы

Экономика цензора, не невидимость

Алгоритмически цензор уже мог бы блокировать весь известный туннельный трафик поведенческим анализом и активным зондированием. Но на магистралях и у провайдеров идут терабиты в секунду, объём непрерывно растёт, и каждая новая проверка стоит вычислителя, памяти и риска сломать чужой законный трафик. Планка ставится не на неотличимость, а на стоимость фильтрации.

Цель — не стать неотличимыми, а сделать так, чтобы отличить нас стоило цензору слишком дорого. Секретность кода при этом не предполагается: продукт проектируется так, будто у противника весь исходник с первого дня.
Ресурс, не алгоритм
Ограничение цензора — вычислитель на терабитном конвейере, а не знание протокола. Даже отделить зарубежные IP от российских дорого по поиску в таблицах. Значит давление на ресурс работает там, где давление на алгоритм нет.
Асимметрия стоимости признаков
Каждая проверка, которую цензор вынужден добавить, дорога на конвейере: промах кэша, рост состояния, риск скандала от ложного срабатывания. Наш ассортимент непохожих протоколов — налог на цензора, а не маскировка отдельного потока.
Collateral damage
Поднять цену ложного срабатывания до неприемлемой: цензор встаёт перед выбором — пропустить нас или сломать критичное (банки, звонки, госсервисы). Механизм — паразитирование на настоящих несущих (RTP, SIP, WebRTC-семья), а не похожесть на них.
Метрика кандидата
Транспорт-кандидат оценивается как цена отсечения, умноженная на риск сопутствующего ущерба: RTP — максимум (дорого и больно рубить), узкий служебный канал — минимум. По этой метрике выбирается порядок ввода несущих.
Двухходовка blacklist / whitelist
Blacklist топим ассортиментом: раздувание проверок толкает цензора в whitelist, дорогой и опасный для государства надолго. Whitelist топим глубиной внутри разрешённого: сверка адреса дёшева, но под пиковой нагрузкой глубокий анализ содержимого идёт под нож — отсюда окна miss.
03 · Архитектура ядра

Конвейер, крейты и асимметрия сборки

Клиент — статически слинкованное ядро на Rust; нода — отдельный бинарь, шарящий с клиентом крейты протокола и крипто. Управление ядром снаружи — только C-FFI, без слушающего сокета: не плодить сеть на устройстве и не давать палящий признак. Маршрутизатор потоков и детектор режима живут в ядре, не в клиентской обвязке.

входы
TUN / proxy / TPROXY
›
router
тип / домен, детектор режима
›
tmgr
пул, лимитер, переключатель
›
transport
T1..T5, media
›
proto
e2e AEAD, mux, компрессия
›
нода
anti-probing, выпуск
Обратный путь симметричен. Router и детектор режима — внутри ядра; вход и выход склеивает pandora-core.

Уровень 0 · база

pandora-crypto — обёртки RustCrypto/dalek. pandora-router — классификатор потоков + детектор режима. Формат профиля — спека-документ.

Уровень 1 · каналы

pandora-proto — внутренний протокол туннеля. pandora-tls — свой TLS-стек. pandora-profile — парсинг и подпись профиля.

Уровень 2 · транспорт

pandora-transport — trait + T1..T5. pandora-media — WebRTC-фронт (T4). pandora-tmgr — менеджер и лимитер.

Уровень 3 · сборка

pandora-core — клиент, входы, C-FFI. pandora-node — серверный бинарь. pandora-cli — тестовый клиент и стенд.

crypto --+--> proto ----+--> transport --+--> tmgr --+--> core --> cli | | | | +--> tls -------+ +--> media -+ | | +--> profile ---------------------------------+ router (независим) --------------------------------> core критический путь: crypto -> proto -> transport -> tmgr -> core
Асимметрия состава бинаря. Каждый транспорт-протокол — отдельный крейт за feature-флагом; мёртвые обличья выкидываются из релизной сборки одной пересборкой. Расширение — статическими крейтами, не dlopen и не отдельным процессом (общий знаменатель с iOS/Android, где догрузка кода запрещена). Телеметрия — тоже флаг сборки: релиз без неё, бета с ней. Мы удешевляем бинарь пересборкой, ТСПУ так же дёшево упростить свой фильтр не может.
04 · Транспорты

Несущие: ассортимент как налог

Единый trait транспорта (наш аналог связки Dialer + Connector, терминология своя) плюс реестр модулей. Транспорт поднимает несущий канал — легитимную с виду сессию — и отдаёт протоколу дуплексный поток байт с контрактом: первый бёрст неотличим от начала настоящей сессии несущего. Форма — за транспортом, содержимое — за протоколом.

T1HTTPS-к-сайту основной, объём

HTTP/2-подобный фрейминг с мультиплексом потоков поверх своего TLS к настоящему сайту за nginx на ноде. Неотличим от массового HTTPS/443, который доминирует по объёму (~84% трафика). Первый транспорт первого прохода, несёт основной объём.

T2RTP / SIP-мимикрия collateral

Мимикрия под RTP и SIP на абонентском тракте — несущие реально ходят на last mile, отсечение дорого цензору по сопутствующему ущербу. Управляющий или деградированный объём, не основной.

T3UDP-мимикрия по операторам

UDP под конкретный разрешённый протокол. Годность зависит от эмпирики по операторам и радиодоступу: UDP на мобильных гасят по непохожести, QUIC цензурится по SNI. Включается там, где UDP проходит.

T5DNS-канал резерв

Узкий канал через белые резолверы — резерв под whitelist и шатдаун, заведомо низкая ёмкость. Последняя надежда для управления и обновления профиля, когда живёт лишь DNS к белым IP.

T4 · медиа-паразит WebRTC
Свой WebRTC-стек на Rust (не headless-браузер): клиент прячет поток внутри НАСТОЯЩЕЙ сессии разрешённого медиасервиса. Приоритет — TURN-релей (не терминирует медиа, видит только opaque ChannelData); запасное — SFU через SCTP DataChannel, а под троттлингом — в опубликованном VP8-видеотреке (форма под кодек: RTP-заголовок, тайминги, GOP). Ёмкость 5–6 Мбит/с на поток покрывает деградированный объём. Своё AEAD поверх: несущий видит шумный поток, не нагрузку. Граница: ОРИ терминирует медиа и видит расшифрованное, поэтому это узкий деградированный канал и ВРЕМЕННОЕ окно — работает по темпу (эфемерные ротируемые сессии, блокировка приходит в уже закрытую), а не по стойкости.
Серверная развилка E3 [ОТКРЫТО]. Несущий T1 — настоящий сайт за nginx или Reality-подобная подстановка донора — не закрыта: на нодах владельца сайты за TLS сейчас не работают, причину (маршрут, firewall, гео к CDN) надо диагностировать до выбора ветки.
05 · Свой TLS

Точная копия отпечатка, целиком свой стек

Полностью собственный стек TLS — свой парсер и сериализатор записей и сообщений рукопожатия, НЕ поверх rustls. Мотив: цензор блокирует не отпечаток Chrome, а его неточную копию от существующих инструментов; выживает только точная копия. Надстройка над готовой библиотекой позволяет влиять на ClientHello, но не на всё поведение — повторные соединения, серверную сторону, тайминги и размеры записей. Нам нужно целиком.

ClientHello

Сериализованные байты сверяются с эталонным браузером байт-в-байт, а не на глаз. Тестовые векторы — часть приёмки стека.

ALPS

application_settings на повторных соединениях реальный Chrome ведёт иначе, чем имитации. Именно здесь имитацию и ловят.

MLKEM key_share

X25519MLKEM768 в key_share — пост-квантовый гибрид, как у современного Chrome. Его отсутствие выдаёт устаревшую копию.

GREASE

Корректные значения и размещение GREASE как у эталонного браузера, плюс расширение trust_anchors.

NewSessionTicket

Post-handshake NST на серверной стороне и правдоподобное поведение возобновления сессии — не только первый хендшейк.

Resumption

Поведение возобновления — часть отпечатка: реальный клиент отличается от имитаций именно на втором соединении.

Отпечатки — данные профиля
Отпечаток (байты ClientHello, поведение возобновления, серверные NST) — загружаемые данные подписанного профиля, а не код. Переключение и пополнение набора — сменой поля профиля без релиза клиента.
Распределение по популяции
Не один слепок на всех, а распределение по ОС, версии и каналу: кластер одинаковых ClientHello с подозрительных префиксов сам по себе признак. Клиент подставляет отпечаток, правдоподобный для своей среды.
Смена отпечатка — плановая
Отпечаток НЕ меняется в ответ на сбой: у лимитера рукопожатий смена под заморозкой продлевает её (120 -> 600 с). Смена — управляемое обновление, не реактивное восстановление.
Своей крипто-математики нет. Примитивы (X25519, ML-KEM, симметрика, HKDF) берутся из pandora-crypto — обёрток над проверенными реализациями; pandora-tls реализует форматы и конечный автомат, но не сам алгоритм. Свой стек дорог и рискован (тайминги, размеры записей, обработка ошибок — поверхность атаки), поэтому нужны аудит и векторы.
06 · Внутренний протокол

Один e2e-слой, без вложенного TLS

Сквозной шифрованный канал клиент–нода, замешанный в первые кадры несущего транспорта. Второго рукопожатия нет: вложенный TLS-хендшейк детектируется по размерам и направлениям первых бёрстов. Несущий TLS считаем скомпрометированным — конфиденциальность и аутентификация лежат на этом слое, а не на несущем.

Р1Рукопожатие 1-RTT (Noise IK-стиль)

Нода имеет статический X25519-ключ из профиля; клиент знает его заранее и в первом сообщении доказывает владение своим статическим ключом. Незнакомцу нода отвечает как настоящий сайт несущего (anti-probing). 0-RTT сознательно отвергнут — риск повтора.

Р2Нет вложенного TLS

Первое сообщение клиента распылено по первым кадрам несущего: аутентификатор и эфемерный ключ по полям, не отдельным бёрстом. Размеры и направления повторяют начало легитимной сессии несущего (для T1 — вид начала H2).

Р3AEAD + счётчиковый nonce

ChaCha20-Poly1305, счётчиковый nonce на направление (не случайный — не повторяется по построению), скользящее окно антиреплея. Ключи направлений выведены HKDF-SHA256 из общего секрета.

Р4Мультиплекс

Один туннель несёт N логических потоков (веб-соединения, DNS, медиа). Кадр = {поток, тип, длина, полезное}. Мультиплекс в 1–2 несущих соединения под общим лимитером — мало рукопожатий, профиль браузера.

Р5Компрессия заголовков

В начале потока заявляется его профиль (5-tuple, тип, для медиа — параметры RTP/кодека); дальше идёт только изменяющаяся часть, статические заголовки сняты и восстанавливаются из состояния сессии. Дельта-кодирование по образцу ROHC и HPACK. На голосе заголовки до RTP бывают до 50% пакета — отсюда экономия.

Р6Ре-кей и отзыв

Ре-кей по времени (час) и объёму (гигабайт) без разрыва потоков: новая эпоха подключей от того же секрета, старый ключ гасится после подтверждения. Отзыв клиента — снятие его статического ключа из реестра ноды, без ротации у всех.

[ОТКРЫТО] G1 — модель соединений. Держать 1–2 долгих mux-соединения и полагаться на их TCP (проще, но упор в объёмный лимит на соединение там, где он есть) либо свой слой переупорядочивания и повтора поверх пула коротких несущих соединений (сложнее, переживает отвал и обходит лимит 16–20 КБ) — решение ждёт. Цена компрессии заголовков (Р5) — состояние на поток на обоих концах: потеря состояния означает ресинхронизацию потока.
07 · Режимы и профиль

Blacklist, whitelist и подписанный профиль

Детектор режима — сам клиент: при белых списках до панели не достучаться. Он распознаёт blacklist / whitelist / шатдаун по пассивным и лёгким активным признакам (падение всего, кроме белых IP; гашение внешнего DNS и QUIC) и переключает набор доступных выходов и фронт, не роняя живые потоки без нужды.

Режим blacklist основной объём

Обычное состояние сети. Основной объём идёт транспортами основного объёма (T1 и т.д.); давление на цензора — ассортиментом непохожих обличий. Раздувание проверок толкает его в whitelist, дорогой для государства.

Режим whitelist деградированный

В 64–77 регионах по расписанию. Фронт — медиа-паразит внутри разрешённых сервисов; несёт не только сигналинг, но и ДЕГРАДИРОВАННЫЙ объём (узкий канал, просевшее качество). UI показывает уведомление о белых списках. Временное окно.

Профиль — данные, не код
Один подписанный JSON с версией: identity, nodes[], transports[], fingerprints[], routing, modes, limits, update. Ноды, обличья, отпечатки, маршруты, режимы и лимиты меняются на лету — алгоритмы в бинаре, политика в профиле. Цензор не отрубает клиента одним рубильником.
Подпись и горячее применение
Канонизированный JSON подписывается Ed25519-ключом панели; клиент проверяет подпись зашитым доверенным ключом, невалидную отвергает целиком. Профиль с большей version применяется без перезапуска ядра, живые соединения не рвутся насильно. Защита от отката: version только растёт.
Прозрачность и открытый вопрос
Пользователю профиль уходит base64, декодируется и доступен для просмотра (клиент возможно коммерческий, важно доверие). [ОТКРЫТО H1]: base64 — кодирование, не шифрование; профиль несёт адреса и открытые ключи нод. Шифровать ли поверх подписи — ждёт владельца (прозрачность против сокрытия от цензора).
Маршрутизация по типу и домену
Классификатор на первом пакете выводит три ключа — тип трафика (по форме первых байт), домен (перехват DNS, сниффинг SNI) и приложение — и выдаёт решение: группа выхода / напрямую / блок. DNS-политика согласована с маршрутом (иначе несовпадение геолокации резолвера палит). Решение привязывается к потоку по 5-tuple.
08 · Путь и приглашение

Порядок работ и приглашение к критике

Спина проекта собирается последовательно, всё остальное вешается на неё параллельно. Порядок первого кода — протокол первым; ядро на Linux с интерфейсом на одну-две кнопки, обёртки-клиенты под платформы вторым этапом.

Волна A · база и каналы

Параллельно и независимо: crypto, router, tls, profile и формат профиля. Свой TLS — самый крупный, ему больше времени. Критический путь стартует с crypto -> proto.

Волна B · транспорты

После crypto и proto: transport — T1 первым, он несёт объём; затем T2/T3/T5. media (T4) параллельно, после trait транспорта. Разные несущие — разные подзадачи, параллелятся между собой.

Волна C · менеджер

tmgr: динамическая схема транспортов, охранник соединений (лимитер под гранулярность цензора), карантин с экспоненциальной паузой, переключение фронтов по режиму сети.

Волна D · сборка

На готовых крейтах параллельно: core (входы, конвейер, C-FFI), node (серверный бинарь, anti-probing), cli (стенд). Критический путь: crypto -> proto -> transport -> tmgr -> core.

Это техническое описание, не финальная спецификация: каждая капсула — черновик, в ней помечены открытые развилки [ОТКРЫТО] (серверная сторона несущего, модель соединений, шифрование профиля, порядок ввода несущих). Мы делимся устройством заранее, чтобы услышать коллег по отрасли: где мы недооцениваем противника, что упускаем, что сделали бы иначе. Замечания и разговор ценнее согласия.

свой Rust-стек свой TLS целиком поведенческая маскировка collateral damage мультипротокольность feature-флаги / асимметрия сборки открытое ядро устойчивость к белым спискам
09 · Обратная связь

Разбор ценнее согласия

Документ — черновик с открытыми развилками, и мы правда ждём критики: где недооценили противника, что упускаем, что сделали бы иначе. Замечания, вопросы и возражения присылайте на почту проекта — отвечаем каждому.

почта проекта dev@paranoia.run