Nuxt: Incomplete fix for GHSA-934w-87qh-qr26: a `javascript:` URL prefixed with an ASCII control character executes from `<NuxtLink>` when `pages` is disabled
Published 22 Oct 2026 · Updated 22 Oct 2026
Affected package
- Affected
- <4.6.0
- Fixed in
- 4.6.0
npm install nuxt@4.6.0Details
Impact
An application that renders <NuxtLink :to="..."> with a value it does not control can be made to render an anchor whose href executes script in the application's origin when clicked.
This is an incomplete fix for GHSA-934w-87qh-qr26 (CVE-2026-53722). It only affects applications running without a pages/ directory, where pages resolves to false and Nuxt registers its own router in place of vue-router. Applications using vue-router are not affected.
Prefixing javascript: with an ASCII C0 control character, for example %01, meant the value was not recognised as having a protocol. It was classified as an internal route and so never reached the protocol check added in GHSA-934w-87qh-qr26, and the router used for pages: false passed it through to the rendered href unchanged. Browsers strip the leading control character and run the result as a script URL.
Both <NuxtLink custom> and the default anchor are affected, and the href is present in the server-rendered HTML.
Mitigating factors
- The application must have
pagesdisabled (nopages/directory, orpages: false). - The application must bind untrusted input to
:to. - A victim must click the rendered link.
Affected versions
nuxt <4.6.0, including all Nuxt 3 releases. Versions before 4.4.7 and 3.21.7 are also affected by GHSA-934w-87qh-qr26.
Patches
Fixed in nuxt@4.6.0. Nuxt 3 reached end of life on 31 July 2026 and will not receive a fix.
Anchor href values are now checked for script-capable protocols wherever they are rendered, including the router used when pages is disabled. Protocol detection also moved to the platform URL parser, so a URL is classified the same way the browser will read it.
Workarounds
Upgrade to nuxt@4.6.0 or later. If you cannot upgrade, including on Nuxt 3, validate values before binding them to :to, for example by rejecting anything that is not a path beginning with a single /.
Is GHSA-jjm6-p2m9-9w4x in any of your client repos?
Checking one package by hand is fine. Checking it across forty client projects is not. NPMscan reads the lockfiles in every GitHub repo you pick, finds each project with an affected nuxt, and gives you the command that fixes it.
References
- Linkgithub.com/nuxt/nuxt/security/advisories/GHSA-jjm6-p2m9-9w4x
- Advisorynvd.nist.gov/vuln/detail/CVE-2026-114130
- Linkgithub.com/nuxt/nuxt/pull/36459
- Linkgithub.com/nuxt/nuxt/commit/355ed9565127ff9b1453deb7160059ed55b3cb85
- Linkgithub.com/nuxt/nuxt/commit/df46569d5d3c7a7799de54c328634168fbae70bb
- Packagegithub.com/nuxt/nuxt
- Linkgithub.com/nuxt/nuxt/releases/tag/v4.6.0
Advisory data from OSV.dev (opens OSV.dev in a new tab), refreshed daily.