CVE-2026-56326: Nuxt URL-handling Weaknesses Vulnerability

MODERATE
Advisory Identifier: GHSA-c9cv-mq2m-ppp3
CVSS 6.1
CWE-601 CWE-79
Published
Advisory Summary

CVE-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

CVE Identifier CVE-2026-56326
GHSA Identifier GHSA-c9cv-mq2m-ppp3
Severity MODERATE
CVSS v3.1 Base Score 6.1
CWE Classification CWE-601: URL Redirection to Untrusted Site ('Open Redirect')
Affected Product Nuxt
Package Ecosystem npm
Published Date
Last Updated

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

Attack Vector Network (AV:N)
Attack Complexity Low (AC:L)
Privileges Required None (PR:N)
User Interaction Required (UI:R)
Scope Changed (S:C)
Confidentiality Low (C:L)
Integrity Low (I:L)
Availability None (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.

nuxt fixed: 4.4.7
npm install nuxt@4.4.7
nuxt fixed: 3.21.7
npm install nuxt@3.21.7
Verify Direct and Transitive Dependencies

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

### Summary Three weaknesses in Nuxt's client-navigation URL handling, all reachable from documented public APIs (`navigateTo` and `reloadNuxtApp`): 1. **(CVE-2026-56326) 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. **(CVE-2026-56698) 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. **(CVE-2026-56697) 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.

CVE-2026-56326 Affected Nuxt Versions

2 component(s)
Fixed Versions:
4.4.73.21.7
Product / Package Ecosystem Affected Versions Fixed Version
nuxt
npm
≥ 4.0.0
< 4.4.7
4.4.7
nuxt
npm
≥ 3.5.0
< 3.21.7
3.21.7

References

GitHub Advisory / Wiki ADVISORY
https://github.com/nuxt/nuxt/security/advisories/GHSA-c9cv-mq2m-ppp3
NVD — CVE-2026-56326 NVD
https://nvd.nist.gov/vuln/detail/CVE-2026-56326
NVD — CVE-2026-56326 NVD
https://nvd.nist.gov/vuln/detail/CVE-2026-56697
NVD — CVE-2026-56326 NVD
https://nvd.nist.gov/vuln/detail/CVE-2026-56698
Nuxt Source Repository REPOSITORY
https://github.com/nuxt/nuxt/pull/35115
Nuxt Source Repository REPOSITORY
https://github.com/nuxt/nuxt/pull/35206
Security Fix Commit FIX COMMIT
https://github.com/nuxt/nuxt/commit/1f2dd5e78c77576437138e97671965573c232835
Security Fix Commit FIX COMMIT
https://github.com/nuxt/nuxt/commit/2cce6fb02e621196d56df92e05594e07469b5a6d
Security Fix Commit FIX COMMIT
https://github.com/nuxt/nuxt/commit/3394716d4a913cba904b028df5338f2aead50032
Security Fix Commit FIX COMMIT
https://github.com/nuxt/nuxt/commit/62fc32eddf648b00a3890141e0235d2a222b024d
Security Fix Commit FIX COMMIT
https://github.com/nuxt/nuxt/commit/6497d99dd106254abd089f6a263d7773869a343b
Security Fix Commit FIX COMMIT
https://github.com/nuxt/nuxt/commit/e447a793c47766834f7497f8412a76cd56fd8ee1
Nuxt Source Repository REPOSITORY
https://github.com/nuxt/nuxt
www.vulncheck.com/advisories/nuxt-cro... WEB
https://www.vulncheck.com/advisories/nuxt-cross-site-scripting-via-navigateto-open-option
www.vulncheck.com/advisories/nuxt-ope... WEB
https://www.vulncheck.com/advisories/nuxt-open-redirect-via-protocol-relative-paths-in-reloadnuxtapp
www.vulncheck.com/advisories/nuxt-ser... WEB
https://www.vulncheck.com/advisories/nuxt-server-side-open-redirect-via-path-normalization-bypass-in-navigateto

Frequently Asked Questions

What is CVE-2026-56326?
CVE-2026-56326 is a security vulnerability in Nuxt involving URL-handling weaknesses in `navigateTo` and `reloadNuxtApp`: SSR open redirect, client-side script execution via the `open` option, and protocol-relative bypass in `reloadNuxtApp` under CWE-601: URL Redirection to Untrusted Site ('Open Redirect').
Which Nuxt versions are affected?
Affected versions include releases prior to 4.4.7, 3.21.7 across affected packages: nuxt.
What version fixes CVE-2026-56326?
Upgrading to 4.4.7, 3.21.7 (or the latest patched release for your respective branch) resolves the vulnerability.
Is nuxt affected?
Yes, nuxt is affected in releases prior to 4.4.7, 3.21.7. Upgrade your dependency to 4.4.7, 3.21.7 or later.
What is the CVSS score of CVE-2026-56326?
CVE-2026-56326 has a CVSS v3.1 base score of 6.1 (MODERATE) with vector string CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N.
What CWE is associated with CVE-2026-56326?
CVE-2026-56326 is classified under 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.).
How can I check npm dependencies for CVE-2026-56326?
Run the dependency tree command: 'npm ls nuxt'. This command lists direct and transitive dependencies in your build configuration so you can verify if a vulnerable version is resolved.
Machine-readable OSV JSON OSV v1.5 Schema
Normalized schema output
{
  "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"
  }
}