Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessSend concurrent crafted URLs with numeric matrix parameters
-
Delivery@angular/router SSR parses segments into per-segment objects
-
ExploitV8 allocates oversized HOLEY_ELEMENTS backing stores (~350x amplification)
-
ExecutionNode.js old-space heap exhausted
-
ImpactSSR worker crashes (denial of service)
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 | Exploitation requires ALL of: (1) the application runs Angular Server-Side Rendering on Node.js/V8; (2) user-controlled request URLs are parsed directly by @angular/router during SSR; and (3) upstream reverse proxies (Nginx, Cloudflare, ALB/WAF) forward URLs containing semicolons and many path segments without stripping or rejecting them. Limiting factors that reduce realistic risk: pure client-side Angular SPAs without SSR are NOT vulnerable (no security boundary is crossed); any edge that strips/blocks semicolons or caps path depth (e.g. ~20-30 segments) blocks the attack; and the DoS requires a concurrency burst (roughly 12-22 concurrent 8 KB-path requests, or ~50-100 concurrent 1-2 KB-path requests) rather than a single request. Affected packages: @angular/router 20.x < 20.3.32, 21.x < 21.2.24, 22.x < 22.2.0, and all <= 19.2.25 (no fix available). |
| Impact | This is a genuine but conditional priority. The vendor CVSS 4.0 score of 8.2 (High) is driven entirely by availability impact (VA:H) with no confidentiality or integrity impact (VC:N/VI:N), consistent with a CWE-400 resource-exhaustion DoS. The vector reports AV:N/PR:N/UI:N (network-reachable, unauthenticated, no user interaction), which raises urgency, but it also carries AT:P (Attack Requirements: Present), the 4.0 engine's acknowledgement that exploitation depends on specific conditions - notably SSR being enabled and upstream proxies not stripping semicolons. No EPSS score was provided in the input, so exploitation probability cannot be quantified. There is no CISA KEV listing and no public exploit identified at time of analysis, so this is not confirmed active exploitation. The signals are therefore consistent rather than conflicting: a high-impact, low-complexity, unauthenticated DoS against a specific deployment mode. The practical caveat is that no CVSS 3.1 vector was supplied by the source (only a 4.0 vector), and the realistic risk is narrower than the headline score because pure client-side Angular SPAs and any deployment with semicolon/segment filtering at the edge are not exploitable. |
| Exploit ScenarioDerived | An unauthenticated remote attacker sends a modest burst of HTTP GET requests whose paths contain many repeated numeric matrix-parameter segments (e.g. /a;990;2522 repeated). During server-side rendering, @angular/router parses each segment into its own object, and V8 allocates ~20-25 KB dense array backing stores per 11-byte segment (~350x amplification), exhausting the Node.js old-space heap and crashing the SSR worker with a fatal 'JavaScript heap out of memory'. As few as 12-22 concurrent 8 KB-path requests can crash a 256-512 MiB worker; no public exploit code was identified, but the payload format is fully documented in the advisory. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv2 – Oct 14, 2026
Denial of service in the npm package @angular/router when Server-Side Rendering (SSR) is enabled on Node.js allows an unauthenticated remote attacker to crash the SSR worker by exhausting the V8 old-space heap. Numeric matrix-parameter or outlet names (e.g. /a;990;2522) are stored as array-indexed properties on plain parameter objects, causing V8 to allocate dense HOLEY_ELEMENTS backing stores sized to the largest index, producing roughly 350x memory amplification (~20-25 KB of heap per 11-byte path segment) and a fatal 'JavaScript heap out of memory' error. Exploitation requires the app to run Angular SSR on Node.js, to parse user-controlled URLs directly through @angular/router, and an edge/reverse proxy that forwards semicolons and deep paths; roughly 12-22 concurrent 8 KB-path requests or 50-100 concurrent 1-2 KB-path requests are enough to kill a 256-512 MiB worker. Client-side Angular SPAs without SSR are not affected, and no public exploit code has been identified at time of analysis; the only impact is availability (no confidentiality or integrity impact).
Earlier versions of this analysis (1)
Denial of service against Angular applications that run Server-Side Rendering (SSR) on Node.js: unauthenticated remote attackers can crash the SSR worker by sending requests whose URLs contain repeated numeric matrix parameters or numeric outlet names (for example /a;990;2522/a;990;2522/...). Because V8 treats numeric string keys as array indices, each parsed URL segment causes the router to allocate a dense ~20-25 KB backing store, giving roughly a 350x memory amplification so that as few as 12-22 concurrent 8 KB requests can exhaust a 256-512 MiB Node.js old-space heap and terminate the process with an unrecoverable JavaScript heap out of memory error. Only SSR deployments are affected - pure client-side Angular SPAs are not vulnerable - and exploitation additionally requires that user-controlled URLs reach @angular/router and that upstream proxies (Nginx, Cloudflare, ALB) do not strip semicolons or limit path depth; per available intelligence there is no public exploit identified at time of analysis, and no CISA KEV listing. Vendor patches that force sparse dictionary storage for URL-derived numeric keys are available in @angular/router 20.3.32, 21.2.24 and 22.2.0.
RemediationAI
Vendor-released patch: upgrade @angular/router to 22.2.0 (22.x line), 21.2.24 (21.x line), or 20.3.32 (20.x line) as applicable; patch availability is confirmed by the vendor advisory GHSA-ff3f-86qr-9cv3 and the fix PR https://github.com/angular/angular/pull/70717 with commits 03872a80bcf1c89b2b04cdd3f444b2ee954da583, 5af61216eab8bf4a6697a1d79bda3d857c06f89d, and ddfe21072ba32ca4cd9d7d3c6b7df66af81d58c4. Note that versions <= 19.2.25 have no fixed release listed, so 19.x deployments must either upgrade across major lines or rely entirely on edge mitigations. If immediate upgrade is not possible, the most effective compensating control is blocking or stripping semicolons in request paths at the reverse proxy or WAF before requests reach the SSR service - for example an Nginx rule such as 'if ($uri ~* ";") { return 400; }' or an equivalent Cloudflare/AWS WAF rule; the trade-off is that legitimate URL matrix parameters (used for per-segment parameters in Angular routing) will be rejected or silently dropped, which can break existing deep links and feature behavior, so test affected routes first. A second, lower-collision option is enforcing a strict path-segment limit at the edge (for instance rejecting requests with more than 20-30 segments), which blocks the high-amplification payloads while leaving normal routes intact but does not stop low-depth numeric-parameter abuse. Increasing the Node.js heap via --max-old-space-size (e.g. 2048 or 4096) raises the concurrency threshold needed to crash a worker but does not eliminate the vulnerability under sustained or higher-volume traffic and increases per-worker memory cost, so treat it as a stopgap only. Because exploitation requires a concurrency burst rather than a single request, rate limiting concurrent requests per client at the edge provides incremental protection but should not replace patching.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 3 packages in npm, euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The flaw is an uncontrolled resource consumption issue (CWE-400) rooted in @angular/router's UrlParser, which flattens URL path segments, matrix parameters, and child outlets into plain JavaScript objects typed as Record<string, string>. When a matrix parameter name or outlet name is a numeric string, JavaScript/V8 treats it as an array index rather than a named property. V8's property-storage heuristics promote an initially empty object holding numeric keys to a dense, holey element backing store (HOLEY_ELEMENTS) sized to the maximum index instead of degrading to sparse dictionary storage - so assigning keys like '990' then '2522' allocates a contiguous array of ~2,522 pointers (roughly 20-25 KB) for what is only an 11-byte URL segment. Because every segment in a path builds its own independent parameters object, an attacker multiplies the effect by repeating numeric matrix parameters across many segments and across concurrent requests, yielding the ~350x asymmetric amplification described by the vendor. The reverse proxy is a decisive control point because the payload relies on semicolon-delimited matrix parameters surviving into the SSR process. The fix introduces setUrlDerivedKey in packages/router/src/url_tree.ts, which for URL-derived numeric keys with index >= 32 sets and then deletes a SLOW_ELEMENTS_SENTINEL (0x40000000) property, forcing V8 to keep such keys in dictionary storage while preserving route matching, parameter values, and outlet bindings; the accompanying test suite verifies round-tripping of numeric names and safe handling of keys that literally equal the sentinel value.
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
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
Network-reachable and unauthenticated (AV:N/PR:N/UI:N); AC:H because SSR must be enabled and upstream proxies must not filter semicolons/segments; availability-only impact (A:H, C:N/I:N).
Primary rating from Vendor (https://github.com/angular/angular).
CVSS VectorVendor: https://github.com/angular/angular
Lifecycle Timeline
2DescriptionCVE.org
A denial of service (DoS) vulnerability was identified in @angular/router when Server-Side Rendering (SSR) is enabled on Node.js (V8).
When @angular/router parses incoming request URLs, it extracts path segments, matrix parameters, and child outlets into plain JavaScript objects (Record<string, string>). When matrix parameter names or outlet names are numeric strings (such as /a;990;2522), the V8 JavaScript engine interprets them as array-indexed properties rather than named properties.
Under V8's internal property-storage heuristics, setting numeric keys on an initially empty object causes V8 to allocate a dense array backing store (HOLEY_ELEMENTS) sized to the maximum index rather than falling back to sparse dictionary storage. Specifically, assigning sequential or moderately large numeric keys (like 990 followed by 2522) causes V8 to allocate a contiguous backing store of ~2,522 pointers (~20 KB to 25 KB of heap) for a single 11-byte segment.
Because each segment in a URL path allocates its own independent parameters object, an attacker can craft URLs with repeated numeric matrix parameters to achieve an asymmetric memory amplification factor of approximately ~350x.
Impact
Successful exploitation allows an unauthenticated remote attacker to exhaust the Node.js old-space heap with modest request volume, terminating the SSR worker with an unrecoverable JavaScript heap out of memory fatal error and causing a Denial of Service.
- High Amplification: A single 11-byte segment (
/a;990;2522) consumes ~20 KB-25 KB of V8 heap. - Low Concurrency Required:
- With 8 KB request paths (~740 segments, within default Nginx 8 KB buffer limits), as few as 12-22 concurrent requests crash a 256 MiB-512 MiB Node.js SSR worker.
- With smaller 1 KB-2 KB request paths (~90-180 segments), a burst of ~50-100 concurrent requests achieves the same heap exhaustion.
- Client-side SPAs Unaffected: Pure client-side Angular applications (Single Page Applications without SSR) are not vulnerable, as local browser memory consumption does not cross a security boundary.
Attack Preconditions & Vulnerable Configurations
An application is affected only if all of the following conditions are met:
- SSR Enabled: The application runs in a Server-Side Rendering environment powered by Node.js / V8.
- Direct Router Parsing: User-controlled request URLs are parsed by
@angular/routerduring SSR. - No Reverse-Proxy Semicolon/Segment Filtering: Upstream reverse proxies (Nginx, Cloudflare, ALB) forward URLs containing semicolons (
;) and multiple path segments without stripping or rejecting them.
Exploit Payload Example
An attacker sends concurrent HTTP requests with repeated numeric matrix parameters:
GET /a;990;2522/a;990;2522/a;990;2522/... HTTP/1.1
Host: example.comEven with paths under 2 KB, overlapping requests during SSR will rapidly consume the V8 heap until the process crashes.
Patches
The issue is resolved by updating @angular/router to enforce V8 dictionary elements storage (setUrlDerivedKey) for numeric URL-derived keys (index >= 32). This prevents V8 from allocating oversized contiguous array backing stores while preserving route matching, parameter values, and component input bindings.
22.2.021.2.2420.3.32
Workarounds & Mitigations
If you cannot immediately upgrade to a patched version, apply one of the following mitigations at your edge or reverse proxy:
- Block or Sanitize Matrix Parameters at the Reverse Proxy:
Configure your reverse proxy (e.g., Nginx, Cloudflare, or AWS WAF) to reject or strip semicolons (;) in request paths before forwarding requests to the Angular SSR service:
# Nginx example: reject requests containing matrix parameters
if ($uri ~* ";") {
return 400;
}- Enforce Strict Path Segment Limits:
Reject requests with excessive path depth (e.g., more than 20-30 segments).
- Increase Node.js Old Space:
Increase --max-old-space-size (e.g., to 2048 or 4096 MB) to increase the concurrency threshold required to exhaust memory, though this does not fully eliminate the vulnerability under sustained traffic.
Articles & Coverage 1
Technical POC Analysis
CWE-400 (Uncontrolled Resource Consumption), with CWE-770 as secondary.
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
Organizations running Angular server-side rendering (SSR) on Node.js are at risk from a high-severity denial-of-service vulnerability in @angular/router (CVE-2026-101896) that can crash SSR workers by exhausting memory, leading to service unavailability for web applications relying on SSR and impacting end users. A vendor patch is available per vendor advisory, and no public exploit identified at time of analysis. Leadership should prioritize patching to maintain availability and protect brand trust.
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
SSVC AssessmentENISA
Priority Score
Attack Technique
Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.
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
Cross-site scripting in Angular's internationalization (i18n) pipeline allows attacker-controlled JavaScript to execute
Angular SSR's CommonEngine (in @angular/ssr/node, and in @angular/ssr for versions 17 through 18) can disclose a sibling
EUVD-2026-101147
GHSA-ff3f-86qr-9cv3
NVD
CVE.org
EPSS
Exploit-DB