Skip to main content

Angular SSR CVE-2026-111754

MEDIUM
URL Redirection to Untrusted Site (Open Redirect) (CWE-601)
2026-10-20 https://github.com/angular/angular GHSA-w739-gvwx-grc3
View

Attack ChainAIDerived

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

  1. Access
    Craft dot-segment URL on SSR site
  2. Delivery
    Victim clicks link to trusted origin
  3. Exploit
    Proxy passes path unnormalized to SSR
  4. Execution
    resolveUrl check bypassed, pathname becomes //evil.test
  5. Persist
    Server returns 302 Location: //evil.test
  6. Impact
    Browser redirects off-origin to attacker domain

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V3 - Web Frontend Security Redirect URL validation
MITRE ATT&CK

1 technique across 1 tactic: Initial Access

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

Exploitation requires all of: (1) the application runs Server-Side Rendering using both @angular/platform-server and @angular/ssr (pure client-side SPAs are not vulnerable because ServerPlatformLocation is server-only); (2) the router exposes parameter routes with wildcard/child segments (e.g. /:tenant matching . and serializing secondary outlet groups (//evil.test) into /.//evil.test) OR the app passes user-controlled navigation targets such as a returnUrl; and (3) the upstream reverse proxy (Nginx, Cloudflare, AWS ALB) forwards semicolons and dot-segments without normalizing or stripping them. Limiting factors that reduce real-world risk: the victim must click the attacker-crafted link (user interaction required), affected versions are Angular 20.x-22.x in the specified ranges, and an edge proxy that normalizes paths or rejects /.//, /..//, /.;/ sequences neutralizes the attack. Because a common !returnUrl.startsWith('//') guard treats these payloads as safe relative paths, application-level allowlists do not provide protection.

Impact

This is a CWE-601 open redirect in @angular/platform-server's SSR URL resolution (resolveUrl/parseUrl), where a pre-normalization startsWith('//') check is bypassed by dot-segment payloads (/.//evil.test, /.;/(//evil.test)) that WHATWG parsing later collapses into a //evil.test pathname emitted in a 302 Location header. No CVSS score or vector was provided in the input, so attack-vector/complexity/privilege signals cannot be read from NVD and are assessed independently below. No EPSS score, no CISA KEV listing, and no public exploit were supplied, so by the precision rules the status is 'no public exploit identified at time of analysis' - though the advisory itself includes working payload examples, which lowers the practical barrier to weaponization. The vendor (angular/angular) confirms the flaw and has shipped fixes, so this is a genuine, confirmed issue, but its real-world priority is moderate rather than critical: exploitation requires victim interaction (clicking a crafted link), SSR to be enabled, specific parameter/wildcard route shapes or user-controlled returnUrl handling, AND upstream reverse proxies that pass dot-segments/semicolons unnormalized. Pure client-side SPAs are explicitly unaffected. The description characterizes the attacker as 'unauthenticated remote,' but with no CVSS vector in the input this auth characterization is vendor-stated rather than NVD-confirmed. Net: a real, patch-worthy phishing-enablement bug whose severity is tempered by the conjunction of preconditions, not a drop-everything emergency.

Exploit ScenarioDerived

An attacker sends a victim a link to a legitimate SSR Angular site such as https://example.com/.;/(//evil.test) (or abuses a returnUrl=/.//evil.test parameter that passes a naive !startsWith('//') allowlist). The SSR server resolves the dot-segments, stores pathname //evil.test, and responds with HTTP 302 Location: //evil.test, and the victim's browser follows the protocol-relative redirect off-origin to the attacker's domain for credential phishing or malware delivery. The advisory publishes exact working payloads, so no separate exploit development is required even though no packaged public exploit tool is cited.

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

An open redirect in @angular/platform-server lets remote attackers craft request URLs that make Angular's server-side rendering layer emit a 302 response with a protocol-relative Location header (//evil.test), sending users off-origin. Only applications actively using SSR with @angular/platform-server and @angular/ssr are affected (pure client-side SPAs are not), and the router must expose parameter/wildcard routes or pass user-controlled navigation targets such as a returnUrl. Successful exploitation requires the victim to follow the crafted link and requires the upstream reverse proxy to pass dot-segments and semicolons unnormalized; no public exploit code or confirmed active exploitation was identified at time of analysis, and vendor patches are available.

RemediationAI

Vendor-released patch: upgrade @angular/platform-server to 22.2.1 (for 22.x), 21.2.25 (for 21.x), or 20.3.33 (for 20.x), as documented in the release tags https://github.com/angular/angular/releases/tag/v22.2.1, https://github.com/angular/angular/releases/tag/v21.2.25 and https://github.com/angular/angular/releases/tag/v20.3.33; the fixes land via PRs 71077, 71078 and 71079 and commits 450af9c8, 83944fc8, 928dcfd2 and d7d81e18 (advisory: https://github.com/angular/angular/security/advisories/GHSA-w739-gvwx-grc3). No fixed version is published for the <= 19.2.25 line, so those deployments should either upgrade to a patched major or apply the compensating controls below. Until patching, block the payload shape at the edge: on Nginx reject request URIs matching /\.(/|\.\.)?/ style sequences such as /.//, /..// and /.;/ with a 400 (trade-off: legitimate paths containing dot-segments or semicolons will also be refused, so scope the rule to SSR routes); on Cloudflare/AWS WAF add equivalent path-normalization rules; and have the gateway strip or reject any Location response header beginning with // from the SSR upstream (trade-off: legitimate protocol-relative redirects, if any are intended, will break). Enabling strict path normalization at the proxy also neutralizes the bypass, but verify it does not alter routing for encoded or semicolon-bearing URLs.

Affected Packages

npm @angular/platform-server fix: 20.3.33, 21.2.25, 22.2.1

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 is a CWE-601 URL redirection to an untrusted site, rooted in the ordering of validation versus normalization. In SSR mode, URL resolution and platform navigation are handled by ServerPlatformLocation, which calls resolveUrl (or parseUrl in the v20 line) from packages/platform-server/src/url.ts. That function previously rejected protocol-relative URLs only by testing the raw input string with urlStr.startsWith('//') - a check performed before WHATWG URL parsing collapses dot-segments. Payloads such as /.//evil.test or the router-serialized form /.;/(//evil.test) pass the raw-string test because they begin with a single slash, but after WHATWG normalization the resulting URL.pathname becomes //evil.test. ServerPlatformLocation then stores that pathname, and when @angular/ssr detects a mismatch between the rendered URL and the router's final location state, it writes the unnormalized pathname into the HTTP Location header; browsers interpret a leading // as a protocol-relative authority and navigate to the attacker's domain. Because the bypass occurs below the router layer, application-level allowlists that check !returnUrl.startsWith('//') treat these payloads as safe relative paths. The upstream fix adds an isDisallowedProtocolRelative() helper that re-validates the *normalized* resolved.pathname (throwing NG05702 when allowProtocolRelative is false) at multiple exit points in resolveUrl, plus regression tests covering //, ///, /.//, /..//, /.\/ and absolute-URL variants. Affected package coordinates are pkg:npm/@angular_platform-server.

Know when Open Redirect 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 6.1 MEDIUM

Remotely reachable crafted URL (AV:N/AC:L/PR:N), victim must follow the redirect (UI:R), and off-origin navigation crosses a security authority (S:C) enabling phishing (C:L/I:L).

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

Estimated by vuln.today — no official severity rating has been published for this CVE yet.

DescriptionCVE.org

An open redirect vulnerability was identified in @angular/platform-server when Server-Side Rendering (SSR) is enabled.

When Angular SSR renders an incoming request, URL resolution and platform navigation are managed by ServerPlatformLocation using resolveUrl (or parseUrl in v20). While resolveUrl rejected protocol-relative URLs whose raw string directly started with //, this check ran *prior* to WHATWG URL normalization.

When a request URL includes a popping dot-segment followed by multiple slashes (such as /.//evil.test or serialized from router route shapes like /.;/(//evil.test)), the input bypassed the initial urlStr.startsWith('//') check. Subsequent WHATWG URL parsing resolved the dot-segments and resulted in a pathname starting with // (//evil.test).

Consequently, ServerPlatformLocation stored pathname = '//evil.test'. When @angular/ssr detected a mismatch between the rendered URL and the router's final location state, it emitted the unnormalized pathname into the HTTP Location response header, producing an HTTP 302 redirect with Location: //evil.test, which browsers resolve as a protocol-relative navigation off-origin.

Impact

Successful exploitation allows an unauthenticated remote attacker to craft URLs that trick Angular SSR into redirecting users to an arbitrary external domain.

  • Bypasses Application-Level Guards: Common application-level validation routines (such as checking !returnUrl.startsWith('//') before invoking router.navigateByUrl) accept /.//evil.test or /.;/(//evil.test) as a safe relative path, allowing attackers to bypass redirect allowlists.
  • Client-side SPAs Unaffected: Pure client-side Angular applications (Single Page Applications without SSR) are not vulnerable, as ServerPlatformLocation is only utilized in server-side execution environments.

Attack Preconditions & Vulnerable Configurations

An application is affected if the following conditions are met:

  • SSR Enabled: The application runs in a Server-Side Rendering environment using @angular/platform-server and @angular/ssr.
  • Parameter Route Shapes: The router contains parameter routes with wildcard or child segments (e.g. /:tenant matching . and serializing secondary outlet groups (//evil.test) to /.//evil.test), or passes user-provided navigation targets (e.g. returnUrl).
  • Reverse Proxy Passthrough: Upstream reverse proxies (Nginx, Cloudflare, ALB) pass semicolons (;) or dot-segments without stripping or normalizing them.
Exploit Payload Example

An attacker sends a request targeting a route with parameters and child segments:

http
GET /.;/(//evil.test) HTTP/1.1
Host: example.com

Response:

http
HTTP/1.1 302 Found
Location: //evil.test

The client browser resolves //evil.test protocol-relatively and redirects the user away from example.com to evil.test.

Patches

The issue is resolved by updating resolveUrl (and parseUrl in v20) in @angular/platform-server to verify that the normalized URL pathname does not start with // when allowProtocolRelative is false.

  • 22.2.1
  • 21.2.25
  • 20.3.33

Workarounds & Mitigations

If you cannot immediately upgrade to a patched version, apply one of the following mitigations at your edge reverse proxy or WAF:

  1. Reject Paths with Dot-Segments Followed by Slashes:

Configure your reverse proxy (e.g., Nginx, Cloudflare, AWS WAF) to block requests containing /.//, /..//, or /.;/:

nginx
# Nginx example: reject suspicious path normalization sequences
   if ($request_uri ~* "(\n/\.\/|\/\.\;)") {
       return 400;
   }
  1. Sanitize Redirect Headers:

Ensure edge proxies or API gateways rewrite or disallow protocol-relative (//) Location response headers originating from the SSR upstream.

Threat Intelligence Overview

Prevalence
Medium
Angular is widely used, but only the SSR platform-server subset is affected
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.

Affected Products (CPE)CVE.org

pkg:npm/@angular_platform-server
pkg:npm/@angular_platform-server
pkg:npm/@angular_platform-server
pkg:npm/@angular_platform-server
CVE-2017-1000117 HIGH POC
8.8 Oct 05

A malicious third-party can give a crafted "ssh://..." URL to an unsuspecting victim, and an attempt to visit the URL ca

CVE-2024-52875 HIGH POC
8.8 Jan 31

GFI Kerio Control versions 9.2.5 through 9.4.5 contain an HTTP response splitting vulnerability in the dest parameter of

CVE-2016-5385 HIGH POC
8.1 Jul 19

PHP through 7.0.8 does not attempt to address RFC 3875 section 4.1.18 namespace conflicts and therefore does not protect

CVE-2013-2248 MEDIUM POC
5.8 Jul 20

Multiple open redirect vulnerabilities in Apache Struts 2.0.0 through 2.3.15 allow remote attackers to redirect users to

CVE-2018-11784 MEDIUM POC
4.3 Oct 04

When the default servlet in Apache Tomcat versions 9.0.0.M1 to 9.0.11, 8.5.0 to 8.5.33 and 7.0.23 to 7.0.90 returned a r

CVE-2012-6499 MEDIUM POC
5.8 Jan 12

Open redirect vulnerability in age-verification.php in the Age Verification plugin 0.4 and earlier for WordPress allows

CVE-2015-2863 MEDIUM POC
4.3 Jul 20

Open redirect vulnerability in Kaseya Virtual System Administrator (VSA) 7.x before 7.0.0.29, 8.x before 8.0.0.18, 9.0 b

CVE-2017-3528 MEDIUM POC
5.4 Apr 24

Vulnerability in the Oracle Applications Framework component of Oracle E-Business Suite (subcomponent: Popup windows (li

CVE-2012-0518 MEDIUM
4.7 Oct 16

Unspecified vulnerability in the Oracle Application Server Single Sign-On component in Oracle Fusion Middleware 10.1.4.3

CVE-2024-21641 MEDIUM POC
6.5 Jan 05

Flarum is open source discussion platform software. Rated medium severity (CVSS 6.5), this vulnerability is remotely exp

CVE-2015-5354 MEDIUM POC
5.8 Jul 01

Open redirect vulnerability in Novius OS 5.0.1 (Elche) allows remote attackers to redirect users to arbitrary web sites

CVE-2015-5461 MEDIUM POC
6.4 Jul 08

Open redirect vulnerability in the Redirect function in stageshow_redirect.php in the StageShow plugin before 5.0.9 for

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