CVE-2026-54267

Angular Client Hydration DOM Clobbering & Response-Cache Poisoning

Published Jun 22, 2026 CVSS 4.0 · 8.6 High EPSS < 1% KEV · Not listed
Description
Angular is a development platform for building mobile and desktop web applications using TypeScript/JavaScript and other languages. Prior to 22.0.1, 21.2.17, and 20.3.25, to optimize client-side bootstrap in Server-Side Rendered (SSR) environments, Angular supports Hydration via provideClientHydration(). During SSR, Angular serializes the application's runtime state (such as cached HttpClient responses) and outputs it into the HTML stream as a <script> tag with a predictable identifier. During client bootstrap, Angular recovers this state by looking up the element via document.getElementById('ng-state') and parsing its text content. Because the DOM element lookup for the state container is predictable and relies solely on the ID selector (ng-state), it is susceptible to DOM Clobbering. If the application binds untrusted user input or CMS content to element properties such as id (e.g., <div [id]="userInput"> or <a id="ng-state">) before the genuine <script> tag is parsed by the browser, the attacker-controlled element takes precedence in the DOM lookup. During hydration, when Angular calls document.getElementById('ng-state'), the browser returns the attacker's clobbered element. Angular then attempts to parse the text content or attributes of this clobbered element as JSON. This vulnerability is fixed in 22.0.1, 21.2.17, and 20.3.25.

Analysis

AI-generated

Technical impact

Angular’s hydration feature serializes a runtime state blob into a <script> element whose id is the predictable string ‘ng-state’. During client bootstrap Angular calls document.getElementById('ng-state') and expects a JSON payload. The lookup method relies only on a fixed element id, making it vulnerable to DOM clobbering when an attacker can insert or bind an element with that id before the legitimate script loads. Because Angular then parses the attacker‑controlled content as JSON, a crafted payload can execute arbitrary scripts or corrupt the application’s state, resulting in client‑side code execution or defacement. The weakness involves improper input validation, insecure handling of DOM identifiers, and unsafe parsing, corresponding to CWE‑471, CWE‑79, and CWE‑807.

Affected Systems

Angular applications built with versions earlier than 22.0.1, 21.2.17, or 20.3.25 that use the provideClientHydration() API for server‑side rendering are affected. Any site that renders user‑supplied or CDN‑served markup before the hydration script and binds that data to element identifiers may be susceptible.

Risk and Exploitability

The CVSS score of 8.6 classifies the flaw as high severity, but the EPSS score of <1% indicates that exploitation probability is very low as of this analysis and the flaw is not listed in the CISA KEV catalog. Exploitation requires an attacker to insert an element with id='ng-state' into the page before Angular’s hydration script runs, typically via an XSS vector or a manipulated CMS template. When successful, the attacker can trigger client‑side code execution or data tampering. Because the vulnerability hinges on client‑side data binding, environments that sanitize or tightly control DOM identifiers face lower risk, yet no known public exploits have been observed.

Remediation

No solution or workaround provided in the CVE record.

OpenCVE Recommended Actions

  • Upgrade Angular to version 22.0.1, 21.2.17, or 20.3.25 or later, which removes the DOM clobbering risk in the hydration process.
  • Ensure that no untrusted data is bound to element identifiers, and that no external or CMS‑generated markup can inject an element with id='ng-state' before the hydration script is parsed.
  • If an immediate update cannot be applied, temporarily disable server‑side hydration by removing provideClientHydration() or reverting to client‑side rendering until the library is upgraded.

Generated by OpenCVE AI on August 4, 2026 at 18:57 UTC.

Tracking

Sign in to view the affected projects.

Advisories

Source ID Title
Github GHSA Github GHSA GHSA-rgjc-h3x7-9mwg Angular Client Hydration DOM Clobbering & Response-Cache Poisoning
History
Type Values Removed Values Added
Weaknesses CWE-807
References
Metrics threat_severity

None

cvssV3_1

{'score': 4.7, 'vector': 'CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:C/C:L/I:L/A:N'}

threat_severity

Moderate

Type Values Removed Values Added
Metrics ssvc

{'options': {'Automatable': 'no', 'Exploitation': 'none', 'Technical Impact': 'total'}, 'version': '2.0.3'}

Type Values Removed Values Added
First Time appeared Angular
Angular angular
Vendors & Products Angular
Angular angular
Type Values Removed Values Added
Description Angular is a development platform for building mobile and desktop web applications using TypeScript/JavaScript and other languages. Prior to 22.0.1, 21.2.17, and 20.3.25, to optimize client-side bootstrap in Server-Side Rendered (SSR) environments, Angular supports Hydration via provideClientHydration(). During SSR, Angular serializes the application's runtime state (such as cached HttpClient responses) and outputs it into the HTML stream as a <script> tag with a predictable identifier. During client bootstrap, Angular recovers this state by looking up the element via document.getElementById('ng-state') and parsing its text content. Because the DOM element lookup for the state container is predictable and relies solely on the ID selector (ng-state), it is susceptible to DOM Clobbering. If the application binds untrusted user input or CMS content to element properties such as id (e.g., <div [id]="userInput"> or <a id="ng-state">) before the genuine <script> tag is parsed by the browser, the attacker-controlled element takes precedence in the DOM lookup. During hydration, when Angular calls document.getElementById('ng-state'), the browser returns the attacker's clobbered element. Angular then attempts to parse the text content or attributes of this clobbered element as JSON. This vulnerability is fixed in 22.0.1, 21.2.17, and 20.3.25.
Title Angular Client Hydration DOM Clobbering & Response-Cache Poisoning
Weaknesses CWE-471
CWE-79
References
Metrics cvssV4_0

{'score': 8.6, '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'}

Weaknesses
  • CWE-471

    Modification of Assumed-Immutable Data (MAID)

  • CWE-79

    Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')

  • CWE-807

    Reliance on Untrusted Inputs in a Security Decision

Sources

Status
PUBLISHED
Assigner
GitHub_M
Published
Updated
Jun 22, 2026, 4:00 PM
Reserved
Jun 12, 2026, 5:13 PM
Status
Analyzed
Published
Jun 22, 2026, 4:16 PM
Modified
Jul 9, 2026, 3:39 PM
Severity
Moderate
Public date
Jun 22, 2026, 3:30 PM