Article
Na samym początku zastosuję pewną metaforę która pomoże w wizualizacji luki
CVE-2024-27983.
Otóż wyobraź sobie serwer Node.js jako restaurację w której kelnerzy ( procesy HTTP/2 ) obsługują stoliki ( połączenia ) i przyjmują zamówienia ( żądania HTTP ). Kuchnia w tej restauracji ( silnik HTTP/2 ) przygotowuje jedzenie ( odpowiedzi HTTP ).
W tej restauracji ktoś podszywa się pod kelnera i wpuszcza do kuchni fałszywe zamówienia. Zamiast dań, które zamawiają klienci, kuchnia przygotowuje potrawy, których nikt nie chce. To przynosi straty.
Kontynuując tę metaforę, wyobraź sobie że kelnerzy w tej restauracji porozumiewają się za pomocą karteczek ( nagłówki HTTP ). Atakujący może spreparować karteczkę z fałszywym numerem stolika np.
Karteczka poprawna: Stolik nr.1, zupa pomidorowa
Karteczka spreparowana: Stolik nr.100, spaghetti
W efekcie kelner z karteczką szuka stolika nr. 100, który nie istnieje a przygotowana potrawa nie zostaje dostarczona do żadnego stolika.
Innym przykładem zamieszania w restauracji może być dostarczanie jedzenia do losowych klientów. Atak spowoduje okoliczność w której niektórzy zamawiający nie dostaną nic, bo ich potrawa trafiła do innego stolika.
Czym w rzeczywistości może być taka "spreparowana karteczka"?
Może to obejmować takie działania jak:
utworzenie nagłówka HTTP z nietypowymi polami lub wartościami, np. z nadmierną długością wartości co spowoduje przepełnienie bufora,
przygotowanie danych zawierających ciągi binarne lub tekstowe z wykorzystaniem sekwencji znaków trudnych do przetworzenia
nadużywanie funkcji protokołu czego przykładem jest manipulacja ustawieniami strumieni HTTP/2 w taki sposób aby zmusić serwer do rezerwacji zasobów na obsługę złośliwie skonstruowanych żądań, co z kolei może prowadzić do wyczerpania się zasobów.
Celem atakującego jest przeciążenie serwera i uniemożliwienie mu obsługi żądań użytkowników DoS ( "odmowa usługi" ), no i oczywiście kradzież danych użytkowników oraz dalsza eskalacja. Istnieje kilka rodzajów ataków DoS wykorzystujących sekwencje w HTTP/2:
atak typu "flood": wysłanie dużej liczby spreparowanych pakietów danych do serwera, aby go przeciążać,
atak typu "slowloris": wysłanie powoli spreparowanych pakietów danych do serwera, aby zużywać jego zasoby,
atak typu "amplification": wykorzystanie serwera jako pośrednika do wysyłania dużej ilości danych do innego serwera, aby go przeciążać.
Jeśli chodzi o CVE-2024-27983, problem wynika z możliwości pozostawienia pewnych danych w pamięci nghttp2 po resecie, kiedy do serwera wysłane zostaną nagłówki z ramką kontynuacji HTTP/2 ( CONTINUATION frame ), a następnie połączenie TCP zostanie gwałtownie zamknięte przez klienta. Spowodować to może wyścig, w którym destruktor Http2Session jest wywoływany podczas przetwarzania (i przechowywania w pamięci) ramek nagłówków, prowadząc do potencjalnej odmowy usługi.
REKOMENDACJE DLA CVE-2024-27983
Zaktualizuj Node.js. Sprawdź czy dany update obemuje to CVE
Zaktualizuj llhttp do wersji 9.2.1 dla Node.js wersji 18.x, 20.x oraz 21.x.
Zaktualizuj undici do wersji 6.11.1 dla Node.js w wersji 21.x i do wersji 5.28.4 dla wersji 18.x i 20.x.
LINKI:
Node blog:
Ubuntu Security:
CVE:
HTTP/2:
Bulletin nodejs-sec:

Comments