nuxt

Ecosystem: npm

Downloads: 10.73 Mln

Vulnerabilities from the last (months)
  • 2CriticalAffects 2 versions
  • 7HighAffects 12 versions
  • 0MediumAffects 0 versions
  • 14ModerateAffects 23 versions
  • 6LowAffects 10 versions
Severity distribution (all time)
29vulnerabilities
  • Critical2 (6.9%)
  • High7 (24.1%)
  • Medium0 (0.0%)
  • Moderate14 (48.3%)
  • Low6 (20.7%)

Monthly breakdown

  • Critical
  • High
  • Medium
  • Moderate
  • Low
  • 5 vulnerabilities
    • Critical: 0
    • High: 0
    • Medium: 0
    • Moderate: 4
    • Low: 1
  • 8 vulnerabilities
    • Critical: 0
    • High: 5
    • Medium: 0
    • Moderate: 3
    • Low: 0
  • 8 vulnerabilities
    • Critical: 0
    • High: 1
    • Medium: 0
    • Moderate: 4
    • Low: 3
  • 3 vulnerabilities
    • Critical: 0
    • High: 0
    • Medium: 0
    • Moderate: 2
    • Low: 1
  • 1 vulnerabilities
    • Critical: 0
    • High: 0
    • Medium: 0
    • Moderate: 0
    • Low: 1
  • 1 vulnerabilities
    • Critical: 0
    • High: 1
    • Medium: 0
    • Moderate: 0
    • Low: 0
  • 2 vulnerabilities
    • Critical: 1
    • High: 0
    • Medium: 0
    • Moderate: 1
    • Low: 0
  • 1 vulnerabilities
    • Critical: 1
    • High: 0
    • Medium: 0
    • Moderate: 0
    • Low: 0

Vulnerabilities (29)

Known vulnerabilities affecting nuxt, based on data from OSV.

Vulnerabilities affecting nuxt
IDSeveritySummaryAffected versionsPublishedSource
GHSA-9v7c-q64q-vv33ModerateNuxt: Dot segments in the request path bypass `server/middleware` path checks and server route rules on page routes### Summary Since `4.6.0`, Nuxt resolves `.` and `..` segments in the request path, including percent-encoded forms such as `%2e`, before rendering a page. Nitro's routing, Nitro's route rules and `server/middleware` see the path with those segments still in place. A request for `/%2e/admin` therefore renders the page at `/admin`, while server-side checks keyed on `/admin` do not apply. ### Impact An unauthenticated attacker can bypass server-side controls that match on the request path of a page route. `server/middleware` that checks `event.path` (or `event.node.req.url`) is skipped: ```
  • >= 4.6.0, < 4.6.3
GitHub (opens in a new tab)
GHSA-6gq8-jgmh-3ffpModerateNuxt: Route rules are matched against the raw request path, so a percent-encoded segment can bypass `appMiddleware` on dynamic and catch-all routes### Summary Nuxt compared `routeRules` keys 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's `appMiddleware` never runs, including during server rendering. ### Impact For a page served through a dynamic or catch-all route, an attacker can percent-encode a character in the path to skip the rule: ```ts export default defineNuxtConfig({ routeRules: { '/users/admin': {
  • >= 4.0.0, < 4.4.4
  • >= 3.11.0, < 3.21.4
GitHub (opens in a new tab)
GHSA-jjm6-p2m9-9w4xLowNuxt: Incomplete fix for GHSA-934w-87qh-qr26: a `javascript:` URL prefixed with an ASCII control character executes from `<NuxtLink>` when `pages` is disabled## 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](https://github.com/nuxt/nuxt/security/advisories/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 char
  • < 4.6.0
GitHub (opens in a new tab)
GHSA-vjh5-4x84-xrqpModerateNuxt: Server-side route rules (`redirect`, `headers`, `proxy`, `ssr`) are skipped for case-variant paths when routing is case-insensitive## Impact With the default `router.options.sensitive: false`, Nuxt's page router resolves routes case-insensitively, so `/Admin` renders 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. Earlier fixes ([GHSA-mm7m-92g8-7m47](https://github.com/nuxt/nuxt/security/advisories/GHSA-mm7m-92g8-7m47), [GHSA-hxvh-4h3w-prp9](https://github.com/nuxt/nuxt/security/advisories/GHSA-hxvh-
  • >= 4.0.0, < 4.6.2
  • >= 3.0.0
GitHub (opens in a new tab)
GHSA-xfq5-w38q-pc2xModerateNuxt server islands render `useHeadSafe` input without sanitisation## Impact `useHeadSafe` restricts head input to an allowlist of safe tags and attributes. For example, `bodyAttrs` is limited to `class` and `style`, event handler attributes are removed, and `<script>` tags are only kept for JSON types. When `useHeadSafe` is called inside a server island (a `.server.vue` component 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. `<NuxtIsland>` then pushes that input into the page's head as a regular entry, both duri
  • >= 3.13.0, < 4.6.2
