Odsłonięto szczegóły metody ataku „Continuation flood”, która dotyczy różnych implementacji protokołu HTTP/2, w tym Apache httpd, Apache Traffic Server, Node.js, oghttp, Go net/http2, Envoy, oghttp i nghttp2. Luka ta może być wykorzystywana do ataków na serwery wspierające HTTP/2.0 i w zależności od implementacji prowadzi do wyczerpania pamięci (zatrzymanie przetwarzania żądań lub awaryjne zamknięcie procesów) lub generowania wysokiego obciążenia CPU (spowolnienie przetwarzania żądań). Zdaniem badacza, który odkrył lukę, ujawniony problem jest bardziej niebezpieczny niż zeszłoroczna luka „Rapid Reset”, użyta do przeprowadzenia największych wówczas ataków DDoS.
Wysoki poziom zagrożenia wynika z faktu, że do zakłócenia działania serwera, awaryjnego zakończenia lub poważnego obniżenia wydajności wystarczy stworzenie strumienia specjalnie sformatowanych żądań z jednego zwykłego komputera. W pewnych przypadkach do przeprowadzenia ataku wystarczy nawet jedno połączenie TCP. Przy tym ruch związany z przeprowadzeniem ataku w żaden sposób nie wyróżnia się w logach na tle zwykłych żądań użytkowników.
Luka ta wynika z charakterystyki przetwarzania ramki HEADERS oraz CONTINUATION w żądaniach protokołu HTTP/2. Ramki HEADERS są używane w HTTP/2 do przesyłania nagłówków HTTP, a ramki CONTINUATION do dzielenia wysyłania nagłówków HTTP na kilka etapów (na przykład, gdy nagłówki nie mieszczą się w jednej ramce lub gdy na początku należy wysłać nagłówki, które można wypełnić na bieżącym etapie, a następnie do przesłać nagłówki, których wartości na razie nie można określić). Podczas przesyłania nagłówków w kilku etapach najpierw wysyłana jest ramka HEADERS bez flagi END_HEADERS, za którą podąża kilka ramek CONTINUATION z dodatkowymi nagłówkami, a listę zamyka ramka CONTINUATION z flagą END_HEADERS.
Metoda ataku polega na wysyłaniu nieprzerwanych strumieni ramek CONTINUATION bez ustalania flagi END_HEADERS. Taka aktywność prowadzi do przesyłania na serwer dużej liczby nagłówków, które serwer przechowuje w pamięci podręcznej, dopóki dostępna pamięć procesu nie zostanie wyczerpana. Aby wygenerować dużą obciążenie CPU, oprócz wyczerpywania pamięci, atakujący może wykorzystać kompresję zawartości ramki CONTINUATION za pomocą formatu HPACK, którego analiza wymaga obliczeń. W implementacjach protokołu HTTP/1.1 w celu ochrony przed zalaniami serwera nagłówkami wprowadzono limit rozmiaru nagłówków oraz timeout dla czasu wysyłania połączenia. Dla HTTP/2, z uwagi na złożoność protokołu, wiele realizacji nie przewidziało podobnych metod obrony przed niekończącą się wysyłką nagłówków.
Największe zagrożenie ta luka stanowi dla użytkowników Node.js (CVE-2024-27983), ponieważ ta implementacja umożliwia spowodowanie awarii przez wysłanie zaledwie kilku ramek do serwera. Z powodu stanu wyścigu w Node.js, aby wywołać awaryjne zakończenie poprzez aktywację sprawdzenia Assert, wystarczy zakończyć połączenia w trakcie wysyłania niekompletnego strumienia nagłówków (awaria, gdy podczas zamykania połączeń jeszcze nie nadeszła ramka CONTINUATION z flagą END_HEADERS). Luka została usunięta w Node.js 18.20.1, 21.7.2 oraz 20.12.1, a także w najnowszych wydaniach bibliotek llhttp i undici. W nowych wersjach Node.js usunięto także mniej poważną lukę (CVE-2024-27982) klasy „request smuggling”, która umożliwia poprzez manipulację wartością „Content Length” wklejenie się w zawartość zapytań innych użytkowników przetwarzanych w tym samym strumieniu pomiędzy frontendem a backendem.
Luki związane z obsługą CONTINUATION w innych implementacjach HTTP/2.0:
- oghttp (CVE-2024-27919) — nieograniczone zużycie pamięci.
- Tempesta FW (CVE-2024-2758) — obejście ograniczeń.
- Biblioteka PHP amphp/http, amphp/http-client i amphp/http-server (CVE-2024-2653) — nieograniczone zużycie pamięci, mogące prowadzić do całkowitego wyczerpania dostępnej pamięci.
- Pakiet Go net/http (CVE-2023-45288) — generowanie dużego obciążenia CPU.
- Biblioteka nghttp2 (CVE-2024-28182) — wywołanie odmowy usługi.
- Apache Httpd (CVE-2024-27316) — nadmierne zużycie pamięci i generowanie obciążenia CPU.
- Apache Traffic Server (CVE-2024-31309) — nadmierne zużycie zasobów.
- Envoy (CVE-2024-30255) — generowanie dużego obciążenia CPU (do pełnego obciążenia jednego rdzenia CPU potrzebny jest strumień o prędkości 300 Mbit/s).
Źródło: opennet.ru
