Live › vulnerability › CVE-2026-114133
Go to dashboardNuxt server islands serialise raw useHeadSafe input without the safe-input flag, so tags and attributes that useHeadSafe would strip (such as bodyAttrs.onload or executable script content) get rendered into the page. If an app passes user-controlled data to useHeadSafe inside a server island, an attacker can run stored XSS on the app's origin.
Summary written from the sources below. Check the originals before acting.
First seen by InfraStack 2026-10-23 19:11 UTC, 3h before NVD. All times on this page are UTC.
| Product | Ecosystem | Affected | Fixed in |
|---|---|---|---|
| nuxt | npm | >= 3.13.0, < 4.6.2 | 4.6.2 |
3.13.0 and <4.6.24.6.2 or later (Nuxt 3 is end of life and will not get a fix)Each row is the first time that source carried this signal. The analyst’s rows are its own findings.
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 during server rendering and when hydrating or refetching on the client.
As a result, input that useHeadSafe would normally strip (such as bodyAttrs.onload or executable <script> content) is rendered into the page. If an application passes user-controlled data to useHeadSafe inside a server island, an attacker who controls that data can achieve stored cross-site scripting on the application's origin.
<!-- components/AuthorMeta.server.vue -->
<script setup lang="ts">
const { data: author } = await useFetch('/api/author')
// author.value.head is user-authored, e.g. { bodyAttrs: { onload: '...' } }
useHeadSafe(author.value.head)
</script>
.server.vue component or page, or enables experimental.componentIslands and renders <NuxtIsland>.useHeadSafe inside a server island. useHeadSafe called from regular (non-island) components and pages is not affected.nuxt >=3.13.0, when head support for server islands was introduced. Nuxt 2 is not affected.
Fixed in [email protected]. Nuxt 3 reached end of life on 31 July 2026 and will not receive a fix.
Patched releases apply Unhead's safe input filtering to useHeadSafe entries on the server before they are added to the island response, so islandResponse.head (including what render:island hooks see) only contains input that useHeadSafe allows.
Upgrade to [email protected]. If you cannot upgrade, including on Nuxt 3:
useHeadSafe with untrusted input from a regular component or page rather than from inside a server island.useHeadSafe inside a server island.This page as .md · .json · in your agent: get_signal("CVE-2026-114133")
GitHub Advisory Database, CC-BY 4.0 · NVD data is provided by NIST and is public domain. Posts quoted belong to their authors.