Раскрыты сведения об методе атаки “Continuation flood”, затрагивающем различные реализации протокола HTTP/2, среди которых Apache httpd, Apache Traffic Server, Node.js, oghttp, Go net/http2, Envoy, oghttp и nghttp2. Уязвимость может использоваться для совершения атак на серверы с поддержкой HTTP/2.0 и в зависимости от реализации приводит к исчерпанию памяти (прекращение обработки запросов или аварийное завершение процессов) или созданию высокой нагрузки на CPU (замедление обработки запросов). По мнению обнаружившего уязвимость исследователя, выявленная проблема более опасна, чем найденная в прошлом году уязвимость “Rapid Reset”, использованная для совершения крупнейших на то время DDoS-атак.
Высокий уровень опасности объясняется тем, что для нарушения работы сервера, аварийного завершения или серьёзного снижения производительности достаточно создания потока специально оформленных запросов с одного обычного компьютера. В определённых случаях для осуществления атаки достаточно даже одного TCP-соединения. При этом связанных с проведением атаки трафик никак не выделяется в логах на фоне обычных запросов пользователей.
Уязвимость вызвана особенностями обработки кадров HEADERS и CONTINUATION в запросах по протоколу HTTP/2. Кадры
HEADERS используются в HTTP/2 для передачи HTTP-заголовков, а кадры CONTINUATION для разбивки отправки HTTP-заголовков на несколько стадий (например, когда заголовки не умещаются в один кадр или когда вначале следует отправить заголовки, которые можно заполнить на текущем этапе, а затем доотправить заголовки, значения которых пока невозможно определить). При передаче заголовков в несколько этапов вначале отправляется кадр HEADERS без флага END_HEADERS, за ним следует несколько кадров CONTINUATION с дополнительными заголовками и завершает список кадр CONTINUATION с флагом END_HEADERS.
Метод атаки сводится к отправке непрекращающегося потока кадров CONTINUATION без выставления флага END_HEADERS. Подобная активность приводит к передаче на сервер большого числа заголовков, которые сервер сохраняет в оперативной памяти до тех пор, пока доступная процессу память не будет исчерпана. Для создания высокой нагрузки на CPU помимо исчерпания памяти атакующий может воспользоваться сжатием содержимого кадров CONTINUATION с использованием формата HPACK, разбор которого требует вычислений. В реализациях протокола HTTP/1.1 для защиты от затопления сервера заголовками применялся лимит на размер заголовков и таймаут на время отправки соединения. Для HTTP/2 в силу усложнения протокола многие реализации не предусмотрели подобные методы защиты от бесконечной отправки заголовков.
Наибольшую опасность уязвимость представляет для пользователей Node.js (CVE-2024-27983), так как данная реализация позволяет добиться краха через отправку всего нескольких кадров на сервер. Из-за состояния гонки в Node.js для вызова аварийного завершения через срабатывание Assert-проверки достаточно завершить соединения во время отправки незавершённого потока заголовков (крах, если во время закрытия соединений ещё не поступил кадр CONTINUATION с флагом END_HEADERS). Уязвимость устранена в Node.js 18.20.1, 21.7.2 и 20.12.1, а также в свежих выпусках библиотек llhttp и undici. В новых версиях Node.js также устранена менее опасная уязвимость (CVE-2024-27982) класса “request smuggling”, позволяющая через манипуляцию со значением “Content Length” вклиниться в содержимое запросов других пользователей, обрабатываемых в том же потоке между фронтэндом и бэкендом.
Уязвимости, связанные с обработкой CONTINUATION, в других реализациях HTTP/2.0:
- oghttp (CVE-2024-27919) – неограниченное потребление памяти.
- Tempesta FW (CVE-2024-2758) – обход ограничений.
- PHP-библиотека amphp/http, amphp/http-client и amphp/http-server (CVE-2024-2653) – неограниченное потребление памяти, вплоть до полного исчерпания доступной памяти.
- Go-пакет net/http (CVE-2023-45288) – создание высокой нагрузки на CPU.
- Библиотека nghttp2 (CVE-2024-28182) – вызов отказа в обслуживании.
- Apache Httpd (CVE-2024-27316 – чрезмерное потребление памяти и создание нагрузки на CPU.
- Apache Traffic Server (CVE-2024-31309 – чрезмерное потребление ресурсов.
- Envoy (CVE-2024-30255) – создание высокой нагрузки на CPU (для полной нагрузки одного ядра CPU необходим поток в 300Mbit/s).