Angular HttpClient
CVE-2026-111753
MEDIUM
Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessInduce app to send crafted URL
-
DeliveryUse backslash or control-char URL bypass
-
ExploitRegex misclassifies URL as same-origin
-
ExecutionBrowser attaches X-XSRF-TOKEN cross-origin
-
ImpactCapture 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. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – 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
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
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).
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
- The victim's Angular application must have XSRF protection enabled (enabled by default in
HttpClient). - 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/apior//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 all22.xreleases)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 thatparsedUrl.origin === window.location.originbefore passing dynamic URLs to mutatingHttpClientrequests. - Avoid passing untrusted or user-controlled URLs to
HttpClientmutating methods.
Threat Intelligence Overview
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.
What every action level means
Attack Technique
Cross-Site Request Forgery exploits the automatic credential inclusion behavior of web browsers.
Affected Products (CPE)CVE.org
Cross-site scripting via Angular's server-side rendering package (@angular/platform-server) allows arbitrary JavaScript
Cross-site scripting in Angular's server-side rendering engine (`@angular/platform-server`) allows arbitrary JavaScript
Server-Side Rendering in Angular's @angular/platform-server leaks server-side credentials to attacker-controlled origins
Stored XSS in the Angular Template Compiler (npm package @angular/compiler) allows an authenticated attacker who can per
Cross-site scripting in Angular's Template Compiler allows attackers to inject arbitrary JavaScript through unsanitized
An unauthenticated remote attacker can lock up an Angular server-side rendering process by submitting HTML that contains
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
Command injection via untrusted Markdown rendering in the Angular Language Service VS Code extension (versions prior to
Arbitrary code execution in the Angular Language Service VS Code extension prior to 21.2.4 allows attackers to silently
Server-Side Request Forgery in Angular's @angular/platform-server (SSR) lets remote unauthenticated attackers hijack the
Denial of service in the npm package @angular/router when Server-Side Rendering (SSR) is enabled on Node.js allows an un
Cross-site scripting in Angular's internationalization (i18n) pipeline allows attacker-controlled JavaScript to execute
GHSA-jfgx-762w-99vr
CVE.org
Exploit-DB