Skip to main content

Angular HttpClient CVE-2026-111753

MEDIUM
Insertion of Sensitive Information Into Sent Data (CWE-201)
2026-10-20 https://github.com/angular/angular GHSA-jfgx-762w-99vr
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Induce app to send crafted URL
  2. Delivery
    Use backslash or control-char URL bypass
  3. Exploit
    Regex misclassifies URL as same-origin
  4. Execution
    Browser attaches X-XSRF-TOKEN cross-origin
  5. Impact
    Capture token and forge CSRF requests

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V14 - Data Protection Outbound data filtering
Exploitation Conditions

Requires all of: (1) XSRF protection enabled in HttpClient (the default); (2) the application passing an attacker-controllable or untrusted URL into a mutating HttpClient method (POST/PUT/DELETE/PATCH) - if the app only ever uses static, developer-authored same-origin paths, the bypass has no injection point; (3) a crafted URL exploiting the regex/WHATWG parsing gap, e.g. leading backslashes (/\attacker.example/api), protocol-relative forms with leading spaces/C0 control bytes (' //attacker.example/api', '\x1f//attacker.example/x'), or embedded tab/newline/CR inside the scheme ('htt\tps://...'); and (4) the attacker's cross-origin server returning CORS headers that permit the request and the custom X-XSRF-TOKEN header, otherwise the browser blocks the token from being usable. Limiting factors: only versions 20.0.0-20.3.33, 21.0.0-21.0.2, and ≤19.2.25 are affected (21.0.3+ and all 22.x already use the WHATWG origin check); impact is confined to the single XSRF token rather than full session data; and exploitation hinges on the application design choice of feeding dynamic URLs to mutating requests.

Impact

No CVSS vector, EPSS, KEV, or POC signal is present in the input, so quantitative exploitation scoring is unavailable and must be inferred. This is an incomplete-fix regression (follows CVE-2025-66035) in @angular/common's HttpClient XSRF interceptor, where a regex (/^(?:https?:)?\/\//i) used to detect absolute URLs diverges from the browser's WHATWG URL parser, letting obfuscated URLs (backslashes, C0 control chars, embedded tab/newline/CR) be treated as same-origin and have the X-XSRF-TOKEN header attached while the browser actually dispatches cross-origin. The real-world risk is conditional rather than broadly wormable: exploitation requires the victim application to pass attacker-influenceable or untrusted URLs into mutating HttpClient requests, AND the attacker's server to permit the request plus the custom X-XSRF-TOKEN header via CORS. Because the X-XSRF-TOKEN is a security credential, the conceptual severity of a CSRF-protection bypass is real, but the daisy-chain of preconditions (dynamic/untrusted URL sink + permissive CORS on the attacker side) keeps this well below a default-config unauthenticated-RCE class issue. Net: a genuine but moderate-priority issue - patch promptly on affected LTS/current branches, but it is not a mass-exploitation 'drop everything' event absent evidence of active exploitation, which the input does not provide. Note the data gap: the official GHSA (GHSA-jfgx-762w-99vr) almost certainly carries a severity rating, but it was not supplied here - verify the vendor score.

Exploit ScenarioDerived

A victim is logged into an Angular application (v20.0.0-20.3.33, v21.0.0-21.0.2, or any ≤19.2.25) that passes a dynamic or attacker-influenceable URL into a mutating HttpClient call. The attacker supplies a URL such as '/\attacker.example/api' or ' //attacker.example/api' that the interceptor's regex misreads as relative/same-origin, so the browser's WHATWG parser resolves it to attacker.example and sends the valid X-XSRF-TOKEN header cross-origin; the attacker's CORS-permissive endpoint captures the token and replays it to forge state-changing requests against the user's session. No public exploit identified at time of analysis, though the advisory documents concrete bypass payloads.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Oct 20, 2026

Cross-site request forgery token leakage in Angular's @angular/common HTTP Client lets the X-XSRF-TOKEN header be attached to attacker-controlled cross-origin requests when a crafted URL slips past the interceptor's absolute-URL regular expression while the browser's WHATWG URL parser resolves it to a foreign host; remote unauthenticated attackers who can influence a URL passed to a mutating request (POST/PUT/DELETE/PATCH) can capture the victim's token and later replay it for CSRF against the user's session, though user interaction and permissive CORS on the attacker server are required. Affected releases are @angular/common 20.0.0 through 20.3.33, 21.0.0 through 21.0.2, and 19.2.25 and earlier, while 21.0.3+, all 22.x releases, and 20.3.34 contain the WHATWG origin-comparison fix. No public exploit code or CISA KEV entry was identified at time of analysis, and the disclosure itself is an incomplete-fix follow-up to CVE-2025-66035.

