Ошибки QPACK в HTTP/3 позволяют удалённо исчерпать память сервера

Исследователи FoxIO выявили ошибки обработки QPACK в семи из десяти протестированных стеков HTTP/3. Неаутентифицированный атакующий может одной сессией передать небольшой объём сжатых заголовков, который после распаковки занимает значительно больше памяти и способен остановить сервер. FoxIO зафиксировала усиление до 4 000 раз в Bun.
Проблема относится к отказу в обслуживании: в статье не приводятся признаки кражи данных или выполнения кода, а также нет сообщений об атаках в реальной среде. Патчи уже выпущены для quic-go, Cloudflare quiche, lsquic и Wireshark; Bun, библиотека h3 для Rust и aioquic на момент раскрытия оставались без исправлений.
Как возникает переполнение памяти
QPACK — механизм HTTP/3 для сжатия заголовков запросов. Повторяющиеся поля передаются короткими ссылками вместо полного текста. Корректная реализация должна ограничивать размер заголовков после распаковки, однако затронутые компоненты проверяли только объём сжатого блока либо применяли лимит слишком поздно.
В результате один запрос может развернуться в сотни тысяч полей, которые сервер удерживает в памяти. В тестах FoxIO сжатый блок размером 1 МБ в quic-go превращался примерно в 160 тысяч полей и занимал около 15 МБ памяти. Консультативное сообщение quic-go допускает расширение приблизительно в 50 раз.
Наиболее тяжёлый сценарий для Bun
Другой вариант атаки использует запись заголовка размером около 4 КБ и тысячи однобайтных ссылок на неё. Сервер заново восстанавливает полное значение для каждой ссылки. FoxIO измерила усиление примерно в 4 000 раз в Bun и от 600 до 1 800 раз в lsquic.
HTTP/3-сервер Bun использует lsquic, но заменяет механизм ограничения памяти собственной логикой. Она проверяет отдельные заголовки, не учитывая их суммарный размер. После превышения 2 ГБ счётчик размера переполняется и обнуляется; по данным FoxIO, поток примерно в 516 КБ способен загрузить сервер на 100% CPU и не дать ему восстановиться. В lsquic собственный лимит в 64 КБ не позволяет достичь этого состояния.
Затронутые продукты и действия операторов
FoxIO рекомендует обновить quic-go до версии 0.57.0, Cloudflare quiche — до 0.29.3, lsquic — до 4.9.0, а Wireshark — до 4.6.2 или 4.4.12. quic-go используется в Caddy, Traefik и cloudflared, а lsquic лежит в основе LiteSpeed Web Server и OpenLiteSpeed. Исправление lsquic ограничивает число распакованных наборов заголовков на поток одним по умолчанию.
Для продуктов без патча предложены временные меры: не публиковать HTTP/3-сервер Bun, в mitmproxy отключить HTTP/3 параметром --set http3=false, а в h3 задать разумный max_field_section_size. IIS, Envoy, ngtcp2/nghttp3 и Google quiche FoxIO не относит к затронутым, поскольку они ограничивают распакованные заголовки непосредственно при декодировании.
Wireshark рассматривается отдельно: уязвимость приводит к падению анализатора HTTP/3 при расшифровке трафика через файл ключей или открытии захвата с секретами, а не атакует сетевой сервер напрямую. Для бизнеса практический шаг — инвентаризировать включённые HTTP/3-компоненты, установить доступные обновления и временно ограничить протокол в стеках без исправлений.

