Fix DPI detection: replace GREASE cipher suite in FakeTLS ServerHello#446
Conversation
|
Учитывая, что TLS_AES_128_GCM_SHA256 в целом рекомендованный и самый популярный шифр - можно просто возвращать его и не проверять то, что нам пришло от пользователя |
|
Про GREASE согласен, но почему мы выбираем этот шифр, а не что-то из списка дальше? Мне кажется правильный фикс - брать первый шифр из реальных |
ecee6e7 to
ca0f493
Compare
|
Согласен, обновил. Посмотрел подробнее — Telegram-клиенты шлют два варианта списков:
Теперь фикс в Добавил snapshot-тест с GREASE в начале списка. |
Instead of echoing the first cipher suite from ClientHello (which is often a GREASE value like 0x5a5a), iterate the list and pick the first real cipher suite. This is what real TLS servers do per RFC 8701. Production data shows two client profiles: - 87% send GREASE first, then 0x1301 (TLS_AES_128_GCM_SHA256) - 13% send 0xc02b first (TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256) The fix correctly selects 0x1301 or 0xc02b respectively, matching real server behavior. Fallback to 0x1301 if all suites are GREASE. Add snapshot test with GREASE as first cipher suite.
ca0f493 to
bec321d
Compare
|
Красота! |
Проблема
mtg эхом возвращает первый cipher suite из ClientHello клиента в ServerHello (
client_side.go:139→server_side.go:114). Telegram-клиенты (как и настоящие браузеры) ставят GREASE-значение (RFC 8701, паттерн0x?a?a) первым в списке cipher suites.Но настоящий TLS-сервер никогда не выбирает GREASE — он пропускает его и берёт первый реальный cipher suite (обычно
0x1301TLS_AES_128_GCM_SHA256 для TLS 1.3). Эхо GREASE в ServerHello — это fingerprint, которого не бывает у легитимных TLS-реализаций.DPI-системы могут проверять это поле и дропать соединения с GREASE cipher suite в ServerHello.
Диагностика
tcpdump на продакшн-сервере показал, что каждый ServerHello содержит GREASE-значение (
0x3a3a,0x5a5a,0x7a7a,0xaaaaи т.д.). При этом:После применения фикса ServerHello содержит
0x1301, и соединения, которые ранее дропались, начали работать.Изменение
Перед записью cipher suite в ServerHello проверяем, соответствует ли значение GREASE-паттерну (
value & 0x0f0f == 0x0a0a). Если да — заменяем на0x1301(TLS_AES_128_GCM_SHA256).Поле
CipherSuiteне используется нигде в логике протокола — оно чисто косметическое для FakeTLS handshake.