CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-114133

CVE-2026-114133: Stored Cross-Site Scripting via useHeadSafe in Nuxt Server Islands

Amit Schendel
Amit Schendel
Senior Security Researcher

Oct 23, 2026·4 min read·0 visits

Executive Summary (TL;DR)

Nuxt Server Islands fail to preserve safe-input flags during serialization, bypassing useHeadSafe checks and enabling Stored XSS.

A Stored Cross-Site Scripting (XSS) vulnerability exists in Nuxt Server Island rendering logic when utilizing the useHeadSafe composable. Raw head attributes bypass sanitization during island serialization.

Vulnerability Overview

Nuxt versions from 3.13.0 up to (but excluding) 4.6.2 contain a Stored Cross-Site Scripting (XSS) flaw classified under CWE-79. The vulnerability exists within Nuxt's Server Island rendering subsystem, specifically in the component head serialization layer handled by the Nitro server runtime.

Nuxt Server Islands enable developers to render standalone components independently on the server using components like <NuxtIsland> or .server.vue source files. These components often collect document head metadata via composables such as useHeadSafe to inject dynamically defined attributes into the client HTML document.

When untrusted user input is passed through useHeadSafe inside a server island component, the server rendering runtime omits the safe input filtering stage. Consequently, unsafe HTML attributes and event handlers bypass validation and are serialized directly into the server response JSON, executing in the context of the user browser upon client-side hydration.

Root Cause Analysis

The root cause resides in the head metadata aggregation logic implemented in packages/nitro-server/src/runtime/handlers/island.ts. Unhead provides useHeadSafe to restrict dynamic metadata input to an allowlist of harmless attributes, internally flagging entries with _safe: true to invoke the SafeInputPlugin during tag resolution.

During server island processing, the Nitro server runtime extracts entries from ssrContext.head.entries. The server handler resolves reactive inputs using walkResolver(entry.input, VueResolver) and directly iterates over the resulting dictionary to assemble the output islandHead object.

In affected versions, the handler neglects to check whether entry.options?._safe is configured on the incoming head entry. As a consequence, the runtime skips invocation of @unhead/vue's SafeInputPlugin, leaving malicious attributes (such as onload or inline <script> contents) intact inside the generated JSON response payload.

Code Analysis & Patch Inspection

In affected versions of packages/nitro-server/src/runtime/handlers/island.ts, the renderIsland function processed head metadata without invoking input sanitization filtering rules:

// Vulnerable code path in island.ts
const input = walkResolver(entry.input, VueResolver) as SerializableHead
for (const [key, value] of Object.entries(input)) {
  // Head properties merged directly without checking entry.options?._safe
}

The fix introduced in commit 493565e99451a0f52330b1f6b979254a4a39e5d0 adds dedicated sanitization logic in packages/nitro-server/src/runtime/utils/island-head.ts via toSafeHeadInput():

// Patched logic in island.ts
const input = walkResolver(entry.input, VueResolver) as SerializableHead
for (const [key, value] of Object.entries(entry.options?._safe ? toSafeHeadInput(input) : input)) {
  // Process sanitized head entries
}

The helper function toSafeHeadInput instantiates a server-side Unhead instance with SafeInputPlugin, registers the input with { _safe: true }, and evaluates resolveTags(head) to strip disallowed event handlers and script tags before serializing the final island response.

Exploitation Methodology

Exploitation requires an application pattern where user-supplied input is rendered inside a Nuxt Server Island component using the useHeadSafe composable. An authenticated user or attacker submits malicious attribute data stored in the application backend.

Consider a server island component UserProfile.server.vue that sets metadata based on user preferences:

<script setup lang="ts">
const props = defineProps<{ userStyle: string }>()
useHeadSafe({
  bodyAttrs: {
    class: 'user-profile',
    onload: props.userStyle // Attacker value: "alert(document.cookie)"
  }
})
</script>

When a victim navigates to the target page, the server renders the island component and generates an HTTP response containing raw JSON metadata with the unsanitized onload handler. When the client runtime processes the payload, the script executes automatically in the origin context.

Impact Assessment

The vulnerability yields Stored Cross-Site Scripting with a CVSS v3.1 score of 5.4 (CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N). Successful execution allows attackers to run arbitrary client-side JavaScript within the origin session of visiting users.

Impact includes session token extraction, session hijacking, defacement, and unauthorized actions executed on behalf of affected users. The scope change (S:C) reflects the execution of injected JavaScript within the victim browser DOM context.

Currently, EPSS score stands at 0.00176 (0.18th percentile), and CISA KEV does not list active exploitation in the wild. However, applications rendering user input inside Server Islands are directly exposed until updated.

Remediation Guidance

Maintainers resolved the flaw in Nuxt release version 4.6.2. Application teams must upgrade dependencies across affected packages to version 4.6.2 or higher.

Execute dependency updates using the primary package manager:

# pnpm
pnpm update nuxt@^4.6.2
 
# npm
npm install nuxt@^4.6.2
 
