GitHub Advisoryadvisory · npm
GHSA-w739-gvwx-grc3 @angular/platform-server: Open Redirect via Protocol-Relative URLs in Server-Side Rendering (SSR)
MEDIUM
Official page ↗
- Aliases
- CVE-2026-111754
- Ecosystem
- npm
- Packages
- @angular/platform-server
- Severity
- Moderate
- CVSS vector
- CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N
- Weaknesses
- CWE-601
- Reviewed
- 2026-10-20
Affected packages
• npm @angular/platform-server: >= 22.0.0, < 22.2.1 → fixed in 22.2.1
• npm @angular/platform-server: >= 21.0.0, < 21.2.25 → fixed in 21.2.25
• npm @angular/platform-server: >= 20.0.0, < 20.3.33 → fixed in 20.3.33
• npm @angular/platform-server: <= 19.2.25 (no fix yet)
Description
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;
}
```
2. Sanitize Redirect Headers:
Ensure edge proxies or API gateways rewrite or disallow protocol-relative (`//`) `Location` response headers originating from the SSR upstream.
Related
Alias · CVE (1)
- CVE-2026-111754 Angular is a development platform for building mobile and desktop web applications using TypeScript/JavaScript and other languages. vulnerability
Weakness · CWE (1)
- CWE-601 URL Redirection to Untrusted Site weakness
References
- https://github.com/angular/angular/security/advisories/GHSA-w739-gvwx-grc3 web
- https://github.com/angular/angular/pull/71077 web
- https://github.com/angular/angular/pull/71078 web
- https://github.com/angular/angular/pull/71079 web
- https://github.com/angular/angular/commit/450af9c813c7660b9bd91e5635f705ee3ed7b32a web
- https://github.com/angular/angular/commit/83944fc8c50e86be90e8ec4184cd15002b5af262 web
- https://github.com/angular/angular/commit/928dcfd2582152655b5559509d057bf6a5a19521 web
- https://github.com/angular/angular/commit/d7d81e189d227108c3b9d39178dbb7389f6f970d web
- https://github.com/angular/angular package
- https://github.com/angular/angular/releases/tag/v20.3.33 web
- https://github.com/angular/angular/releases/tag/v21.2.25 web
- https://github.com/angular/angular/releases/tag/v22.2.1 web