Wysoka

@angular/router: Odmowa usługi poprzez niedopasowane dopasowywanie tras outletów o pustej ścieżce w renderowaniu po stronie serwera (SSR)

  • Ujawniono: 20.10.2026
  • Aktualizacja: 20.10.2026 18:20

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:

  1. SSR włączone: Aplikacja renderuje się na żądanie na serwerze Node.js / V8.
  2. 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}]}).
  3. 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.
  4. 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:

http
GET /shop/(a:/()//b:/()//c:/()//...)?param1=value&param2=value... HTTP/1.1
Host: example.com

Względem konfiguracji z nazwanymi outletami lub trasami siostrzanymi:

http
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.1
  • 21.2.25
  • 20.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ń:

  1. Odrzucanie adresów URL w nawiasach lub z pustą ścieżką outletu w middleware lub WAF (zalecane): W @angular/router pomocnicze 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();
    });
  2. 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.

  3. Zwiększenie parametru Old Space w Node.js: Zwiększenie --max-old-space-size podnosi 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.

PlatformaPaczkaPodatne wersjePoprawka 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

Ocena CVSS -
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

  1. 2026: 2
  1. @angular/router: Odmowa usługi poprzez niedopasowane dopasowywanie tras outletów o pustej ścieżce w renderowaniu po stronie serwera (SSR) ten wpis
    Wysoka CVE-2026-111752 >= 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
  2. Wysoka CVE-2026-101896 >= 22.0.0, < 22.2.0, >= 21.0.0, < 21.2.24, >= 20.0.0, < 20.3.32, <= 19.2.25 22.2.0, 21.2.24, 20.3.32

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.

Podłącz swoją aplikację
Newsletter DockRay

Bezpieczeństwo aplikacji w Twojej skrzynce

Najważniejsze podatności, konkretne zalecenia i praktyczne wskazówki dla Twoich aplikacji. Wybierz technologie i śledź to, co ma znaczenie dla Twojego projektu.

  • Codzienne zestawienie nowych podatności, także krytycznych.
  • Powiadomienia o ważnych aktualizacjach.
  • Praktyczne porady o bezpieczeństwie i monitoringu aplikacji.

Pozostaw puste, aby otrzymywać informacje o wszystkich technologiach.

Zapis jest bezpłatny. Wypiszesz się jednym kliknięciem w wiadomości.