RemediationAI

Upgrade @angular/common (together with the matching @angular/core) to 20.3.34 or 21.0.3 - vendor-released patches that replace the regex with a WHATWG origin comparison - or to any 22.x release, which was never affected. Teams on the unsupported 19.x line (19.2.25 and earlier) have no published fix and should upgrade to a patched major. If an upgrade cannot be staged immediately, the actionable workaround is to stop feeding dynamic URLs into mutating HttpClient calls: resolve every outbound URL first with new URL(url, window.location.origin) and pass it only when parsedUrl.origin === window.location.origin, rejecting anything else. The trade-off is that this must be done at each call site (or in a custom interceptor registered ahead of the XSRF one), so any missed site remains exposed. Additionally, avoid passing user-controlled or untrusted URL strings to POST/PUT/DELETE/PATCH requests at all, and keep server-side CORS policies strict - not returning Access-Control-Allow-Headers for X-XSRF-TOKEN to untrusted origins means a leaked header still cannot be read by the attacker. Reference the advisory at https://github.com/angular/angular/security/advisories/GHSA-jfgx-762w-99vr and the fix PR at https://github.com/angular/angular/pull/65683.

Affected Packages

npm @angular/common fix: 20.3.34, 21.0.3

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in npm

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

The flaw lives in xsrfInterceptorFn in packages/common/http/src/xsrf.ts. The original remediation for CVE-2025-66035 (GHSA-58c5-g7wp-6w37) added const ABSOLUTE_URL_REGEX = /^(?:https?:)?\/\//i to decide whether a request targets a same-origin relative path (attach the token) or an absolute/protocol-relative URL (skip it). That check does not model how browsers actually resolve URLs passed to fetch() and XMLHttpRequest.open(), which follow the WHATWG URL standard: backslashes are normalized to forward slashes (/\evil.example/x, \\evil.example/x, https:\\evil.example/x), leading and trailing C0 control characters and spaces are stripped (' //evil.example/x', '\0//evil.example/x', '\x1f//evil.example/x'), and tab, newline, and carriage return are removed anywhere in the string ('/\t/evil.example/x', 'htt\tps://evil.example/x'). Each of those inputs fails the regex - so Angular classifies it as relative and injects the CSRF header - yet resolves in the browser to a cross-origin authority, leaking the token. This maps to CWE-201 (Insertion of Sensitive Information Into Sent Data): the secret is placed into an outbound request destined for an untrusted party. The fix in PR #65683 (backported via PR #71295 and commits 0659d11c, 20474d3f, 933ce817) removes the regex entirely, injects PlatformLocation, and compares new URL(locationHref).origin against new URL(req.url, locationOrigin).origin, skipping the header when origins differ and swallowing invalid URLs in a try/catch. The same PR updated the HTTP security guide to state the interceptor now sends the header on relative and same-origin URLs only.

Know when Angular gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

vuln.today AI 3.1 LOW

Network-delivered but AC:H due to required parsing-gap crafting plus app passing untrusted URLs and attacker CORS permitting the header; UI:R as a victim session is needed; direct impact is leakage of one token (C:L).

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

DescriptionCVE.org

An incomplete fix for GHSA-58c5-g7wp-6w37 (CVE-2025-66035) in @angular/common's HTTP Client (HttpClient) allows Cross-Site Request Forgery (XSRF) tokens to be leaked to attacker-controlled cross-origin domains when requests use URLs that exploit parsing discrepancies between regular expressions and the browser's WHATWG URL parser.

Technical Description

