Skip to main content

Angular Router CVE-2026-101896

| EUVDEUVD-2026-101147 HIGH
Uncontrolled Resource Consumption (CWE-400)
2026-09-30 https://github.com/angular/angular GHSA-ff3f-86qr-9cv3
8.2
CVSS 4.0 · Vendor: https://github.com/angular/angular
View

Attack ChainAIDerived

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

  1. Access
    Send concurrent crafted URLs with numeric matrix parameters
  2. Delivery
    @angular/router SSR parses segments into per-segment objects
  3. Exploit
    V8 allocates oversized HOLEY_ELEMENTS backing stores (~350x amplification)
  4. Execution
    Node.js old-space heap exhausted
  5. Impact
    SSR 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.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available 0.7% exploitation probability (EPSS)

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

Alert me

AnalysisAIv2 – 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)
v1 Sep 30, 2026 - 16:04

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

angular 20.0.0, < 20.3.32
angular 22.0.0, < 22.2.0
angular 21.0.0, < 21.2.24
Router 22.0.0, < 22.2.0
Router 21.0.0, < 21.2.24
Router ≤ 19.2.25
Router 20.0.0, < 20.3.32
angular ≤ 19.2.25

Affected Packages

npm @angular/router fix: 20.3.32, 21.2.24, 22.2.0
euvd angular fix: 20.3.32, 21.2.24, 22.2.0
euvd router fix: 20.3.32, 21.2.24, 22.2.0

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

Vendor (https://github.com/angular/angular) PRIMARY 8.2 HIGH
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
vuln.today AI 5.9 MEDIUM

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).

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

Primary rating from Vendor (https://github.com/angular/angular).

CVSS VectorVendor: https://github.com/angular/angular

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
Present
Privileges Required
None
User Interaction
None
Vulnerable system: Confidentiality
None
Vulnerable system: Integrity
None
Vulnerable system: Availability
High
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

Lifecycle Timeline

2
CVSS changed
Oct 14, 2026 - 16:22 NVD
8.2 (HIGH)
CVE Published
Sep 30, 2026 - 15:40 cve.org
HIGH

DescriptionCVE.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/router during 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:

http
GET /a;990;2522/a;990;2522/a;990;2522/... HTTP/1.1
Host: example.com

Even 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.0
  • 21.2.24
  • 20.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:

  1. 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
# Nginx example: reject requests containing matrix parameters
   if ($uri ~* ";") {
       return 400;
   }
  1. Enforce Strict Path Segment Limits:

Reject requests with excessive path depth (e.g., more than 20-30 segments).

  1. 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.

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

Why It Matters

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.

Business Impact: High
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

EPSS Score
0.7%
Top 48% exploitable
Prevalence
High
Angular is a major enterprise framework; only SSR deployments are exposed
Threat Intel
1
1 source
Data Quality
5 sources
Confidence: Medium

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 0.7%
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.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation· derived
None
System Exposure· derived
Open
Automatable· derived
Yes
Human Impact
High

Priority Score

42
Low Medium High Critical
KEV: 0
EPSS: +1
CVSS: +41
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

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

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-27970 HIGH
7.6 Feb 26

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

CVE-2026-104871 MEDIUM
6.3 Oct 02

Angular SSR's CommonEngine (in @angular/ssr/node, and in @angular/ssr for versions 17 through 18) can disclose a sibling

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