Skip to main content

Angular Router CVE-2026-111752

HIGH
Uncontrolled Resource Consumption (CWE-400)
2026-10-20 https://github.com/angular/angular GHSA-62vg-58rm-qff7
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Identify Angular SSR endpoint
  2. Delivery
    Craft URL with nested empty-path outlet segments
  3. Exploit
    Router re-evaluates config per outlet
  4. Execution
    Duplicate snapshot trees exhaust V8 heap
  5. Impact
    SSR worker OOM crash and service disruption

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A06:2025 - Insecure Design
ASVS 5.0
V2 - Validation and Business Logic Resource consumption limits
MITRE ATT&CK

1 technique across 1 tactic: Impact

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

Exploitable only when ALL hold: (1) the app uses on-demand Server-Side Rendering on a Node.js/V8 server (client-side SPAs and build-time SSG prerendering are explicitly unaffected); (2) the route configuration contains at least one empty-path (path: "") route or a named-outlet route; (3) request lines reach Node without an upstream edge proxy/WAF rejecting parenthesized or empty-path outlet URL groups (Node accepts ~16 KiB headers by default); and (4) worker heaps are small enough to exhaust (e.g. 128 MiB-1 GiB containers/serverless). Limiting factors that reduce realistic risk: a WAF/middleware rejecting '(' or ')' or empty-path outlet sequences (:/( , (/( , ///( ) fully blocks it; URL-length limits reduce heap exhaustion but not short-URL guard/resolver amplification; larger --max-old-space-size raises the required payload/concurrency. No user interaction or authentication is described as required by the advisory.

Impact

This is a credible, actionable denial-of-service issue (CWE-400) rather than a high-CVSS-but-low-real-risk item, but its reach is bounded by specific deployment preconditions. No CVSS score or vector was provided in the input (CVSS: N/A), so severity signals are derived from the advisory text and my own assessment (see assessed_cvss_vector: AV:N/AC:L/PR:N/UI:N → A:H, ~7.5 High). The vendor advisory (GHSA-62vg-58rm-qff7) describes exploitation by an unauthenticated remote attacker using a single crafted request, which raises real-world concern; however, because no CVSS vector is supplied, the 'unauthenticated' characterization comes from advisory prose, not a confirmed PR:N metric. No EPSS score, no CISA KEV listing, and no explicit POC flag were provided - so there is no evidence of active exploitation or a published weaponized exploit, though the advisory itself includes illustrative crafted-URL payload examples. Impact is availability-only (process termination); there is no confidentiality or integrity loss and no persistent memory leak (allocation is transient). Net: prioritize patching for Node.js SSR deployments with the susceptible route configuration and constrained heaps, but this is not a mass-exploitation emergency absent KEV/EPSS signals.

Exploit ScenarioDerived

An attacker sends a single crafted HTTP GET to an Angular SSR endpoint with a URL containing many nested empty-path auxiliary outlet segments (e.g. /shop/(a:/()//b:/()//c:/()...)), forcing the router to repeatedly instantiate duplicate ActivatedRouteSnapshot trees and exhaust the V8 heap, crashing the SSR worker with a fatal out-of-memory error. The advisory provides example payloads but there is no confirmed standalone public exploit; against routes with canMatch guards or resolvers, even a short URL can amplify backend load. Low attack complexity: one or a small number of concurrent requests suffices.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Oct 20, 2026

Crafted auxiliary outlet URL segments force @angular/router to build duplicate ActivatedRouteSnapshot trees during route recognition, exhausting the Node.js heap and terminating the SSR worker process. Only applications using on-demand Server-Side Rendering on Node.js/V8 with an empty-path route (path: "") or a named-outlet route are exposed; client-side SPAs and build-time prerendering are explicitly unaffected, and exploitation further depends on request lines reaching Node without an edge proxy rejecting parenthesized outlet groups and on worker heaps small enough to exhaust (roughly 128 MiB to 1 GiB containers or serverless instances). A single request or a small number of concurrent requests can trigger a fatal JavaScript heap out-of-memory crash, and when matched routes declare canMatch guards or resolvers even a short URL amplifies backend load; no public exploit code was identified at time of analysis and there is no CISA KEV confirmation of active exploitation.

RemediationAI

Vendor-released patch: upgrade @angular/router to 22.2.1, 21.2.25, or 20.3.33 depending on your line, per the fix in https://github.com/angular/angular/pull/71055 (commits a83f8119acd466b524ae0113096ed188358d6d6c, b0d2ba0f54e21cb57ea5a0ca0d8e6065f28e23a0, b6bf6504adab1a78cc62ad8402f6bed229e620bd, e9bf52aa03a3b9b302c33ffbc967ef0e1de5fb79); versions 19.x and earlier are unsupported and must be moved to a patched line. If upgrading is not immediately possible, the most effective control is middleware or WAF rejection of outlet syntax placed before the Angular SSR handler: if the application does not use named outlets, reject any decoded path containing '(' or ')'; if it does use named outlets, reject only the empty-path outlet sequences :/( , (/( , and ///( - this blocks both heap exhaustion and the short-URL guard/resolver amplification, at the cost of breaking any legitimate auxiliary-outlet deep links you rely on. As a weaker secondary measure, cap the full request target (not just the query string) at roughly 2,048 bytes at the reverse proxy or WAF, which reduces but does not eliminate heap exhaustion and does nothing against short-URL amplification, and raising Node's --max-old-space-size increases the payload and concurrency required without removing the flaw. Advisory references are https://github.com/angular/angular/security/advisories/GHSA-62vg-58rm-qff7 and https://github.com/advisories/GHSA-62vg-58rm-qff7.

Affected Packages

npm @angular/router fix: 20.3.33, 21.2.25, 22.2.1

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in npm

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

The flaw lives in the route recognition stage of @angular/router (packages/router/src/recognize.ts and utils/config_matching.ts), where the matcher walks child segment groups parsed from the URL. For an auxiliary outlet such as (a:/()), the router previously failed to verify that the outlet name in the URL corresponds to a route actually configured for that outlet, so unconfigured empty-path outlet groups (a:/() , x:/(...) , ///(...) ) were accepted rather than rejected. Each accepted segment caused the recognizer to re-run configuration matching, instantiate duplicate ActivatedRouteSnapshot trees, copy route parameters and queryParams per outlet, and re-execute canMatch guards and resolvers. This is CWE-400 (Uncontrolled Resource Consumption): transient allocation rather than a persistent leak, with memory released once recognition completes, so the security impact is process termination and CPU/backend amplification, not data exposure. The upstream fix (angular/angular PR #71055) requires every child outlet segment group to match a route configured for its target outlet before unwrapping child segments or completing a match, throws NoMatch when an outlet was not matched and no TreeNode was produced, gates the empty-path piercing logic on the matched outlet, and rewrites noLeftoversInUrl to use segmentGroup.hasChildren() instead of checking only segmentGroup.children[outlet]. Regression tests confirm canMatch is no longer evaluated repeatedly under unconfigured zero-segment outlets.

Know when Angular gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

vuln.today AI 7.5 HIGH

Remote crafted HTTP request (AV:N), single request suffices (AC:L), no attacker privileges or user interaction (PR:N/UI:N); availability-only impact from SSR worker crash (A:H, C/I:N).

3.1 AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
4.0 AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N

Estimated by vuln.today — no official severity rating has been published for this CVE yet.

DescriptionCVE.org

A denial of service (DoS) vulnerability was identified in @angular/router when Server-Side Rendering (SSR) is enabled on Node.js (V8).

During route recognition, @angular/router fails to validate whether an auxiliary outlet segment in the URL matches a route configured for that specific outlet name. Because unconfigured empty-path outlet groups (such as a:/(), x:/(...), or ///(...)) are not rejected during matching, the router repeatedly re-evaluates the route configuration against each arbitrary outlet segment provided in the URL.

When a request URL contains multiple arbitrary empty-path outlet segments, this improper matching forces the router to instantiate duplicate ActivatedRouteSnapshot trees, repeatedly execute canMatch guards and route resolvers, and allocate separate copies of route parameters and queryParams for each unconfigured outlet.

An unauthenticated remote attacker can exploit this behavior by sending requests with crafted outlet segments to exhaust the Node.js memory heap or overwhelm CPU resources, leading to SSR worker termination and service disruption.

Impact

Successful exploitation allows an unauthenticated remote attacker to exhaust the Node.js heap with a single crafted request or a small number of concurrent requests, terminating the SSR worker process with a fatal JavaScript heap out-of-memory crash. When the matched routes declare canMatch guards or resolvers, a single short request can also trigger repeated guard or resolver executions, increasing load on backend services and holding worker connections open.

  • Transient Allocation: Memory is released once route recognition completes; there is no persistent memory leak. The primary impact is process termination.
  • Client-side SPAs Unaffected: Client-side Angular applications running in the browser are not vulnerable, as browser memory consumption does not cross a security boundary.
  • Prerendering (SSG) Unaffected: Build-time prerendering does not process attacker-supplied request URLs.

Attack Preconditions & Vulnerable Configurations

An application is affected only if all of the following conditions are met:

  1. SSR Enabled: The application renders on demand on a Node.js / V8 server.
  2. Susceptible Route Configuration: At least one level of the route configuration contains either:
  • an empty-path (path: "") route (e.g., {path: "", component: ShopPage}), or
  • a route assigned to a named outlet (e.g., {path: "dashboard", children: [{path: ":id", outlet: "detail", component: DetailPanel}]}).
  1. Upstream Request Line Forwarding: Request lines reach the Node.js process without being rejected upstream by edge proxies. Node.js accepts request headers up to 16 KiB by default. Guard/resolver amplification requires only a short URL.
  2. Constrained Heap Size: Worker heaps are sized small enough relative to the request payload and concurrency (e.g., containers or serverless instances configured with 128 MiB-1 GiB).

Exploit Payload Examples

Against a configuration with empty-path (path: "") routes and query parameters:

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

Against a configuration with named-outlet or sibling routes:

http
GET /dashboard/(detail:1//x:/(detail:1//x:/(...)//y:/(...))//y:/(...)) HTTP/1.1
Host: example.com

Patches

The issue is resolved in angular/angular#71055. The router now requires every child outlet segment group to match a route configured for its target outlet before unwrapping child segments or completing a match, and prevents unconfigured empty-path outlet groups from matching routes declared for other outlets.

Patched versions:

  • 22.2.1
  • 21.2.25
  • 20.3.33

Versions prior to v20 are also affected but are no longer supported and will not receive a patch.

Workarounds & Mitigations

If you cannot immediately upgrade to a patched version, apply one or more of the following mitigations:

  1. Reject Parenthesized or Empty-Path Outlet URLs in Middleware or WAF (Recommended):

In @angular/router, auxiliary outlet groups in a URL always use parentheses (...), and empty-path outlet groups in a URL always take the form :/( , (/ , or ///( .

  • If your application does not use named (auxiliary) outlets in URLs, reject requests whose path contains ( or ) before Angular SSR handles the request.
  • If your application does use named outlets, reject requests whose path contains empty-path outlet sequences (:/( , (/ , or ///( ).

Unlike URL length limits, this completely blocks both heap exhaustion and short-URL guard/resolver amplification:

typescript
   // 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();
   });
  1. Limit URL Length at Reverse Proxy or Middleware:

Configure your edge proxy, web application firewall (WAF), or reverse proxy to reject requests with excessively long URLs (e.g., exceeding 2,048 bytes). The outlet portion of the payload is in the path, so limit the full request target, not only the query string. This reduces, but does not eliminate, guard/resolver amplification, which requires only a short URL.

  1. Increase Node.js Old Space:

Increasing --max-old-space-size raises the request size and concurrency required to exhaust memory, though it does not eliminate the issue.

Blast Radius

ecosystem impact
† from your stack dependencies † transitive graph · vuln.today resolves 4-path depth
  • 1 npm packages depend on @angular/router (1 direct, 0 indirect)

Ecosystem-wide dependent count for version 22.0.0.

Technical POC Analysis

CWE-400 (Uncontrolled Resource Consumption), with CWE-405 (Asymmetric Resource Consumption / Amplification) as the secondary class.

Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.

Executive ViewAI

Why It Matters

A high-severity denial-of-service flaw in @angular/router can crash Node.js server-side rendering workers for Angular applications that use on-demand SSR with empty-path or named-outlet routes, creating customer-facing availability risk. Client-side SPAs and build-time prerendering are unaffected, so leadership attention should focus on exposed SSR services and small container or serverless worker heaps. No public exploit code was identified at time of analysis, but a single crafted request can terminate a worker.

Business Impact: High
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

Prevalence
High
Angular is a top-tier enterprise frontend framework; Node SSR a subset
Threat Intel
1
1 source
Data Quality
2 sources
Confidence: Low
CVE.org GHSA GitHub

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity HIGH
CISA KEV No
Public POC No
EPSS N/A
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

Attack Technique

Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.

Affected Products (CPE)CVE.org

pkg:npm/@angular_router
pkg:npm/@angular_router
pkg:npm/@angular_router
pkg:npm/@angular_router
CVE-2026-88060 HIGH POC
8.6 Sep 10

Cross-site scripting via Angular's server-side rendering package (@angular/platform-server) allows arbitrary JavaScript

CVE-2026-88058 HIGH POC
8.6 Sep 10

Cross-site scripting in Angular's server-side rendering engine (`@angular/platform-server`) allows arbitrary JavaScript

CVE-2026-88056 HIGH POC
8.6 Sep 10

Server-Side Rendering in Angular's @angular/platform-server leaks server-side credentials to attacker-controlled origins

CVE-2025-66412 HIGH
8.5 Dec 01

Stored XSS in the Angular Template Compiler (npm package @angular/compiler) allows an authenticated attacker who can per

CVE-2026-22610 HIGH
8.5 Jan 10

Cross-site scripting in Angular's Template Compiler allows attackers to inject arbitrary JavaScript through unsanitized

CVE-2026-101895 HIGH
8.7 Sep 28

An unauthenticated remote attacker can lock up an Angular server-side rendering process by submitting HTML that contains

CVE-2025-62427 HIGH
8.7 Oct 16

Server-side request forgery in Angular's @angular/ssr package (all versions from 19.0.0-next.0 before 19.2.18, 20.0.0-ne

CVE-2026-50178 HIGH
8.7 Jun 22

Command injection via untrusted Markdown rendering in the Angular Language Service VS Code extension (versions prior to

CVE-2026-49241 HIGH
8.7 Jun 22

Arbitrary code execution in the Angular Language Service VS Code extension prior to 21.2.4 allows attackers to silently

CVE-2026-41423 HIGH
8.7 May 08

Server-Side Request Forgery in Angular's @angular/platform-server (SSR) lets remote unauthenticated attackers hijack the

CVE-2026-101896 HIGH
8.2 Sep 30

Denial of service in the npm package @angular/router when Server-Side Rendering (SSR) is enabled on Node.js allows an un

CVE-2026-27970 HIGH
7.6 Feb 26

Cross-site scripting in Angular's internationalization (i18n) pipeline allows attacker-controlled JavaScript to execute

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy