Специалист компании FoxIO обнаружил критические ошибки в семи популярных реализациях протокола HTTP/3, позволяющие удаленному клиенту перегрузить сервер без авторизации и использования огромных объемов трафика. В ходе проверки десяти реализаций выяснилось, что небольшой сжатый запрос в памяти способен разрастись в десятки, сотни и даже тысячи раз. Проблема кроется в механизме QPACK, отвечающем за сжатие заголовков HTTP/3, где клиент может отправлять короткие ссылки на записи в таблице, а сервер восстанавливает полные значения, тратя ресурсы. Исследователь назвал эту технику Header Accordions. В одном из сценариев атакующий набивал блок множеством коротких заголовков, превращая 1 МБ сжатых данных примерно в 160 тысяч полей. В другом варианте клиент помещал в динамическую таблицу запись размером около 4 КБ, а затем обращался к ней однобайтовыми ссылками, заставляя сервер каждый раз восстанавливать полную запись и тратить память. Для некоторых реализаций один переданный байт заставлял выделять около 4 КБ, что дает усиление нагрузки примерно в 4000 раз.
Самый тяжелый сценарий был воспроизведен на платформе Bun, где около 5,8 МБ входящего трафика хватило, чтобы исчерпать 2 ГБ памяти контейнера. Отдельная ошибка в коде управления буфером позволяла добиться другого эффекта: примерно 516 КБ данных загружали процессор на 100%, после чего сервер переставал принимать новые запросы и самостоятельно не восстанавливался. Уязвимые участки были найдены в библиотеках quic-go, Cloudflare quiche, lsquic, aioquic с mitmproxy, h3 и Wireshark. Причины различались: quic-go ограничивал размер сжатого блока, но не проверял итоговый объем заголовков; Cloudflare quiche неправильно учитывал размер полей и мог заранее выделить слишком много памяти; библиотека h3 позволяла набрать столько заголовков, что программа аварийно завершала обработку. В тестах системы IIS, Envoy и связка ngtcp2/nghttp3 выдержали подготовленные запросы.
Часть разработчиков закрыла ошибки еще до публикации подробностей. Исправления вошли в версии quic-go 0.57.0, Cloudflare quiche 0.29.3, lsquic 4.9.0, Wireshark 4.6.2 и 4.4.12. Для проблем в quic-go, quiche и Wireshark зарегистрированы CVE-2025-64702, CVE-2026-12523 и CVE-2025-13945. Платформа Bun на момент разбора оставалась уязвимой, но разработчики позже выпустили исправление в версии 1.4.4, ограничив суммарный размер распакованных заголовков и число полей. Уязвимы версии Bun от 1.3.14 до 1.4.3 включительно, при этом проблема не затрагивает HTTP/1.1 и HTTP/2. Header Accordions особенно опасна из-за разницы в затратах двух сторон: клиент отправляет компактные ссылки, а сервер тратит память и процессорное время на восстановление и хранение гораздо большего объема данных. Поэтому для атаки не нужен ботнет или поток в сотни гигабит в секунду: при уязвимой реализации один клиент способен создать нагрузку, несопоставимую с объемом отправленного трафика.