CVE-2026-18540
NiskieCVSS 3.7Prawdopodobieństwo exploitacji (EPSS)
Niskie ryzykoPercentyl 15 - wyżej niż 15% wszystkich znanych CVE
Streszczenie
W bibliotece undici przed wersją 6.28.1, od 7.0.0 do 7.29.1 oraz od 8.0.0 do 8.10.2, interceptor ponawiania może dołączyć ciało odpowiedzi z ponowionego żądania zakresowego do już dostarczonych bajtów z wcześniejszej częściowej odpowiedzi, jednocześnie prezentując oryginalny status i nagłówki. Może to spowodować, że ciało odpowiedzi będzie dłuższe niż Content-Length obserwowane przez aplikację. Aplikacja przekazująca taką odpowiedź do klienta HTTP/1.1 bez normalizacji ramki może wysłać ciało przekraczające przekazany Content-Length, a nadmiarowe bajty mogą być interpretowane jako początek kolejnej odpowiedzi, co umożliwia rozdzielenie odpowiedzi lub desynchronizację.
Ocena ryzyka
Ryzyko jest wysokie w środowiskach, gdzie aplikacja przekazuje odpowiedzi do klientów HTTP/1.1 i jest podatna na ataki typu response splitting. Atakujący kontrolujący serwer źródłowy może wykorzystać tę podatność do manipulowania odpowiedziami.
Rekomendacja
Zaleca się aktualizację undici do wersji 6.28.1, 7.29.1 lub 8.10.2. Należy również rozważyć normalizację ramek odpowiedzi w aplikacjach przekazujących dalej.
Inne podatności w undici
Zobacz wszystkie- CVE-2026-84890Średnie
Interceptor dekompresji w undici dekompresuje ciała odpowiedzi zgodnie z niezaufanym nagłówkiem Content-Encoding. Liczba warstw kodowania jest ograniczona, ale całkowity rozmiar zdekompresowanego wyjścia jest nieograniczony i nie ma opcji konfiguracji, aby go ograniczyć. Złośliwy lub wadliwy serwer może zwrócić mały skompresowany ładunek (bombę kompresyjną), który rozwija się do setek megabajtów lub więcej w pamięci klienta, co prowadzi do asymetrycznego zużycia zasobów, mogącego wyczerpać pamięć i spowodować awarię procesu. Dotyczy to wersji undici od 7.15.0 do 7.29.1 oraz od 8.0.0 do 8.10.2. Użytkownicy powinni zaktualizować do undici 7.29.1 lub 8.10.2.
- CVE-2026-19534Wysokie
Klient WebSocket w undici powoduje awarię całego procesu Node.js podczas uzgadniania połączenia, gdy serwer odpowiada subprotokołem, którego klient nie żądał. Dereferencja wartości null prowadzi do nieprzechwyconego wyjątku TypeError, który kończy proces.
- CVE-2026-18149Średnie
W bibliotece undici w wersjach od 7.11.0 do 7.29.1 oraz od 8.0.0 do 8.10.2, mechanizm ponawiania (retry handler) może pozostawić już wystawione ciało odpowiedzi w stanie oczekiwania na zawsze. Gdy serwer zwraca odpowiedź z Content-Length, wysyła tylko część ciała i zamyka połączenie, retry handler ponawia żądanie. Jeśli ponowienie zwróci status niepodlegający ponowieniu (np. 400), handler przekazuje nową odpowiedź, ale oryginalne ciało odpowiedzi nie jest kończone ani niszczone, co powoduje, że odczyty tego ciała nigdy nie są kończone, a limit czasu nie działa.
- CVE-2026-85152Wysokie
undici 8.10.0 pomija pochodzenie miejsca docelowego w kluczach pamięci podręcznej i deduplikacji żądań, gdy interceptor cache lub deduplicate jest komponowany bezpośrednio na Client lub Pool. Ponieważ wewnętrzny klucz pamięci podręcznej używa pustego ciągu jako pochodzenia, odpowiedź z jednego pochodzenia może być zwrócona dla żądania do innego zaufanego pochodzenia, co umożliwia ujawnienie informacji między pochodzeniami i trwałe zatrucie pamięci podręcznej. Podatność dotyczy wersji od 8.10.0 do 8.10.2; aplikacje używające Agent nie są dotknięte.
- CVE-2026-85024Średnie
undici zawiera klienta WebSocket, którego mechanizm czyszczenia limitu rozmiaru permessage-deflate usuwa wszystkie nasłuchiwacze z wewnętrznego strumienia inflate zlib, w tym nasłuchiwacz błędów, podczas gdy strumień ten może nadal emitować zdarzenia. Gdy zdalny peer wyśle skompresowany pakiet przekraczający wbudowany limit 128 MiB zdekompresowanych danych i zawierający nieprawidłowy bajt DEFLATE, strumień inflate emituje błąd danych bez podłączonego nasłuchiwacza, co Node.js traktuje jako śmiertelny nieobsłużony błąd i kończy cały proces. Eksploatacja jest zdalna i nieuwierzytelniona, nie wymaga błędu aplikacji i jest asymetryczna, ponieważ około 130 KB na łączu może przekroczyć limit i spowodować awarię procesu.
- CVE-2026-85014Średnie
Eksperymentalny klient WebSocketStream w undici powoduje awarię całego procesu Node.js, gdy zdalny peer zamyka połączenie TCP bez przeprowadzenia uzgadniania zamknięcia WebSocket. Przy nieczystym zamknięciu wewnętrzny handler zamykania gniazda wywołuje metodę abort na strumieniu zapisywalnym bezwarunkowo i ignoruje zwróconą obietnicę, ale zgodnie ze standardem WHATWG Streams przerwanie zablokowanego strumienia zapisywalnego zwraca obietnicę, która odrzuca z błędem TypeError. Ponieważ aplikacja trzyma zapis na tym strumieniu, co jest jedynym sposobem zapisu, odrzucenie nigdy nie jest obserwowane, a domyślne zachowanie Node dla nieobsłużonych odrzuceń kończy proces. Niezaufany serwer może więc wywołać awarię klienta pojedynczym nagłym rozłączeniem, bez uwierzytelnienia i bez błędu aplikacji. Dotyczy to wersji undici od 7.0.0 do 7.29.1 oraz od 8.0.0 do 8.10.2. Użytkownicy powinni zaktualizować undici do wersji 7.29.1 lub 8.10.2.
- CVE-2026-85008Niskie
Interceptor pamięci podręcznej undici dokumentuje, że buforowane są tylko bezpieczne metody HTTP, ale logika pomijania buforowania jest zbudowana przez odjęcie skonfigurowanych metod od zbioru bezpiecznych metod, więc niebezpieczna metoda, taka jak POST, PUT lub DELETE, nigdy nie jest umieszczana na liście pomijania i zamiast tego przechodzi przez pełną ścieżkę odczytu pamięci podręcznej. Brama przechowywania odpowiedzi również nie sprawdzała metody, więc odpowiedź na niebezpieczne żądanie, która jest heurystycznie buforowalna lub zawiera jawne dyrektywy Cache-Control, jest przechowywana i później odtwarzana z pamięci podręcznej. Ponieważ nagłówki odpowiedzi z zdalnego pochodzenia są niezaufane, pochodzenie może raz odpowiedzieć z buforowalnym statusem, a następnie kolejne żądania zmieniające stan klienta do tej ścieżki będą obsługiwane z nieaktualnej pamięci podręcznej bez dotarcia do pochodzenia, co jest naruszeniem integralności występującym przy domyślnej konfiguracji interceptorów. Dotyczy to wersji undici od 7.0.0 do 7.29.1 oraz od 8.0.0 do 8.10.2. Użytkownicy powinni zaktualizować do undici 7.29.1 lub 8.10.2.
- CVE-2026-84961Wysokie
Konstruktor BalancedPool w undici przekazuje cały obiekt opcji przez wewnętrzne głębokie klonowanie, które serializuje i ponownie parsuje wartość jako JSON. Ponieważ JSON nie może reprezentować funkcji, wszelkie opcje TLS o wartości funkcyjnej, takie jak dostarczone przez wywołującego wywołanie zwrotne checkServerIdentity lub niestandardowy konektor w opcji connect, są po cichu odrzucane, zanim dotrą do warstwy TLS. W rezultacie peer, którego certyfikat miał być odrzucony przez niestandardowy checkServerIdentity aplikacji, ale który nadal przechodzi domyślne sprawdzenia nazwy hosta i łańcucha Node, jest akceptowany, gdy jest osiągany przez BalancedPool. Dyspozytorzy Client, Pool i Agent nie są dotknięci, ponieważ wyodrębniają opcje connect i tls przed klonowaniem. Dotyczy to wersji undici od 7.24.1 do 7.29.1 oraz od 8.0.0 do 8.10.2, i tylko wtedy, gdy aplikacja dostarcza opcję connect lub tls o wartości funkcyjnej do BalancedPool.
- CVE-2026-84947Niskie
Interceptor dump w bibliotece undici nieprawidłowo obsługuje odpowiedzi chunked bez nagłówka Content-Length, gdy rozmiar ciała przekracza maksymalny limit. Zamiast przerwać lub wstrzymać żądanie, sygnalizuje wcześniejsze zakończenie, co prowadzi do podwójnego sygnału zakończenia i wyzwala asercję wewnętrzną, przerywając połączenie. Aplikacja widzi mylący status sukcesu z pustym lub obciętym ciałem, podczas gdy połączenie jest już zerwane.
- CVE-2026-84933Średnie
Interceptor pamięci podręcznej w undici nie obsługuje nagłówka odpowiedzi Set-Cookie w żadnym miejscu swojej ścieżki pamięci podręcznej, więc nie odmawia przechowywania ani nie usuwa tego nagłówka. W trybie współdzielonej pamięci podręcznej, który jest domyślny, odpowiedź, która w przeciwnym razie mogłaby być buforowana i zawiera nagłówek Set-Cookie, na przykład oznaczony dyrektywami public i max-age, jest przechowywana, a następnie ponownie serwowana późniejszemu wywołującemu, który pasuje do tego samego klucza pamięci podręcznej. W rezultacie ciasteczko jednego wywołującego jest ujawniane innemu wywołującemu, a niezaufany serwer może wstrzykiwać ciasteczka do buforowanych odpowiedzi serwowanych wszystkim kolejnym wywołującym. Narusza to wymóg, że współdzielona pamięć podręczna nie może przechowywać ciasteczek. Dotyczy to wersji undici od 7.0.0 do 7.29.1 oraz od 8.0.0 do 8.10.2. Użytkownicy powinni zaktualizować undici do wersji 7.29.1 lub 8.10.2.
Oryginalny opis (angielski, źródło NVD)
undici's retry interceptor can append the body of a ranged retry response to bytes already delivered from an earlier partial response while still presenting the original response's status and headers. This happens when an upstream server delivers part of a body without a trustworthy resume checkpoint, for example a non-success response whose headers were already sent or a partial-content response with an unusable content range, then closes the connection and answers the resumed range request with more bytes. As a result the response body can be longer than the Content-Length that the application observes. An application that relays such a response to a downstream HTTP/1.1 peer without normalizing the framing can emit a body that exceeds the forwarded Content-Length, and the excess bytes can be interpreted as the start of a following response, which enables downstream response splitting or desynchronization. Exploitation requires an attacker-controlled upstream server and an application that forwards the response through a framing-sensitive path. This affects undici versions before 6.28.1, from 7.0.0 up to 7.29.1, and from 8.0.0 up to 8.10.2. Users should upgrade to undici 6.28.1, 7.29.1, or 8.10.2.
Dane podatności pochodzą z NVD (NIST) · CISA KEV · EPSS

