Security changelog
Nuxt has 24 published advisories, 8 high or critical.
When a framework publishes a security advisory, this page tracks the details teams need for patch triage: affected ranges, fixed versions, CVEs, workarounds, severity, and the original advisory. Feature releases and routine changelog noise stay out.
-
Nuxt server islands render
useHeadSafeinput without sanitisationImpact
useHeadSaferestricts head input to an allowlist of safe tags and attributes. For example,bodyAttrsis limited toclassandstyle, event handler attributes are removed, and<script>tags are only kept for JSON types.When
useHeadSafeis called inside a server island (a.server.vuecomponent or page, or a component rendered with<NuxtIsland>), the island renderer serialises the raw input of every head entry into the island response without the option that marks it as safe input.- >= 3.13.0, < 4.6.2
Medium Fixed in 4.6.2
-
Incomplete fix for GHSA-934w-87qh-qr26: a
javascript:URL prefixed with an ASCII control character executes from<NuxtLink>whenpagesis disabledImpact
An application that renders
<NuxtLink :to="...">with a value it does not control can be made to render an anchor whosehrefexecutes 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, wherepagesresolves tofalseand Nuxt registers its own router in place of vue-router.- < 4.6.0
Low Fixed in 4.6.0
-
Route rules are matched against the raw request path, so a percent-encoded segment can bypass
appMiddlewareon dynamic and catch-all routesSummary
Nuxt compared
routeRuleskeys against the raw request path, without decoding percent-encoding, while the router decodes parameters when it resolves a route. A request whose path is percent-encoded can therefore resolve to a page while failing to match the route rule meant to protect it, so the rule’sappMiddlewarenever runs, including during server rendering.- >= 4.0.0, < 4.4.4
- >= 3.11.0, < 3.21.4
Medium Fixed in 3.21.4, 4.4.4
-
Server-side route rules (
redirect,headers,proxy,ssr) are skipped for case-variant paths when routing is case-insensitiveImpact
With the default
router.options.sensitive: false, Nuxt’s page router resolves routes case-insensitively, so/Adminrenders the same page as/admin. On the server, however, route rules were resolved with Nitro’s route-rule matcher, which matches keys case-sensitively. A request whose path differs from a rule key only in letter case therefore rendered the page with none of that rule applied.- >= 4.0.0, < 4.6.2
- >= 3.0.0, < 4.0.0
Medium Fixed in 4.6.2
-
Nuxt dev server discloses project root and workspace UUID via the Chrome DevTools workspace endpoint
Impact
When a Nuxt dev server is bound to a network-reachable interface (for example
nuxt dev --hostfor on-device testing), the default-enabled Chrome DevTools workspace endpointGET /.well-known/appspecific/com.chrome.devtools.jsonreturns the absolute project root (workspace.root, i.e.rootDir) and a persistent per-project workspace UUID.- >= 4.4.7, < 4.5.1
- >= 3.21.7, < 3.21.10
Medium Fixed in 3.21.10, 4.5.1
-
Nuxt route rules silently dropped for mixed-case paths, bypassing appMiddleware auth gates (incomplete fix for CVE-2026-53721)
Impact
Nuxt matches route rules case-insensitively by default (mirroring vue-router’s default
sensitive: falserouting). The fix for GHSA-mm7m-92g8-7m47 / CVE-2026-53721 lowercased the lookup path before matching route rules, but the route-rule keys compiled into the matcher were left verbatim.- >= 4.4.7, < 4.5.1
- >= 3.21.7, < 3.21.10
High Fixed in 3.21.10, 4.5.1
-
Nuxt runtime payload cache discloses another user’s SSR data across users and to unauthenticated clients
Impact
When a page is covered by
routeRulescache/swr/isr, Nuxt enables runtime payload extraction and serves/<page>/_payload.json. On affected versions the renderer stored the SSR payload in the sharedcache:nuxt:payloadstorage under a path-only key (no cookie,authorization, orcache.variesdimension) and, on a later payload request, returned the cached entry before route middleware / page guards ran again.- >= 4.4.0, <= 4.5.0
High Fixed in 4.5.1
-
Unauthenticated CPU exhaustion parsing and hashing the Nuxt island endpoint body before hash validation
Impact
The internal island renderer endpoint (
/__nuxt_island/...) decodes and hashes attacker-controlled request input before it validates the URL-resident hash. An unauthenticatedPOST /__nuxt_island/<name>_<anything>.jsonwith a large JSON body (for example ~4.6 MB / 150k keys) is fully read,destr-parsed, and run throughohashbefore the request is rejected with a 400. Because Nitro runs on a single event loop, this both wastes CPU on the doomed request and delays every concurrent request.- >= 4.0.0, < 4.5.1
- >= 3.1.0, < 3.21.10
High Fixed in 3.21.10, 4.5.1
-
Unauthenticated out-of-memory crash via unbounded v-for expansion in island rendering
Impact
An unauthenticated attacker can crash a Nuxt server that renders any island / server component containing a
v-forover a prop (for examplev-for="n in count"or a<slot v-for>). Because the island URL hash is a non-secret digest of the request, the attacker can compute a valid hash for arbitrary props and send the iterated prop as a large integer. The server then expands thev-forto that many nodes during SSR, allocating memory proportional to the attacker’s number.- >= 4.0.0, < 4.5.1
- >= 3.1.0, < 3.21.10
High Fixed in 3.21.10, 4.5.1
-
Unauthorized Component Instantiation via Server Island Props
Impact
Nuxt server islands accept props via the
/__nuxt_island/endpoint. When an application has a server island component that forwards props directly into Vue’s dynamic component resolution (<component :is>,resolveDynamicComponent, orh()), an attacker can pass a plain string value (rather than a component definition) to instantiate any globally-registered Vue component or any native HTML element.For example:
{ "as": "SomeGlobalComponent" }- >= 4.0.0, < 4.5.1
- >= 3.1.0, < 3.21.10
Medium Fixed in 3.21.10, 4.5.1
-
Cross-site scripting via <NoScript> slot content in Nuxt’s head components
Impact
Nuxt’s globally registered
<NoScript>component (from@unhead/vuehead components, re-exported by Nuxt) wrote its default-slot content to theinnerHTMLof the<noscript>head tag, bypassing the HTML escaping that{{ }}interpolation normally applies in Vue templates.Applications that placed untrusted, attacker-controllable data inside a
<NoScript>slot, for example:<NoScript>{{ route.query.banner }}</NoScript>- >= 4.0.0, < 4.4.7
- < 3.21.7
Low Fixed in 3.21.7, 4.4.7
-
Nuxt dev server vite-node IPC socket is world-connectable on Linux
Impact
When running
nuxt devon Linux (Node.js 20+, outside Docker / StackBlitz), Nuxt’s internal vite-node IPC server binds to a Linux abstract-namespace Unix socket (\0nuxt-vite-node-<pid>-<ts>.sock). Abstract sockets have no filesystem inode and therefore no permission bits: any local UID on the host that can read/proc/net/unixcan enumerate the socket and connect to it.The IPC server does not perform any peer-credential or shared-secret check before dispatching requests.
- >= 4.0.0, < 4.4.7
- >= 3.18.0, < 3.21.7
Medium Fixed in 3.21.7, 4.4.7
-
Reflected XSS in
<NuxtLink>via unsanitisedjavascript:ordata:URLSummary
<NuxtLink>did not validate the URL scheme of values bound to itstoorhrefprops before rendering them into thehrefattribute of the underlying<a>element. When an application binds attacker-controlled input (a query parameter, a CMS field, a user-supplied profile URL) to<NuxtLink :to>or:href, the attacker can supply ajavascript:orvbscript:URL that is reflected verbatim into the rendered markup.- >= 4.0.0, < 4.4.7
- >= 3.0.0, < 3.21.7
Medium Fixed in 3.21.7, 4.4.7
-
Route-rule middleware bypass via case-sensitivity mismatch between vue-router and the routeRules matcher
Impact
Nuxt looks up
routeRulesfor the current navigation by callinggetRouteRules({ path: to.path })from the page-router plugin and the no-pages router plugin. The compiledrouteRulesmatcher (built onrou3) performs case-sensitive matching, while vue-router is configured with its defaultsensitive: falseand matches paths case-insensitively.The two routers therefore disagree on which rules apply to a given request path: vue-router still matches the page record for
- >= 4.0.0, < 4.4.7
- >= 3.11.0, < 3.21.7
High Fixed in 3.21.7, 4.4.7
-
URL-handling weaknesses in
navigateToandreloadNuxtApp: SSR open redirect, client-side script execution via theopenoption, and protocol-relative bypass inreloadNuxtAppSummary
Three weaknesses in Nuxt’s client-navigation URL handling, all reachable from documented public APIs (
navigateToandreloadNuxtApp):- (CVE-2026-56326) SSR open redirect in
navigateTovia path-normalisation bypass.navigateTodecided whether a target was external by inspecting the raw input withhasProtocol(..., { acceptRelative: true }). Inputs such as/..//evil.com,/.//evil.com,/%2e%2e//evil.com, or
- >= 4.0.0, < 4.4.7
- >= 3.5.0, < 3.21.7
Medium Fixed in 3.21.7, 4.4.7
- (CVE-2026-56326) SSR open redirect in
-
Dev server discloses project absolute path and persistent workspace UUID via
/.well-known/appspecific/com.chrome.devtools.jsonSummary
When running
nuxt dev, Nuxt registers an unauthenticated route at/.well-known/appspecific/com.chrome.devtools.jsonthat returns the absolute filesystem path of the project root and a per-project UUID persisted tonode_modules/.cache/nuxt/chrome-workspace.json. The route is enabled by default viaexperimental.chromeDevtoolsProjectSettings: true.The endpoint exists to let Chrome DevTools’ Workspace integration map sources to the developer’s local checkout.
- >= 4.0.0-alpha.1, < 4.4.7
Low Fixed in 4.4.7
-
Nuxt’s route middleware is not enforced when rendering
.server.vuepages via/__nuxt_island/page_*Summary
When
experimental.componentIslandsis enabled (default in Nuxt 4), any.server.vuefile underpages/is automatically registered as a server island under the keypage_<routeName>and exposed via the/__nuxt_island/:nameendpoint. Until this fix, requests through that endpoint rendered the page component directly via the SSR renderer without instantiating Vue Router, which meant route middleware declared on the page (includingdefinePageMeta({ middleware })) did not run.- >= 3.11.0, <= 3.21.5
- >= 4.0.0-alpha.1, <= 4.4.5
Medium Fixed in 3.21.6, 4.4.6
-
__nuxt_islandendpoint does not bind responses to request props, enabling shared-cache poisoningSummary
The
/__nuxt_island/*endpoint accepts attacker-controlledpropsquery/body parameters and renders any island component without verifying that the URL-resident hash (<Name>_<hashId>.json) was actually issued for those inputs by<NuxtIsland>. The hash is computed and embedded client-side but never validated server-side, so the same path can return materially different responses depending on the query.- >= 3.1.0, <= 3.21.5
- >= 4.0.0-alpha.1, <= 4.4.5
Low Fixed in 3.21.6, 4.4.6
-
Reflected XSS in
navigateTo()external redirectSummary
navigateTo()withexternal: truegenerates a server-side HTML redirect body containing a<meta http-equiv="refresh">tag. The destination URL is only sanitized by replacing"with%22, leaving<,>,&, and'unencoded. An attacker who can influence the URL passed tonavigateTo(url, { external: true })can break out of thecontent="…"attribute and inject arbitrary HTML/JavaScript that executes under the application’s origin.- >= 3.4.3, <= 3.21.5
- >= 4.0.0-alpha.1, <= 4.4.5
Medium Fixed in 3.21.6, 4.4.6
-
Nuxt has Client-Side Path Traversal in Nuxt Island Payload Revival
Summary
A client-side path traversal vulnerability in Nuxt’s Island payload revival mechanism allowed attackers to manipulate client-side requests to different endpoints within the same application domain when specific prerendering conditions are met.
Technical Details
The vulnerability occurs in the client-side payload revival process (revive-payload.client.ts) where Nuxt Islands are automatically fetched when encountering serialized
__nuxt_islandobjects. The issue affects the following flow:- >= 3.6.0, < 3.19.0
- >= 4.0.0, < 4.1.0
Low Fixed in 3.19.0, 4.1.0
-
Nuxt allows DOS via cache poisoning with payload rendering response
Summary
By sending a crafted HTTP request to a server behind an CDN, it is possible in some circumstances to poison the CDN cache and highly impacts the availability of a site.
It is possible to craft a request, such as
https://mysite.com/?/_payload.jsonwhich will be rendered as JSON. If the CDN in front of a Nuxt site ignores the query string when determining whether to cache a route, then this JSON response could be served to future visitors to the site.- >= 3.0.0, < 3.16.0
High Fixed in 3.16.0
-
nuxt vulnerable to Cross-site Scripting in navigateTo if used after SSR
Summary
The
navigateTofunction attempts to blockthejavascript:protocol, but does not correctly use API’s provided byunjs/ufo. This library also contains parsing discrepancies.Details
The function first tests to see if the specified URL has a protocol. This uses the unjs/ufo package for URL parsing.
- < 3.12.4
Medium Fixed in 3.12.4
-
Nuxt vulnerable to remote code execution via the browser when running the test locally
Summary
Due to the insufficient validation of the
pathparameter in the NuxtTestComponentWrapper, an attacker can execute arbitrary JavaScript on the server side, which allows them to execute arbitrary commands.Details
While running the test, a special component named
NuxtTestComponentWrapperis available. https://github.com/nuxt/nuxt/blob/4779f5906fa4d3c784c2e2d6fe5a5c5f181faaec/packages/nuxt/src/app/components/nuxt-root.vue#L42-L43- >= 3.4.0, < 3.12.4
Critical Fixed in 3.12.4
-
nuxt Code Injection vulnerability
he Nuxt dev server between versions 3.4.0 and 3.4.3 is vulnerable to code injection when it is exposed publicly.
- >= 3.4.0, < 3.4.3
Critical Fixed in 3.4.3