ZeroHour

CVE-2026-88058

large

Server-Side Rendering XSS in Angular @angular/platform-server

CVSS 4.0
8.6 high
EPSS
Published
()
Modified
AI analysis

Angular's server-side rendering package @angular/platform-server serializes ProcessingInstruction DOM nodes inside HTML raw-text fallback elements (noscript, iframe, noembed, noframes) without escaping a matching ancestor closing tag in the instruction data. The flaw is only reachable when application or library code calls inject(DOCUMENT).createProcessingInstruction with attacker-controlled data, or inserts such nodes via Renderer2, inside one of these fallback containers during SSR; it cannot be triggered through standard Angular templates. An attacker who controls the ProcessingInstruction data can make the raw-text container close prematurely, causing following sibling markup to be parsed as live HTML and gaining arbitrary JavaScript execution (XSS) in the victim's browser, with user interaction required. Applications using Angular SSR on versions prior to 20.3.30 (20.x line), 21.2.22 (21.x line), and 22.1.4 (22.x line) are affected. No public proof-of-concept, CISA KEV listing, or confirmed in-the-wild exploitation is known.

What to do: Upgrade @angular/platform-server to 20.3.30, 21.2.22, or 22.1.4 to match your Angular major release. Audit SSR code paths for inject(DOCUMENT).createProcessingInstruction or Renderer2 insertion of attacker-controlled data inside noscript, iframe, noembed, or noframes containers, and as an interim measure escape or strip angle brackets (especially matching closing tags) from ProcessingInstruction data. Prioritize applications where untrusted user input can reach ProcessingInstruction nodes during server-side rendering.

Affected
Angular (Google) Angular SSR (@angular/platform-server)All versions prior to the fixes: <20.3.30 (20.x), <21.2.22 (21.x), and <22.1.4 (22.x)
Estimated exposure
large~100,000+ Angular SSR deployments potentially affected, though only a subset using the uncommon ProcessingInstruction/Renderer2 pattern is actually vulnerable — Based on @angular/platform-server's roughly one million weekly npm downloads and Angular's very large installed base, implying hundreds of thousands of SSR deployments, with the truly reachable subset far smaller because the flaw cannot be…

Order-of-magnitude estimate by the model from install counts, market share and public scan data it knows; verify before quoting.

Description

Angular is a development platform for building mobile and desktop web applications using TypeScript/JavaScript and other languages. Prior to 20.3.30, 21.2.22, and 22.1.4, Angular server-side rendering (SSR) in @angular/platform-server serializes ProcessingInstruction DOM nodes inside fallback raw-content elements without escaping matching ancestor closing tags. ProcessingInstruction data escaped greater-than characters but left less-than characters untouched and did not inspect fallback ancestors, so data such as a matching closing tag prematurely terminates noscript, iframe, noembed, or noframes containers. The vulnerable nodes cannot be authored through standard Angular templates; reachability requires application or library code using inject(DOCUMENT).createProcessingInstruction with attacker-controlled data or Renderer2 DOM insertion inside a fallback container. In HTML5 RAWTEXT parsing, the premature close causes subsequent sibling elements to be interpreted as live HTML and enables arbitrary JavaScript execution in a victim's browser. This issue is fixed in versions 20.3.30, 21.2.22, and 22.1.4.

Weakness
CWE-79, CWE-116
Vector
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X

In the news

No ingested article mentions this CVE yet.