GitHub (opens in a new tab)
GHSA-4jjw-pwvw-q6w3ModerateDuplicate Advisory: Nuxt dev server discloses project root and workspace UUID via the Chrome DevTools workspace endpoint## Duplicate Advisory This advisory has been withdrawn because it is a duplicate of GHSA-7c4v-fwgw-9rf7. This link is maintained to preserve external references. ## Original Description Nuxt versions >= 4.4.7 and < 4.5.1, and >= 3.21.7 and < 3.21.10, contain an information disclosure vulnerability in the development server's Chrome DevTools workspace endpoint (GET /.well-known/appspecific/com.chrome.devtools.json). The endpoint's local-request gate (isLocalDevRequest) is header-based and trusts the attacker-supplied Host header rather than the connected peer address. When the dev server is b
  • >= 4.4.7
GitHub (opens in a new tab)
GHSA-7c4v-fwgw-9rf7ModerateNuxt 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 --host` for on-device testing), the default-enabled Chrome DevTools workspace endpoint `GET /.well-known/appspecific/com.chrome.devtools.json` returns the absolute project root (`workspace.root`, i.e. `rootDir`) and a persistent per-project workspace UUID. `GHSA-rq7w-g337-39qq` added a gate (`isLocalDevRequest`) intended to restrict this endpoint to local requests, but that gate is header-based: it trusts request metadata rather than the connected peer address. A request with no `Sec-Fetch-Site
  • >= 4.4.7, < 4.5.1
  • >= 3.21.7, < 3.21.10
