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