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.
Published: 2026-06-22
Score: 8.6 High
EPSS: < 1% Very Low
KEV: No
Impact: n/a
Action: n/a
AI Analysis

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.

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

Remediation

No vendor fix or workaround currently provided.

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

Fri, 10 Jul 2026 00:15:00 +0000

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


Mon, 22 Jun 2026 18:30:00 +0000

Type Values Removed Values Added
Metrics ssvc

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


Mon, 22 Jun 2026 18:00:00 +0000

Type Values Removed Values Added
First Time appeared Angular
Angular angular
Vendors & Products Angular
Angular angular

Mon, 22 Jun 2026 15:45:00 +0000

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'}


cve-icon MITRE

Status: PUBLISHED

Assigner: GitHub_M

Published:

Updated: 2026-06-22T16:00:36.910Z

Reserved: 2026-06-12T17:13:32.279Z

Link: CVE-2026-54267

cve-icon Vulnrichment

Updated: 2026-06-22T16:00:32.310Z

cve-icon NVD

Status : Analyzed

Published: 2026-06-22T16:16:39.457

Modified: 2026-07-09T15:39:24.360

Link: CVE-2026-54267

cve-icon Redhat

Severity : Moderate

Publid Date: 2026-06-22T15:30:48Z

Links: CVE-2026-54267 - Bugzilla

cve-icon OpenCVE Enrichment

Updated: 2026-08-04T19:00:10Z

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