Angular Router
CVE-2026-111752
HIGH
Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessIdentify Angular SSR endpoint
-
DeliveryCraft URL with nested empty-path outlet segments
-
ExploitRouter re-evaluates config per outlet
-
ExecutionDuplicate snapshot trees exhaust V8 heap
-
ImpactSSR 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. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – 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
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
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).
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:
- SSR Enabled: The application renders on demand on a Node.js / V8 server.
- 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}]}).
- 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.
- 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:
GET /shop/(a:/()//b:/()//c:/()//...)?param1=value¶m2=value... HTTP/1.1
Host: example.comAgainst a configuration with named-outlet or sibling routes:
GET /dashboard/(detail:1//x:/(detail:1//x:/(...)//y:/(...))//y:/(...)) HTTP/1.1
Host: example.comPatches
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.121.2.2520.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:
- 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:
// 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();
});- 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.
- 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- 1 npm packages depend on @angular/router (1 direct, 0 indirect)
Ecosystem-wide dependent count for version 22.0.0.
Articles & Coverage 2
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
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.
Apply vendor patch.
Threat Intelligence Overview
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.
What every action level means
Attack Technique
Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.
Affected Products (CPE)CVE.org
Cross-site scripting via Angular's server-side rendering package (@angular/platform-server) allows arbitrary JavaScript
Cross-site scripting in Angular's server-side rendering engine (`@angular/platform-server`) allows arbitrary JavaScript
Server-Side Rendering in Angular's @angular/platform-server leaks server-side credentials to attacker-controlled origins
Stored XSS in the Angular Template Compiler (npm package @angular/compiler) allows an authenticated attacker who can per
Cross-site scripting in Angular's Template Compiler allows attackers to inject arbitrary JavaScript through unsanitized
An unauthenticated remote attacker can lock up an Angular server-side rendering process by submitting HTML that contains
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
Command injection via untrusted Markdown rendering in the Angular Language Service VS Code extension (versions prior to
Arbitrary code execution in the Angular Language Service VS Code extension prior to 21.2.4 allows attackers to silently
Server-Side Request Forgery in Angular's @angular/platform-server (SSR) lets remote unauthenticated attackers hijack the
Denial of service in the npm package @angular/router when Server-Side Rendering (SSR) is enabled on Node.js allows an un
Cross-site scripting in Angular's internationalization (i18n) pipeline allows attacker-controlled JavaScript to execute
GHSA-62vg-58rm-qff7
CVE.org
Exploit-DB