Skip to main content

Angular platform-server EUVDEUVD-2026-52350

| CVE-2026-69149 HIGH
Cross-site Scripting (XSS) (CWE-79)
2026-08-03 https://github.com/angular/angular GHSA-vpx6-8pjr-4g3v
8.6
CVSS 4.0 · Vendor: https://github.com/angular/angular
Share

Severity by source

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

Network-exploitable XSS with no attacker privileges; victim must visit the page; scope changes to browser context; no availability impact.

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

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

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

Attack Vector
Network
Attack Complexity
Low
Privileges Required
None
User Interaction
P
Scope
X

Lifecycle Timeline

3
Source Code Evidence Fetched
Aug 03, 2026 - 16:37 vuln.today
Analysis Generated
Aug 03, 2026 - 16:37 vuln.today
CVE Published
Aug 03, 2026 - 16:14 cve.org
HIGH

DescriptionCVE.org

A Cross-Site Scripting (XSS) vulnerability exists in @angular/platform-server's DOM emulation dependency (domino) when serializing the content of fallback raw-content elements (<iframe>, <noembed>, <noframes>, and <noscript>).

When rendering dynamic text content inside fallback raw-content elements via template bindings, the template engine expects the browser to render the content safely. Under Server-Side Rendering (SSR), domino is configured with scripting enabled, meaning these elements are treated as raw-text elements.

However, domino's serializer previously did not escape text nodes within fallback raw-content elements (<iframe>, <noembed>, <noframes>, <noscript>) during DOM serialization. As a result, any occurrence of closing tags in the bound dynamic text was not escaped.

The unescaped closing tag could be serialized directly into the output HTML. When parsed by a browser or re-parsed during SSR post-processing without preserving raw-content parser state, an injected closing tag closes the element early, allowing an injected script block to execute in the user's browser context, causing same-origin Cross-Site Scripting (XSS).

Impact

This vulnerability allows an attacker to perform same-origin Cross-Site Scripting (XSS) attacks against any user visiting an SSR-rendered page that binds user-controlled data inside fallback raw-content elements (<iframe>, <noembed>, <noframes>, <noscript>). This can lead to session hijacking, credentials theft, unauthorized actions on behalf of users, and defacement.

Patched Versions

  • 22.0.7
  • 21.2.19
  • 20.3.27

Workarounds

If you cannot immediately update your dependencies, you can mitigate this issue using any of the following approaches:

  • Disable critical CSS inlining: Critical CSS inlining in Angular SSR post-processes the rendered HTML using domino. Disabling this step prevents domino from re-parsing and re-serializing the HTML during server-side rendering.
  • In angular.json, set inlineCritical to false under style optimization options:
json
    {
      "projects": {
        "my-app": {
          "architect": {
            "build": {
              "builder": "@angular/build:application",
              "options": {
                "optimization": {
                  "styles": {
                    "inlineCritical": false
                  }
                }
              }
            }
          }
        }
      }
    }
  • When rendering programmatically with CommonEngine, set inlineCriticalCss: false in your render options.
  • Avoid binding user-controlled values inside fallback raw-content elements (<iframe>, <noembed>, <noframes>, <noscript>).
  • Sanitize user input placed inside these elements to explicitly strip or escape closing tags before passing it to the template.

AnalysisAI

Cross-site scripting in @angular/platform-server's domino DOM emulation library allows attackers to inject executable script blocks into SSR-rendered HTML by supplying closing-tag sequences inside user-controlled data bound to <iframe>, <noembed>, <noframes>, or <noscript> Angular template elements. Angular 20.x through 22.x applications using Server-Side Rendering that reflect user input into these specific fallback raw-content elements are affected; Angular 19.x and earlier receive no backport patch. No public exploit has been identified at time of analysis, though the mechanism is straightforward once the vulnerable application pattern is present, and patches are available across three supported Angular branches.

Technical ContextAI

The root cause (CWE-79: Improper Neutralization of Input During Web Page Generation) resides in domino, the headless DOM emulation library bundled by @angular/platform-server for SSR. Affected packages per npm PURL are pkg:npm/@angular/platform-server across versions 20.0.0-next.0 through 22.0.6. In a real browser with scripting enabled, <iframe>, <noembed>, <noframes>, and <noscript> are treated as fallback raw-content elements whose child text is parsed verbatim, making embedded closing tags structurally inert. Domino mimics scripting-enabled behavior and likewise treats these as raw-text elements during rendering - but its serializer did not apply HTML-entity escaping to text nodes inside them when converting the DOM back to a string. During critical CSS inlining, Angular SSR's default post-processing step, domino re-parses the serialized HTML output without preserving raw-text parser state, so any attacker-injected closing tag sequence is reinterpreted as structural HTML, enabling early element termination and script injection. The fix in domino PR #32 and commit f88e5aa49cf2804d7c2df22ef1640eb4ec43dd56 introduces escapeFallbackRawText(), which HTML-encodes closing tag occurrences within these elements; Angular PRs #69675, #69714, #69929, and #69930 integrate the patched domino into Angular's build pipeline.

RemediationAI

Upgrade @angular/platform-server to a patched release: 22.0.7 for Angular 22.x users, 21.2.19 for Angular 21.x users, or 20.3.27 for Angular 20.x users, as documented at https://github.com/angular/angular/security/advisories/GHSA-vpx6-8pjr-4g3v. Angular 19.x and earlier have no vendor-released patch; applications on those versions should migrate to a supported major branch. If immediate upgrade is not feasible, disable critical CSS inlining by setting inlineCritical: false under optimization.styles in angular.json, or passing inlineCriticalCss: false to CommonEngine.render() - this prevents domino from re-parsing the SSR output during post-processing, removing the triggering re-parse step (trade-off: slightly larger initial HTML payload due to non-inlined critical CSS). Alternatively, audit templates to ensure user-controlled values are never bound inside <iframe>, <noembed>, <noframes>, or <noscript> elements, or explicitly sanitize such values to strip or HTML-encode closing tag sequences before they reach the Angular template. Patch refs: https://github.com/angular/angular/pull/69675, https://github.com/angular/angular/pull/69714, https://github.com/angular/domino/pull/32.

Share

EUVD-2026-52350 vulnerability details – vuln.today

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