Атака Continuation flood, приводящая к проблемам на серверах, использующих HTTP/2.0

Раскрыты сведения об методе атаки «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).

Источник: http://www.opennet.ru/opennews/art.shtml?num=60924