QUICv2 больше не проходит: перепроверил работу о QUIC-цензуре в России
kinomig 45 минут назад Краткое содержание статьи QUICv2 больше не проходит: перепроверил работу о QUIC-цензуре в России Средний 7 мин 1.2K Информационная безопасность * Сетевые технологии * Node.JS * Исследования и...
Will Anthropic have the best AI model at the end of October 2026?
В сфере искусственного интеллекта произошло заметное событие. kinomig 45 минут назад Краткое содержание статьи QUICv2 больше не проходит: перепроверил работу о QUIC-цензуре в России Средний 7 мин 1. 2K Информационная безопасность * Сетевые технологии * Node. JS * Исследования и прогнозы в IT * Аналитика Из песочницы Весной на FOCI 2026 вышла работа Heitmann, Niere, Graf Lange, Somorovsky «On Russia’s Early Introduction of QUIC SNI Censorship».
Авторы мерили в марте–апреле с трёх точек (Москва, Петербург, Новосибирск) и пришли к выводу, который сразу разошёлся по чатам:it targets only QUICv1; the standardized update QUICv2 is not censored, facilitating potential circumvention at all our vantage pointsТо есть ТСПУ разбирает только первую версию QUIC, а вторую, которая отличается от первой парой констант, пропускает. Мне стало интересно, сколько живёт такая дыра. Я написал свой измеритель и 23 сентября прогнал его с пяти российских сетей и одной белорусской.
Технические детали
Коротко: на всех пяти российских сетях QUICv2 режется так же, как v1. Но интереснее, по-моему, другое: за один день мой инструмент трижды выдал правдоподобный и неверный результат, и один раз — ровно тот, который я хотел увидеть. Почему цензор вообще видит SNI в QUICQUIC шифрует почти всё, включая хендшейк.
Но первый пакет клиента, Initial, шифруется ключами, которые выводятся из Destination Connection ID — поля, лежащего в заголовке открытым текстом (RFC 9001, §5. Секрета нет: любой на пути берёт DCID, повторяет вывод ключей, снимает защиту заголовка, расшифровывает пакет и читает из ClientHello имя сервера. Это осознанный компромисс протокола: Initial защищён от случайной порчи и от middlebox’ов, которые хотят его менять, но не от чтения.
Вывод ключей укладывается в несколько строк на node:crypto:// HKDF-Extract с солью версии, дальше HKDF-Expand-Label из TLS 1. 3 function initialKeys(ver, dcid) { const initialSecret = hkdfExtract(ver. salt, dcid); const client = hkdfExpandLabel(initialSecret, 'client in', 32); ; }hkdfExpandLabel — это HkdfLabel из RFC 8446, §7.
Отраслевые последствия
1 с префиксом tls13 и пустым контекстом, двадцать строк вокруг HMAC-SHA256. QUICv2 (RFC 9369) функционально тот же протокол. Его придумали в том числе против окостенения: чтобы middlebox’ы не привыкали к одной версии.
Отличий для Initial четыре:QUICv1QUICv2version0x000000010x6b3343cfinitial salt38762cf7…7f0a0dede3de…2ed9метки HKDFquic key / quic iv / quic hpquicv2 key / quicv2 iv / quicv2 hpтип пакета Initial0b000b01Если парсер цензора знает только первую колонку, вторая для него — мусор, и пакет проходит. Это и описали Heitmann и соавторы. Как я мерилИнструмент на Node 18+ без зависимостей: HMAC, AES-GCM, AES-ECB для защиты заголовка и UDP есть в стандартной библиотеке.
Пакет собирается руками, поэтому первым делом сверка с тестовыми векторами из приложения A RFC 9001: пока ключи и защищённый заголовок не сходятся байт в байт, мерить нечего. Хендшейк я до конца не довожу. Нужен только факт, что пакет дошёл: любой ответ сервера — Initial, Retry или Version Negotiation — это «прошёл», тишина — «дроп».
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.



