GitHub Advisoryadvisory · npm
GHSA-m3q2-p4fw-w38m Cross-site scripting via <NoScript> slot content in Nuxt's head components
LOW
Official page ↗
- Aliases
- CVE-2026-56317
- Ecosystem
- npm
- Packages
- nuxt
- Severity
- Low
- CVSS vector
- CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:P/VC:L/VI:L/VA:N/SC:N/SI:N/SA:N
- Weaknesses
- CWE-79
- Reviewed
- 2026-06-16
Affected packages
• npm nuxt: >= 4.0.0, < 4.4.7 → fixed in 4.4.7
• npm nuxt: < 3.21.7 → fixed in 3.21.7
Description
Impact
Nuxt's globally registered `` component (from `@unhead/vue` head components, re-exported by Nuxt) wrote its default-slot content to the `innerHTML` of the `` head tag, bypassing the HTML escaping that `{{ }}` interpolation normally applies in Vue templates.
Applications that placed untrusted, attacker-controllable data inside a `` slot, for example:
```vue
{{ route.query.banner }}
```
would emit that value unescaped inside `` in the server-rendered HTML. With scripting enabled, the HTML parser treats `` content in `` under the "in head noscript" insertion mode: any tag other than `link`, `meta`, `noframes`, or `style` implicitly closes `` and is re-processed in the head. A payload such as `...` therefore escapes the element and executes in the document context.
Sibling head components (``, ``) were not affected because they already routed slot text through the safe `textContent` path.
Affected versions
All currently supported versions of `nuxt` that ship the `` global component.
Patches
Fixed in `[email protected]` (commit `4b054e9d`) and backported to `[email protected]` (commit `7fea9fd6`). The fix escapes `` slot content with `escapeHtml` from `@vue/shared` and writes it to `textContent` rather than `innerHTML`. Slot content is now rendered as text; intentional markup inside `` is no longer parsed as HTML.
Workarounds
Until you can upgrade:
• Do not interpolate untrusted input into `` slots. Replace `{{ x }}` with a static string, or sanitise / HTML-escape `x` at the source.
• If you must render dynamic noscript content, write the tag yourself via `useHead({ noscript: [{ textContent: escapedValue }] })` after escaping `escapedValue`.
Credit
Reported to Anthropic's coordinated vulnerability disclosure pipeline by Claude (Anthropic's AI assistant) and triaged by the Anthropic security team. Reference: ANT-2026-4NJYDFFM.
Independently reported by @alcls01111 via GitHub's coordinated disclosure flow (`GHSA-8grp-wcq9-925q`), closed as a duplicate of this advisory.
Related
Alias · CVE (1)
- CVE-2026-56317 Nuxt before 4.4.7 (and the 3.x branch before 3.21.7) contains a cross-site scripting vulnerability in the NoScript component that writes… vulnerability
Weakness · CWE (1)
- CWE-79 Improper Neutralization of Input During Web Page Generation weakness
References
- https://github.com/nuxt/nuxt/security/advisories/GHSA-m3q2-p4fw-w38m web
- https://nvd.nist.gov/vuln/detail/CVE-2026-56317 advisory
- https://github.com/nuxt/nuxt/commit/4b054e9d95f8daf366cb144b52782047c511a66e web
- https://github.com/nuxt/nuxt/commit/7fea9fd687f1dacbfb63db5fae5839896b017a0e web
- https://github.com/nuxt/nuxt package
- https://www.vulncheck.com/advisories/nuxt-cross-site-scripting-via-noscript-component-slot-content web