obfuscated2
Обфускация транспорта MTProto
Режим, в котором поток выглядит как случайные байты, но начало соединения и ритм пакетов остаются узнаваемыми.
Зачем нужна
Без обфускации MTProto-соединение начинается с короткого заголовка, по которому его легко узнать. Обфускация шифрует весь поток поверх транспорта, так что открытых признаков протокола не остаётся. В документации Telegram механизм назван «transport obfuscation», а в разговорах о прокси его обычно зовут obfuscated2. По той же документации, он обязателен для транспорта WebSocket и применяется, чтобы обходить блокировки провайдеров.
Как устроен начальный пакет
Клиент отправляет случайные 64 байта. К ним есть ограничения, чтобы они не совпали с заголовками других протоколов: первый байт не может быть 0xef, первые четыре байта не могут быть 0xdddddddd, 0xeeeeeeee или началом HTTP-запроса (POST, GET, HEAD). По смещению 56 лежит идентификатор транспорта, а у прокси по смещению 60 — номер дата-центра.
Из этих же 64 байт выводят ключи шифрования: байты 8–40 — ключ, байты 40–56 — вектор инициализации, а для обратного направления берут те же поля из перевёрнутого пакета. Дальше поток шифруют алгоритмом AES-256 в режиме CTR; состояние шифра сохраняется на всё время соединения.
Роль секрета
Для прокси каждый ключ дополнительно хешируют вместе с секретом: SHA256(ключ + секрет). Поэтому прокси принимает только тех, кто знает секрет, а сам секрет по сети не передаётся.
Что скрывает, а что нет
Обфускация закрывает содержимое потока и признаки протокола в первых байтах. Остальное остаётся видимым:
- IP-адрес и порт сервера прокси;
- объём трафика, размеры и ритм пакетов;
- сам факт, что установлено долгое соединение с этим адресом.
Рядом с другими режимами
Три режима отвечают на разные способы распознавания и дополняют друг друга:
- obfuscated2 — шифрует весь поток, прячет протокол в первых байтах;
- dd (padding) — добавляет от 0 до 15 случайных байт к пакетам, чтобы размеры не выдавали прокси;
- ee (FakeTLS) — начинает соединение как TLS-обмен с настоящим сайтом.
Слабое место
Обфускация прячет содержимое, но не форму соединения. Начало соединения — всегда 64 «случайных» байта, а размеры и ритм пакетов остаются прежними. Поэтому DPI-системы могут отличать такой трафик по статистике, и в разработке прокси появились padding (dd) и FakeTLS (ee).