@angular/router: Odmowa usługi poprzez niedopasowane dopasowywanie tras outletów o pustej ścieżce w renderowaniu po stronie serwera (SSR)
Zidentyfikowano podatność na odmowę usługi (DoS) w @angular/router, gdy włączone jest renderowanie po stronie serwera (SSR) w środowisku Node.js (V8).
Podczas rozpoznawania tras @angular/router nie weryfikuje, czy pomocniczy segment outletu w adresie URL odpowiada trasie skonfigurowanej dla tej konkretnej nazwy outletu. Ponieważ nieskonfigurowane grupy outletów o pustej ścieżce (takie jak a:/(), x:/(...) lub ///(...)) nie są odrzucane podczas dopasowywania, router wielokrotnie ponownie ocenia konfigurację tras względem każdego dowolnego segmentu outletu podanego w adresie URL.
Gdy adres URL żądania zawiera wiele dowolnych segmentów outletów o pustej ścieżce, to nieprawidłowe dopasowanie zmusza router do tworzenia zduplikowanych drzew ActivatedRouteSnapshot, wielokrotnego wykonywania strażników (guards) i resolverów tras canMatch oraz alokowania osobnych kopii parametrów tras i queryParams dla każdego nieskonfigurowanego outletu.
Nieuwierzytelniony zdalny atakujący może wykorzystać to zachowanie, wysyłając żądania ze spreparowanymi segmentami outletów, aby wyczerpać stertę pamięci Node.js lub przeciążyć zasoby procesora, co prowadzi do zakończenia procesu roboczego SSR i zakłócenia działania usługi.
Wpływ
Skuteczne wykorzystanie podatności pozwala nieuwierzytelnionemu zdalnemu atakującemu na wyczerpanie sterty Node.js za pomocą pojedynczego spreparowanego żądania lub niewielkiej liczby równoczesnych żądań, co kończy proces roboczy SSR krytyczną awarią JavaScript heap out-of-memory. Gdy dopasowane trasy deklarują strażników lub resolvery canMatch, pojedyncze krótkie żądanie może również wywołać wielokrotne wykonanie strażników lub resolverów, zwiększając obciążenie usług zaplecza i przetrzymując otwarte połączenia procesów roboczych.
- Alokacja przejściowa: Pamięć jest zwalniana po zakończeniu rozpoznawania trasy; nie ma trwałego wycieku pamięci. Głównym skutkiem jest zakończenie procesu.
- Aplikacje SPA po stronie klienta nie są podatne: Klienckie aplikacje Angular działające w przeglądarce nie są podatne na zagrożenie, ponieważ zużycie pamięci przeglądarki nie przekracza granicy bezpieczeństwa.
- Prerendering (SSG) nie jest podatny: Prerenderowanie w czasie kompilacji nie przetwarza adresów URL żądań dostarczonych przez atakującego.
Warunki wstępne ataku i podatne konfiguracje
Aplikacja jest narażona tylko wtedy, gdy spełnione są wszystkie poniższe warunki:
- SSR włączone: Aplikacja renderuje się na żądanie na serwerze Node.js / V8.
- Podatna konfiguracja tras: Co najmniej jeden poziom konfiguracji tras zawiera:
- trasę o pustej ścieżce (
path: "") (np.{path: "", component: ShopPage}) lub - trasę przypisaną do nazwanego outletu (np.
{path: "dashboard", children: [{path: ":id", outlet: "detail", component: DetailPanel}]}).
- trasę o pustej ścieżce (
- Przekazywanie linii żądania upstream: Linie żądań docierają do procesu Node.js bez wcześniejszego odrzucenia przez proxy brzegowe. Node.js domyślnie akceptuje nagłówki żądań o rozmiarze do 16 KiB. Wzmocnienie strażników/resolverów wymaga jedynie krótkiego adresu URL.
- Ograniczony rozmiar sterty: Sterty procesów roboczych są odpowiednio małe w stosunku do ładunku żądania i współbieżności (np. kontenery lub instancje serverless skonfigurowane z 128 MiB–1 GiB).
Przykłady ładunków eksploitacyjnych
Względem konfiguracji z trasami o pustej ścieżce (path: "") i parametrami zapytania:
GET /shop/(a:/()//b:/()//c:/()//...)?param1=value¶m2=value... HTTP/1.1
Host: example.com
Względem konfiguracji z nazwanymi outletami lub trasami siostrzanymi:
GET /dashboard/(detail:1//x:/(detail:1//x:/(...)//y:/(...))//y:/(...)) HTTP/1.1
Host: example.com
Co trzeba zrobić
Poprawki
Problem został rozwiązany w angular/angular#71055.. Router wymaga teraz, aby każda podrzędna grupa segmentów outletu odpowiadała trasie skonfigurowanej dla docelowego outletu przed rozpakowaniem segmentów podrzędnych lub ukończeniem dopasowania, oraz uniemożliwia nieskonfigurowanym grupom outletów o pustej ścieżce dopasowywanie tras zadeklarowanych dla innych outletów.
Załatane wersje:
22.2.121.2.2520.3.33
Wersje wcześniejsze niż v20 również są podatne, ale nie są już wspierane i nie otrzymają poprawki.
Obejścia i mitygacje
Jeśli nie można natychmiast zaktualizować oprogramowania do załatanej wersji, należy zastosować co najmniej jedno z poniższych rozwiązań:
-
Odrzucanie adresów URL w nawiasach lub z pustą ścieżką outletu w middleware lub WAF (zalecane): W
@angular/routerpomocnicze grupy outletów w adresie URL zawsze używają nawiasów(...), a grupy outletów o pustej ścieżce w adresie URL zawsze przyjmują postać:/(,(/lub///(.- Jeśli aplikacja nie używa nazwanych (pomocniczych) outletów w adresach URL, odrzucaj żądania, których ścieżka zawiera
(lub), zanim Angular SSR przetworzy żądanie. - Jeśli aplikacja używa nazwanych outletów, odrzucaj żądania, których ścieżka zawiera sekwencje outletów o pustej ścieżce (
:/(,(/lub///().
W przeciwieństwie do limitów długości URL całkowicie blokuje to zarówno wyczerpanie sterty, jak i wzmocnienie strażników/resolverów za pomocą krótkich adresów URL:
ts// server.ts (placed before Angular SSR handler) app.use((req, res, next) => { let pathname: string; try { pathname = decodeURI(req.url.split(/[?#]/, 1)[0]); } catch { res.status(400).send("Bad Request"); return; } // Option A: If the app does not use named outlets in URLs, block all parenthesized groups: if (/[()]/.test(pathname)) { res.status(400).send("Bad Request"); return; } // Option B: If the app uses named outlets, block only empty-path outlet groups: if (/:\/\(|\(\//\(|\/\/\/\(/.test(pathname)) { res.status(400).send("Bad Request"); return; } next(); }); - Jeśli aplikacja nie używa nazwanych (pomocniczych) outletów w adresach URL, odrzucaj żądania, których ścieżka zawiera
-
Ograniczenie długości adresu URL na odwrotnym proxy lub w middleware: Skonfiguruj proxy brzegowe, zaporę WAF lub serwer proxy, aby odrzucać żądania ze zbyt długimi adresami URL (np. przekraczającymi 2,048 bajtów). Część ładunku dotycząca outletu znajduje się w ścieżce, dlatego należy ograniczyć cały cel żądania, a nie tylko ciąg zapytania. Zmniejsza to, lecz nie eliminuje, wzmocnienia strażników/resolverów, które wymaga jedynie krótkiego adresu URL.
-
Zwiększenie parametru Old Space w Node.js: Zwiększenie
--max-old-space-sizepodnosi wymagany rozmiar żądania i współbieżność potrzebną do wyczerpania pamięci, chociaż nie eliminuje problemu.
Czego dotyczy
Kliknij technologię, aby zobaczyć wszystkie dotyczące jej podatności.
| Platforma | Paczka | Podatne wersje | Poprawka w wersji |
|---|---|---|---|
| Paczka npm | @angular/router | >= 22.0.0, < 22.2.1, >= 21.0.0, < 21.2.25, >= 20.0.0, < 20.3.33, <= 19.2.25 | 22.2.1, 21.2.25, 20.3.33 |
Odnośniki
- https://github.com/angular/angular/security/advisories/GHSA-62vg-58rm-qff7
- https://github.com/angular/angular/issues/70997
- https://github.com/angular/angular/pull/71055
- https://github.com/angular/angular/commit/a83f8119acd466b524ae0113096ed188358d6d6c
- https://github.com/angular/angular/commit/b0d2ba0f54e21cb57ea5a0ca0d8e6065f28e23a0
- https://github.com/angular/angular/commit/b6bf6504adab1a78cc62ad8402f6bed229e620bd
- https://github.com/angular/angular/commit/e9bf52aa03a3b9b302c33ffbc967ef0e1de5fb79
- https://github.com/angular/angular
- Wektor CVSS
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N- Słabość (CWE)
CWE-400, CWE-405- Platforma
- npm
- Paczka
@angular/router- Ujawniono
- 20.10.2026
- Aktualizacja
- 20.10.2026 18:20
Źródła i licencje · Redakcja lub tłumaczenie: DockRay. Zachowano prawa źródeł i obowiązujące licencje.
OSV / GitHub Advisory Database - GHSA-62vg-58rm-qff7 - CC BY 4.0
Historia podatności: @angular/router
Wszystkie opisane podatności tej paczki (Paczka npm), od najnowszej. Widać, czy to jednorazowa wpadka, czy paczka, której trzeba pilnować.
- Wszystkich wpisów
- 2
- Pierwsza → ostatnia
- 09.2026 10.2026
- Bez poprawki
- 0
- Wykorzystywana w atakach
- 0
Rozkład istotności
- Wysoka 2
Ujawnienia w latach
- 2026: 2
-
@angular/router: Odmowa usługi poprzez niedopasowane dopasowywanie tras outletów o pustej ścieżce w renderowaniu po stronie serwera (SSR) ten wpis
Dowiedz się, które podatności dotyczą Twojej aplikacji
Po podłączeniu integracji DockRay i włączeniu raportowania oprogramowania DockRay porównuje zgłoszone wersje komponentów ze znanymi podatnościami i powiadamia o potwierdzonych dopasowaniach. Zakres zależy od obsługiwanej technologii i dostępnych biuletynów.