GitHub (opens in a new tab)
GHSA-48hr-524c-v5w3ModerateNuxt: 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`, or `h()`), 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: ```json { "as": "SomeGlobalComponent" } ``` ...resolves and renders `SomeGlobalComponent` if it is globally registered, even though the attacker should only be able to
  • >= 4.0.0, < 4.5.1
  • >= 3.1.0, < 3.21.10
GitHub (opens in a new tab)
GHSA-9473-5f9j-94wqHighNuxt: Server-Side Remote Code Execution via Runtime Template Injection in Nuxt Server Island Props## Impact Nuxt server islands accept props via the `/__nuxt_island/` endpoint. When `vue.runtimeCompiler: true` is enabled (off by default) and the application has a server island component that forwards props into Vue's dynamic component resolution (`<component :is>`, `resolveDynamicComponent`, or `h()`), an attacker can inject a `template` key into the island props to achieve server-side remote code execution in the Nitro process. ```json { "as": { "template": "<attacker-controlled>" } } ``` Vue's runtime template compiler compiles and executes the attacker-controlled `template` in the se
  • >= 4.0.0, < 4.5.1
  • >= 3.4.0, < 3.21.10
GitHub (opens in a new tab)
GHSA-9pgf-384g-p7mvHighNuxt: 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 unauthenticated `POST /__nuxt_island/<name>_<anything>.json` with a large JSON body (for example ~4.6 MB / 150k keys) is fully read, `destr`-parsed, and run through `ohash` before 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. A low request rate is enough to degrade or stall the server. No valid hash and no authent
  • >= 4.0.0, < 4.5.1
  • >= 3.1.0, < 3.21.10
GitHub (opens in a new tab)
  • GHSA-9v7c-q64q-vv33Moderate
    Nuxt: Dot segments in the request path bypass `server/middleware` path checks and server route rules on page routes
    • >= 4.6.0, < 4.6.3

    ### Summary Since `4.6.0`, Nuxt resolves `.` and `..` segments in the request path, including percent-encoded forms such as `%2e`, before rendering a page. Nitro's routing, Nitro's route rules and `server/middleware` see the path with those segments still in place. A request for `/%2e/admin` therefore renders the page at `/admin`, while server-side checks keyed on `/admin` do not apply. ### Impact An unauthenticated attacker can bypass server-side controls that match on the request path of a page route. `server/middleware` that checks `event.path` (or `event.node.req.url`) is skipped: ```

    CVE: CVE-2026-119200

  • GHSA-6gq8-jgmh-3ffpModerate
    Nuxt: Route rules are matched against the raw request path, so a percent-encoded segment can bypass `appMiddleware` on dynamic and catch-all routes
    • >= 4.0.0, < 4.4.4
    • >= 3.11.0, < 3.21.4

    ### Summary Nuxt compared `routeRules` keys 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's `appMiddleware` never runs, including during server rendering. ### Impact For a page served through a dynamic or catch-all route, an attacker can percent-encode a character in the path to skip the rule: ```ts export default defineNuxtConfig({ routeRules: { '/users/admin': {

    CVE: CVE-2026-114131

  • GHSA-jjm6-p2m9-9w4xLow
    Nuxt: Incomplete fix for GHSA-934w-87qh-qr26: a `javascript:` URL prefixed with an ASCII control character executes from `<NuxtLink>` when `pages` is disabled
    • < 4.6.0

    ## 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](https://github.com/nuxt/nuxt/security/advisories/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 char

    CVE: CVE-2026-114130

  • GHSA-vjh5-4x84-xrqpModerate
    Nuxt: Server-side route rules (`redirect`, `headers`, `proxy`, `ssr`) are skipped for case-variant paths when routing is case-insensitive
    • >= 4.0.0, < 4.6.2
    • >= 3.0.0

    ## Impact With the default `router.options.sensitive: false`, Nuxt's page router resolves routes case-insensitively, so `/Admin` renders 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. Earlier fixes ([GHSA-mm7m-92g8-7m47](https://github.com/nuxt/nuxt/security/advisories/GHSA-mm7m-92g8-7m47), [GHSA-hxvh-4h3w-prp9](https://github.com/nuxt/nuxt/security/advisories/GHSA-hxvh-

    CVE: CVE-2026-114132

  • GHSA-xfq5-w38q-pc2xModerate
    Nuxt server islands render `useHeadSafe` input without sanitisation
    • >= 3.13.0, < 4.6.2

    ## Impact `useHeadSafe` restricts head input to an allowlist of safe tags and attributes. For example, `bodyAttrs` is limited to `class` and `style`, event handler attributes are removed, and `<script>` tags are only kept for JSON types. When `useHeadSafe` is called inside a server island (a `.server.vue` component 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. `<NuxtIsland>` then pushes that input into the page's head as a regular entry, both duri

    CVE: CVE-2026-114133

  • GHSA-4jjw-pwvw-q6w3Moderate
    Duplicate Advisory: Nuxt dev server discloses project root and workspace UUID via the Chrome DevTools workspace endpoint
    • >= 4.4.7

    ## Duplicate Advisory This advisory has been withdrawn because it is a duplicate of GHSA-7c4v-fwgw-9rf7. This link is maintained to preserve external references. ## Original Description Nuxt versions >= 4.4.7 and < 4.5.1, and >= 3.21.7 and < 3.21.10, contain an information disclosure vulnerability in the development server's Chrome DevTools workspace endpoint (GET /.well-known/appspecific/com.chrome.devtools.json). The endpoint's local-request gate (isLocalDevRequest) is header-based and trusts the attacker-supplied Host header rather than the connected peer address. When the dev server is b

  • GHSA-7c4v-fwgw-9rf7Moderate
    Nuxt dev server discloses project root and workspace UUID via the Chrome DevTools workspace endpoint
    • >= 4.4.7, < 4.5.1
    • >= 3.21.7, < 3.21.10

    ### Impact When a Nuxt dev server is bound to a network-reachable interface (for example `nuxt dev --host` for on-device testing), the default-enabled Chrome DevTools workspace endpoint `GET /.well-known/appspecific/com.chrome.devtools.json` returns the absolute project root (`workspace.root`, i.e. `rootDir`) and a persistent per-project workspace UUID. `GHSA-rq7w-g337-39qq` added a gate (`isLocalDevRequest`) intended to restrict this endpoint to local requests, but that gate is header-based: it trusts request metadata rather than the connected peer address. A request with no `Sec-Fetch-Site

    CVE: CVE-2026-72744

  • GHSA-48hr-524c-v5w3Moderate
    Nuxt: Unauthorized Component Instantiation via Server Island Props
    • >= 4.0.0, < 4.5.1
    • >= 3.1.0, < 3.21.10

    ## 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`, or `h()`), 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: ```json { "as": "SomeGlobalComponent" } ``` ...resolves and renders `SomeGlobalComponent` if it is globally registered, even though the attacker should only be able to

    CVE: CVE-2026-71318

  • GHSA-9473-5f9j-94wqHigh
    Nuxt: Server-Side Remote Code Execution via Runtime Template Injection in Nuxt Server Island Props
    • >= 4.0.0, < 4.5.1
    • >= 3.4.0, < 3.21.10

    ## Impact Nuxt server islands accept props via the `/__nuxt_island/` endpoint. When `vue.runtimeCompiler: true` is enabled (off by default) and the application has a server island component that forwards props into Vue's dynamic component resolution (`<component :is>`, `resolveDynamicComponent`, or `h()`), an attacker can inject a `template` key into the island props to achieve server-side remote code execution in the Nitro process. ```json { "as": { "template": "<attacker-controlled>" } } ``` Vue's runtime template compiler compiles and executes the attacker-controlled `template` in the se

    CVE: CVE-2026-71320

  • GHSA-9pgf-384g-p7mvHigh
    Nuxt: Unauthenticated CPU exhaustion parsing and hashing the Nuxt island endpoint body before hash validation
    • >= 4.0.0, < 4.5.1
    • >= 3.1.0, < 3.21.10

    ### Impact The internal island renderer endpoint (`/__nuxt_island/...`) decodes and hashes attacker-controlled request input before it validates the URL-resident hash. An unauthenticated `POST /__nuxt_island/<name>_<anything>.json` with a large JSON body (for example ~4.6 MB / 150k keys) is fully read, `destr`-parsed, and run through `ohash` before 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. A low request rate is enough to degrade or stall the server. No valid hash and no authent

    CVE: CVE-2026-71321

Showing 1-10 of 29 vulnerabilities