CVE-2026-56326: Nuxt URL-handling Weaknesses Vulnerability
MODERATECVE-2026-56326 is a MODERATE (CVSS 6.1) url-handling weaknesses vulnerability (CWE-601: URL Redirection to Untrusted Site ('Open Redirect')) affecting Nuxt libraries in the npm ecosystem. The issue involves url-handling weaknesses in `navigateto` and `reloadnuxtapp`: ssr open redirect, client-side script execution via the `open` option, and protocol-relative bypass in `reloadnuxtapp`. Remediation is available by upgrading affected packages to version 4.4.7, 3.21.7.
CVE-2026-56326 at a Glance
Security Impact
CVSS: 6.1
The security impact metrics below are parsed directly from the CVSS v3.1 vector string (CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N).
How to Fix CVE-2026-56326
To remediate this vulnerability, upgrade all affected Nuxt dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.
npm install nuxt@4.4.7
npm install nuxt@3.21.7
Run the following command in your project directory to verify that all resolved dependencies use the patched release:
npm ls nuxt
How to Check if You Are Affected
To determine whether your Node.js application is affected by CVE-2026-56326, inspect your project dependencies using npm:
npm ls nuxt
Analyze the terminal output to locate any version of Nuxt in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 4.4.7), your application is affected.
Note: The npm ls nuxt command inspects dependencies declared in your package.json and lockfile; it does not perform automated runtime dynamic scanning.
Technical Details
Vulnerability Mechanism & Technical Analysis
This vulnerability is classified under CWE-601: URL Redirection to Untrusted Site ('Open Redirect'), where the web application accepts a user-controlled input that specifies a link to an external site, and uses that link in a redirect. In Nuxt, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.
Source Advisory Statement
CVE-2026-56326 Affected Nuxt Versions
2 component(s)References
Frequently Asked Questions
What is CVE-2026-56326?
Which Nuxt versions are affected?
What version fixes CVE-2026-56326?
Is nuxt affected?
What is the CVSS score of CVE-2026-56326?
What CWE is associated with CVE-2026-56326?
How can I check npm dependencies for CVE-2026-56326?
Machine-readable OSV JSON
OSV v1.5 Schema
{
"schema_version" : "1.4.0",
"id" : "GHSA-c9cv-mq2m-ppp3",
"modified" : "2026-09-18T20:42:57Z",
"published" : "2026-06-16T13:47:52Z",
"aliases" : [ "CVE-2026-56326" ],
"summary" : "Nuxt: URL-handling weaknesses in `navigateTo` and `reloadNuxtApp`: SSR open redirect, client-side script execution via the `open` option, and protocol-relative bypass in `reloadNuxtApp`",
"details" : "### Summary\n\nThree weaknesses in Nuxt's client-navigation URL handling, all reachable\nfrom documented public APIs (`navigateTo` and `reloadNuxtApp`):\n\n1. **(CVE-2026-56326) SSR open redirect in `navigateTo` via path-normalisation bypass.** \n `navigateTo` decided whether a target was external by inspecting the raw\n input with `hasProtocol(..., { acceptRelative: true })`. Inputs such as\n `/..//evil.com`, `/.//evil.com`, `/%2e%2e//evil.com`, or\n `/app/..//evil.com` slipped past that check because they start with\n `/`, but WHATWG URL parsing then normalised them to the\n protocol-relative pathname `//evil.com`. The normalised value was\n written to the `Location` response header and into the\n `<meta http-equiv=\"refresh\">` body of the SSR redirect page, so a\n victim's browser would resolve the redirect cross-origin to the\n attacker's host.\n\n2. **(CVE-2026-56698) Client-side script execution via `navigateTo({ open: ... })`.** The\n client-side early-open handler called `window.open(toPath, ...)` without\n applying the `isScriptProtocol` check that gates the normal `navigateTo`\n path. A target of `javascript:...` (or another script-capable scheme)\n passed to `navigateTo(url, { open: { ... } })` therefore executed in the\n application's origin instead of being rejected.\n\n3. **(CVE-2026-56697) Open redirect in `reloadNuxtApp` via protocol-relative bypass.**\n `reloadNuxtApp({ path })` rejects script-capable protocols by parsing\n the path with `new URL(path, window.location.href)` and checking the\n resolved `protocol` against `isScriptProtocol`. Protocol-relative paths\n such as `//evil.com` resolve to the current page's protocol (`https:`),\n which passes that check; the value is then assigned to\n `window.location.href`, which the browser treats as a cross-origin\n redirect. This is the same protocol-relative bypass family as (1), in\n a different sink.\n\n### Impact\n\nFor (1), the practical risk is phishing or OAuth-code theft against any\nNuxt app that forwards user-controlled input (for example a `?next=`\nquery parameter on a login route) into `navigateTo` on the server. The\nframework documents that `navigateTo` blocks external hosts unless\n`external: true` is passed, so maintainers commonly rely on it as the\nsafe path for post-login redirects.\n\nFor (2), any app that passes a user-controlled URL into\n`navigateTo(url, { open: { ... } })` was vulnerable to reflected XSS in\nthe application's first-party origin.\n\nFor (3), any app that forwards user-controlled input into\n`reloadNuxtApp({ path })` could be redirected cross-origin for phishing\nor OAuth-code theft, even on releases that already shipped the\n`isScriptProtocol` guard added by [#35115](https://github.com/nuxt/nuxt/pull/35115).\n\n### Patches\n\nFixed in `nuxt@4.4.7` and backported to `nuxt@3.21.7`. The three sinks\nare addressed by:\n\n- Path-normalisation bypass in `navigateTo`:\n - 4.x: commit [`2cce6fb0`](https://github.com/nuxt/nuxt/commit/2cce6fb02e621196d56df92e05594e07469b5a6d)\n - 3.x: commit [`1f2dd5e7`](https://github.com/nuxt/nuxt/commit/1f2dd5e78c77576437138e97671965573c232835)\n- `navigateTo({ open })` script-protocol guard:\n - 4.x: [#35206](https://github.com/nuxt/nuxt/pull/35206) (commit [`3394716d`](https://github.com/nuxt/nuxt/commit/3394716d4a913cba904b028df5338f2aead50032))\n - 3.x: commit [`62fc32ed`](https://github.com/nuxt/nuxt/commit/62fc32eddf648b00a3890141e0235d2a222b024d)\n- Protocol-relative bypass in `reloadNuxtApp`:\n - 4.x: commit [`e447a793`](https://github.com/nuxt/nuxt/commit/e447a793c47766834f7497f8412a76cd56fd8ee1)\n - 3.x: commit [`6497d99d`](https://github.com/nuxt/nuxt/commit/6497d99dd106254abd089f6a263d7773869a343b)\n\n### Workarounds\n\n- For (1): validate redirect targets before passing them to `navigateTo`,\n for example reject any input where\n `new URL(target, 'http://localhost').pathname` starts with `//`, or\n only accept a known allow-list of paths.\n- For (2): reject any user-controlled URL whose protocol is not in an\n allow-list (typically just `http:` and `https:`) before passing it to\n `navigateTo({ open: ... })`.\n- For (3): same shape as (1). Reject paths starting with `//` (or where\n `new URL(path, window.location.href).host !== window.location.host`)\n before passing to `reloadNuxtApp({ path })`.\n\n### References\n\n- CWE-601: URL Redirection to Untrusted Site ('Open Redirect')\n- CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')\n\n### Credits\n\nReported by Anthropic / Claude as `ANT-2026-S08HN6DH` through Anthropic's\ncoordinated vulnerability disclosure programme.\n\nThe `reloadNuxtApp` protocol-relative bypass (sink 3) was independently\nreported by [@alcls01111](https://github.com/alcls01111) via GitHub's\ncoordinated disclosure flow (`GHSA-w7fp-2cfv-4837`), closed as a\nduplicate of this advisory.",
"severity" : [ {
"type" : "CVSS_V3",
"score" : "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N"
}, {
"type" : "CVSS_V4",
"score" : "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:L/VI:L/VA:N/SC:N/SI:L/SA:N"
} ],
"affected" : [ {
"package" : {
"ecosystem" : "npm",
"name" : "nuxt"
},
"ranges" : [ {
"type" : "ECOSYSTEM",
"events" : [ {
"introduced" : "4.0.0"
}, {
"fixed" : "4.4.7"
} ]
} ]
}, {
"package" : {
"ecosystem" : "npm",
"name" : "nuxt"
},
"ranges" : [ {
"type" : "ECOSYSTEM",
"events" : [ {
"introduced" : "3.5.0"
}, {
"fixed" : "3.21.7"
} ]
} ]
} ],
"references" : [ {
"type" : "WEB",
"url" : "https://github.com/nuxt/nuxt/security/advisories/GHSA-c9cv-mq2m-ppp3"
}, {
"type" : "ADVISORY",
"url" : "https://nvd.nist.gov/vuln/detail/CVE-2026-56326"
}, {
"type" : "ADVISORY",
"url" : "https://nvd.nist.gov/vuln/detail/CVE-2026-56697"
}, {
"type" : "ADVISORY",
"url" : "https://nvd.nist.gov/vuln/detail/CVE-2026-56698"
}, {
"type" : "WEB",
"url" : "https://github.com/nuxt/nuxt/pull/35115"
}, {
"type" : "WEB",
"url" : "https://github.com/nuxt/nuxt/pull/35206"
}, {
"type" : "WEB",
"url" : "https://github.com/nuxt/nuxt/commit/1f2dd5e78c77576437138e97671965573c232835"
}, {
"type" : "WEB",
"url" : "https://github.com/nuxt/nuxt/commit/2cce6fb02e621196d56df92e05594e07469b5a6d"
}, {
"type" : "WEB",
"url" : "https://github.com/nuxt/nuxt/commit/3394716d4a913cba904b028df5338f2aead50032"
}, {
"type" : "WEB",
"url" : "https://github.com/nuxt/nuxt/commit/62fc32eddf648b00a3890141e0235d2a222b024d"
}, {
"type" : "WEB",
"url" : "https://github.com/nuxt/nuxt/commit/6497d99dd106254abd089f6a263d7773869a343b"
}, {
"type" : "WEB",
"url" : "https://github.com/nuxt/nuxt/commit/e447a793c47766834f7497f8412a76cd56fd8ee1"
}, {
"type" : "PACKAGE",
"url" : "https://github.com/nuxt/nuxt"
}, {
"type" : "WEB",
"url" : "https://www.vulncheck.com/advisories/nuxt-cross-site-scripting-via-navigateto-open-option"
}, {
"type" : "WEB",
"url" : "https://www.vulncheck.com/advisories/nuxt-open-redirect-via-protocol-relative-paths-in-reloadnuxtapp"
}, {
"type" : "WEB",
"url" : "https://www.vulncheck.com/advisories/nuxt-server-side-open-redirect-via-path-normalization-bypass-in-navigateto"
} ],
"database_specific" : {
"cwe_ids" : [ "CWE-601", "CWE-79" ],
"severity" : "MODERATE",
"github_reviewed" : true,
"github_reviewed_at" : "2026-06-16T13:47:52Z",
"nvd_published_at" : "2026-06-22T22:16:52Z"
}
}