Читаю ленту, и у меня откровенно горит.

«⚡️ Telegram обошёл блокировку прокси Роскомнадзором», «Команда мессенджера закрыла уязвимость в ClientHello», «Цифровое сопротивление возвращается — разработчики выпустили фикс!»

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


Три месяца тишины

Слухи о том, что ТСПУ возьмутся за Telegram-прокси, ходили с начала 2026 года. У официальной команды было минимум три месяца, чтобы провести аудит своей реализации MTProxy. Код mtproto_tls_socket.cpp лежал в том же виде с ноября 2025 года.

Команда Телеграм ждала и 1 апреля ТСПУ дёрнули рубильник. Встроенный FakeTLS с маскировкой отвалился у большинства пользователей в России. Прокси падают, коннекты таймаутятся.

Реакция Telegram? Молчание.

Кто реально взялся за работу

Пока СМИ ждали «официального обновления», участники сообщества вокруг прокси-сервера Telemt взяли ситуацию в свои руки, надели перчатки и давай анализировать дампы.

Алгоритм диагностики был прост до гениальности:

Перехватываем TLS-хэндшейк настоящего Chrome — который ТСПУ пропускает. Перехватываем хэндшейк Telegram — который блокируется. Меняем поля пакета по одному и гоняем на живой сети. В какой момент пакеты телеги перестают блокироваться, а пакеты от браузера начинают дропаться — в том поле и сидит сигнатура.

Через сутки картина стала ясной. Нашли конкретные байты, форкнули десктопный клиент, проверили на двух провайдерах всем сообществом — заработало. Детали тестирования намеренно не раскрываю — не стоит облегчать работу тем, кто фильтры настраивает.

«Маскировка», за которую стыдно

FakeTLS — это попытка притвориться обычным HTTPS-трафиком. Чтобы DPI посмотрел на пакет и сказал: «А, это просто Васян ходит на сайт — пропускаем».

Что слал Telegram?

Ошибка 1 — несуществующий идентификатор расширения:

- S("\xfe\x02"_q);
+ S("\xfe\x0d"_q);

0xFE02 — это старый драфтовый мусор, которого нет ни в одном реальном браузере в 2026 году. 0xFE0D — стандартный IANA codepoint для Encrypted Client Hello (ECH), которое сегодня повсеместно использует, например, Cloudflare. Telegram годами слал в сеть расширение с идентификатором-призраком и называл это «маскировкой под браузер».

Ошибка 2 — математически кривой пакет:

- S("\x00\x20"_q);  // объявляем 32 байта
- R(20);            // а генерируем 20
+ R(32);            // теперь совпадает

В заголовке заявлена длина 32 байта, а код генерировал 20. Тут я выпадаю в осадок: таких пакетов в реальном TLS не существует в природе. Любой DPI-фильтр, умеющий сравнивать declared length с actual, отстреливал это за миллисекунды. И это годами называлось защитой от блокировок.

Кража лавров

Сообщество оформило находки в Pull Request #30513, подробно расписав: что менять, почему, и с результатами тестирования на живых российских сетях. PR прошёл ревью внутри сообщества ещё до того, как официальная команда его увидела. В чате tdlib несколько раз поднимали эту тему, но разрабы ТГ игнорировали вопросы.

Реакция Telegram Desktop: мейнтейнер делает коммит 407bf19 с комментарием «Fix parts of client hello generation. Inspired by wide internet discussions and #30513». Берут минимальный набор изменений из PR, сливают и на следующий день — заголовки про великую победу мессенджера над цензурой. Комьюнити в пресс-релизах не упомянули.

Ирония дня: john-preston (мейнтейнер tdesktop) сам подтвердил в треде PR, что tdlib содержит те же самые ошибки в ClientHello. Та же 0xFE02. Те же 20 байт вместо 32. Это значит, что iOS-клиент, Android-клиент и все библиотеки, написанные на tdlib, по-прежнему детектируются точно так же. Desktop получил заплатку. Остальные — ждут.

Пост от Дурова
Пост от Дурова

А потом вышел пост от самого Дурова. Про 65 млн россиян, про банковский коллапс от блокировок, про «Цифровое сопротивление» — в общем, красиво. В конце — ключевая фраза: «On our end, we'll keep adapting — making Telegram's traffic harder to detect and block».

«С нашей стороны». Мы будем адаптироваться... Мы!!

Чувак, ваша сторона не делала ровно ничего, пока комьюнити не принесло вам готовый PR с байтами, тестами и объяснением на пальцах. «Наша сторона» в этой истории — это анонимные ребята в чатах, которые разбирали hex-дампы пока вы молчали три месяца. Хотя, честно говоря, вы молчали с 2018 года!

Маркетинг — десять из десяти. Инженерный процесс — ноль из десяти.

Это всего лишь хотфикс, а не решение

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

Проблема

Серьёзность

Padding target = ровно 513 байт → фиксированная длина всего ClientHello

🔴 Критическая

ECH payload с фиксированной длиной на весь процесс жизни приложения (singleton)

🔴 Критическая

ALPS-расширение с устаревшим codepoint 0x44CD вместо 0x4469 (актуален с Chrome 115)

🟠 Высокая

Darwin-ветка (#if TD_DARWIN) несёт cipher suites из эпохи TLS 1.2, удалённые Apple в 2021

🟠 Высокая

Равномерные inter-packet timings без jitter — статистически аномальны

🟠 Высокая

Фиксированные размеры TLS-записей (1380 / 4096 / 16384) — механистично

🟡 Средняя

После handshake ALPN декларирует h2/http/1.1, а идёт сырой MTProto

🔴 Критическая (отдельный трек)

Последний пункт — отдельная история. Telegram заявляет в handshake «я HTTP/2», а затем гонит внутри TLS-туннеля голый MTProto без какого-либо HTTP-фрейминга. Для продвинутого L7-анализа это самостоятельная поведенческая сигнатура, которую не закрыть никаким JA3/JA4-шейпингом.

Современные ТСПУ работают не только по статичным байтовым паттернам. Это ML-классификация: тайминги между пакетами, распределение размеров записей, поведение потока, концентрация соединений. Бюджет системы — 84+ млрд рублей. Статический TLS-хэндшейк против такого инструмента — не решение.

Что дальше

Пока медиа праздновали, в сообществе Telemt уже проектировали фундаментальное решение — для tdlib, то есть для всех платформ сразу. С динамическими профилями браузеров (Chrome, Firefox, Safari, Edge), per-connection энтропией, шейпингом timing'ов и route-aware политикой. С нормальными тестами против реальных pcap-захватов и проверкой на трёх провайдерах, а не двумя строками diff.

Настоящее «цифровое сопротивление» — не громкие посты в Telegram-каналах от Павла. Это безымянные инженеры, которые по ночам реверсят правила DPI и пишут патчи за тех, кто получает за это зарплату и пиар.

И им огромное спасибо!


P.S. Если занимаетесь низкоуровневым C++, сетевой безопасностью или просто хотите сделать что-то реально полезное — ищите сообщество Telemt. Там есть задачи, с которыми стоит помочь.