# yarn
yarn add nuxt@^4.6.2

In addition to upgrading, enforce strict input sanitization prior to passing user control data into framework composables. Implement a strict Content Security Policy (CSP) with nonces or strict script-src rules to restrict execution of inline scripts.

Official Patches

NuxtFix commit sanitizing island head input when using useHeadSafe
NuxtOfficial Nuxt Release v4.6.2

Fix Analysis (1)

Technical Appendix

CVSS Score
5.4/ 10
CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N
EPSS Probability
0.18%
Top 93% most exploited

Affected Systems

Nuxt framework applications using Server Islands (.server.vue or <NuxtIsland>)Nuxt applications utilizing useHeadSafe with dynamic parameters in Server Components

Affected Versions Detail

Product
Affected Versions
Fixed Version
nuxt
Nuxt
>= 3.13.0, < 4.6.24.6.2
AttributeDetail
CWE IDCWE-79
Attack VectorNetwork (AV:N)
CVSS v3.1 Score5.4 (Medium)
EPSS Score0.00176 (0.18%)
ImpactStored Cross-Site Scripting (XSS)
Exploit StatusNone / No active weaponized code in the wild
CISA KEV StatusNot Listed

MITRE ATT&CK Mapping

T1189Drive-by Compromise
Initial Access
T1185Browser Session Hijacking
Collection
CWE-79
Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')

The software does not neutralize or incorrectly neutralizes user-controllable input before it is placed in output that is used as a web page that is served to other users.

Vulnerability Timeline

Fix commit authored and merged into Nuxt main branch
2026-10-16
GitHub Advisory GHSA-xfq5-w38q-pc2x published and Nuxt v4.6.2 released
2026-10-21
NVD vulnerability record published
2026-10-22

References & Sources

  • [1]GitHub Security Advisory GHSA-xfq5-w38q-pc2x
  • [2]Fix Commit in nuxt/nuxt Repository
  • [3]Nuxt Framework Release v4.6.2
  • [4]NVD CVE-2026-114133 Detail
  • [5]CVE.org CVE-2026-114133 Record

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•about 1 hour ago•CVE-2026-114132
6.3

CVE-2026-114132: Case-Sensitivity Route Rule Bypass in Nuxt Framework

Nuxt versions prior to 4.6.2 suffer from a route rule bypass vulnerability caused by an architectural mismatch in case-sensitivity handling between the Nitro server runtime and the Vue page router. An unauthenticated remote attacker can bypass server-enforced route directives—such as redirects, security headers, and SSR controls—by altering character casing in HTTP request paths.

Amit Schendel
Amit Schendel
4 views•6 min read
•about 2 hours ago•GHSA-78G4-XQWV-Q3G8
7.5

GHSA-78G4-XQWV-Q3G8: Heap-Based Buffer Overflow in Pillow (libopenjp2)

A heap-based buffer overflow vulnerability in Pillow PyPI binary wheels (versions 11.1.0 to 12.x) allows remote code execution or application crash via crafted JPEG 2000 files processed by the bundled libopenjp2 library.

Alon Barad
Alon Barad
15 views•4 min read
•about 3 hours ago•CVE-2026-109618
9.8

CVE-2026-109618: Remote Code Execution in PHP Core via Out-of-Memory longjmp() Uninitialized Memory Access

CVE-2026-109618 (dubbed PHP2Shell) is a critical vulnerability in the PHP engine core resulting from improper out-of-memory exception handling via longjmp(). When request allocation fails mid-processing, non-local control flow bypasses cleanup procedures, leaving memory structures uninitialized or in a use-after-free state during request shutdown.

Amit Schendel
Amit Schendel
10 views•5 min read
•about 3 hours ago•CVE-2026-109619
9.2

CVE-2026-109619: Remote Code Execution in PHP Core via Stale Global State Memory Corruption (PHP2Shell)

CVE-2026-109619 (PHP2Shell) is a critical Use-After-Free vulnerability in the core PHP engine caused by improper global state cleanup during out-of-memory exception handling across persistent worker requests.

Alon Barad
Alon Barad
13 views•6 min read
•about 3 hours ago•CVE-2026-113721
4.5

CVE-2026-113721: Unsafe Link Resolution in virtualenv File Generation

In Python virtualenv prior to version 21.14.9, activation script generators and configuration writers use Path.exists() before writing files. Because Path.exists() resolves symbolic links, it returns False for dangling symlinks. Consequently, virtualenv skips unlinking pre-planted symbolic links or hard links, writing data directly to target locations outside the intended virtual environment directory.

Amit Schendel
Amit Schendel
4 views•5 min read
•10 days ago•CVE-2026-87697
8.8

CVE-2026-87697: Untrusted Deserialization in .NET PresentationCore Clipboard Handling

A remote code execution vulnerability exists in Microsoft .NET due to untrusted data deserialization within the PresentationCore component. The flaw stems from implicit auto-conversion flags during clipboard data retrieval operations.

Alon Barad
Alon Barad
31 views•5 min read