To address CVE-2025-66035, xsrfInterceptorFn introduced a regular expression (const ABSOLUTE_URL_REGEX = /^(?:https?:)?\/\//i) to detect and skip absolute and protocol-relative URLs before attaching the X-XSRF-TOKEN header.

However, browsers resolve request URLs passed to fetch() and XMLHttpRequest.open() using the WHATWG URL parser. For http: and https: schemes, the WHATWG URL standard performs several normalizations prior to resolving the authority/origin:

  • Backslashes (\) are treated as forward slashes (/) - e.g., /\evil.example/x, \\evil.example/x, \/evil.example/x, https:\\evil.example/x, https:/\evil.example/x.
  • Leading and trailing C0 control characters and spaces (<= 0x20) are stripped - e.g., ' //evil.example/x', '\0//evil.example/x', '\x1f//evil.example/x'.
  • ASCII tab (\t), newline (\n), and carriage return (\r) characters are removed anywhere in the input - e.g., '/\t/evil.example/x', '/\n/evil.example/x', 'htt\tps://evil.example/x'.

Because these URLs do not match /^(?:https?:)?\/\//i, xsrfInterceptorFn treats them as relative same-origin URLs and attaches the X-XSRF-TOKEN header, while the browser resolves and dispatches the request to the cross-origin host (evil.example).

Note: Angular 21.0.3+ and 22.x replaced the regular expression with a WHATWG new URL(req.url, locationOrigin) origin comparison in #65683 and were already unaffected. However, the 20.3.x LTS branch retained the regular expression until 20.3.34.

Impact

The token leakage bypasses Angular's built-in XSRF protection on affected versions, allowing an attacker to capture the user's valid X-XSRF-TOKEN header if their server permits the request and custom header via CORS. Once obtained, the attacker can perform Cross-Site Request Forgery (CSRF) attacks against the victim user's session.

Attack Preconditions

  1. The victim's Angular application must have XSRF protection enabled (enabled by default in HttpClient).
  2. The attacker must be able to make the application send a state-changing HTTP request (e.g., POST, PUT, DELETE, PATCH) to a URL they control (such as /\attacker.example/api or //attacker.example/api).

Patches

The issue is resolved by parsing and comparing the request URL's origin against the application's current origin using the standard URL constructor (new URL(req.url, locationOrigin)).

  • 21.0.3 (and all 22.x releases)
  • 20.3.34

Workarounds

If you cannot immediately upgrade to a patched version:

  • Validate and normalize outgoing request URLs using new URL(url, window.location.origin) and verify that parsedUrl.origin === window.location.origin before passing dynamic URLs to mutating HttpClient requests.
  • Avoid passing untrusted or user-controlled URLs to HttpClient mutating methods.

Threat Intelligence Overview

Prevalence
High
core HTTP module of the widely-deployed Angular enterprise web framework
Threat Intel
1
1 source
Data Quality
2 sources
Confidence: Low
CVE.org GHSA GitHub

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC No
EPSS N/A
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

Attack Technique

Cross-Site Request Forgery exploits the automatic credential inclusion behavior of web browsers.

Affected Products (CPE)CVE.org

pkg:npm/@angular_common
pkg:npm/@angular_common
pkg:npm/@angular_common
CVE-2026-88060 HIGH POC
8.6 Sep 10

Cross-site scripting via Angular's server-side rendering package (@angular/platform-server) allows arbitrary JavaScript

CVE-2026-88058 HIGH POC
8.6 Sep 10

Cross-site scripting in Angular's server-side rendering engine (`@angular/platform-server`) allows arbitrary JavaScript

CVE-2026-88056 HIGH POC
8.6 Sep 10

Server-Side Rendering in Angular's @angular/platform-server leaks server-side credentials to attacker-controlled origins

CVE-2025-66412 HIGH
8.5 Dec 01

Stored XSS in the Angular Template Compiler (npm package @angular/compiler) allows an authenticated attacker who can per

CVE-2026-22610 HIGH
8.5 Jan 10

Cross-site scripting in Angular's Template Compiler allows attackers to inject arbitrary JavaScript through unsanitized

CVE-2026-101895 HIGH
8.7 Sep 28

An unauthenticated remote attacker can lock up an Angular server-side rendering process by submitting HTML that contains

CVE-2025-62427 HIGH
8.7 Oct 16

Server-side request forgery in Angular's @angular/ssr package (all versions from 19.0.0-next.0 before 19.2.18, 20.0.0-ne

CVE-2026-50178 HIGH
8.7 Jun 22

Command injection via untrusted Markdown rendering in the Angular Language Service VS Code extension (versions prior to

CVE-2026-49241 HIGH
8.7 Jun 22

Arbitrary code execution in the Angular Language Service VS Code extension prior to 21.2.4 allows attackers to silently

CVE-2026-41423 HIGH
8.7 May 08

Server-Side Request Forgery in Angular's @angular/platform-server (SSR) lets remote unauthenticated attackers hijack the

CVE-2026-101896 HIGH
8.2 Sep 30

Denial of service in the npm package @angular/router when Server-Side Rendering (SSR) is enabled on Node.js allows an un

CVE-2026-27970 HIGH
7.6 Feb 26

Cross-site scripting in Angular's internationalization (i18n) pipeline allows attacker-controlled JavaScript to execute

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