Every CVE Search/ Get API key

CVE-2026-45669

Nuxt: Reflected XSS in `navigateTo()` external redirect

5.3 MediumFix available

Nuxt is an open-source web development framework for Vue.js. From versions 3.4.3 to before 3.21.6 and 4.0.0-alpha.1 to before 4.4.6, navigateTo() with external: true generates 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 to navigateTo(url, { external: true }) can break out of the content="…" attribute and inject arbitrary HTML/JavaScript that executes under the application's origin. This issue has been patched in versions 3.21.6 and 4.4.6.

Attack profile

How easy it is to exploit

Attack vector
Network
Complexity
Low
Privileges needed
None
User interaction
Passive

What an attacker can affect

Confidentiality
Low
Integrity
Low
Availability
None

Exploit likelihood

0.18%Up 0.1 points since Jun 12, 2026
90%50%10%1%

What each source reports

CVE List Score used 5.3

Nuxt: Reflected XSS in `navigateTo()` external redirect

Nuxt is an open-source web development framework for Vue.js. From versions 3.4.3 to before 3.21.6 and 4.0.0-alpha.1 to before 4.4.6, navigateTo() with external: true generates 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 to navigateTo(url, { external: true }) can break out of the content="…" attribute and inject arbitrary HTML/JavaScript that executes under the application's origin. This issue has been patched in versions 3.21.6 and 4.4.6.

Record
CVE-2026-45669
CVSS 4.0
5.3 MediumCVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N
Weakness
CWE-83
Updated
2026-11-02
EUVDEUVD-2026-36420 5.3

Nuxt is an open-source web development framework for Vue.js. From versions 3.4.3 to before 3.21.6 and 4.0.0-alpha.1 to before 4.4.6, navigateTo() with external: true generates 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 to navigateTo(url, { external: true }) can break out of the content="…" attribute and inject arbitrary HTML/JavaScript that executes under the application's origin. This issue has been patched in versions 3.21.6 and 4.4.6.

Record
EUVD-2026-36420
CVSS 4.0
5.3 MediumCVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N
Updated
2026-11-02
GitHub AdvisoriesGHSA-fx6j-w5w5-h468 5.3

Nuxt: Reflected XSS in `navigateTo()` external redirect

Summary

navigateTo() with external: true generates 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 to navigateTo(url, { external: true }) can break out of the content="…" attribute and inject arbitrary HTML/JavaScript that executes under the application's origin.

This is a different root cause from CVE-2024-34343 (GHSA-vf6r-87q4-2vjf), which addressed javascript: protocol bypass. The issue here is triggered by any valid URL containing >.

Impact

Applications that pass user-controlled input to navigateTo(url, { external: true }) — typically via a ?next= / ?redirect= query parameter used for post-login or "return to" flows — are vulnerable to reflected cross-site scripting. The injected script runs in the context of the application's origin during the server-rendered redirect response, before the meta-refresh fires.

Details

In packages/nuxt/src/app/composables/router.ts, the SSR redirect path builds an HTML response body with only " percent-encoded in the destination URL:

const encodedLoc = location.replace(/"/g, '%22')
nuxtApp.ssrContext!['~renderResponse'] = {
status: sanitizeStatusCode(options?.redirectCode || 302, 302),
body: `<!DOCTYPE html><html><head><meta http-equiv="refresh" content="0; url=${encodedLoc}"></head></html>`,
headers: { location: encodeURL(location, isExternalHost) },
}

The Location header is normalised through encodeURL() (which uses the URL constructor and correctly percent-encodes attribute-significant characters). The HTML body uses a narrower sanitiser. That mismatch is the root cause.

Proof of concept

Global middleware that forwards a query parameter to navigateTo:

// middleware/redirect.global.ts
export default defineNuxtRouteMiddleware((to) => {
const next = to.query.next as string | undefined
if (next) {
 return navigateTo(next, { external: true })
}
})

Request:

GET /?next=https://evil.example/x><img src=x onerror=alert(document.domain)>

Response body:

<!DOCTYPE html><html><head><meta http-equiv="refresh" content="0; url=https://evil.example/x><img src=x onerror=alert(document.domain)>"></head></html>

The > after evil.example/x terminates the content="…" attribute, and the <img onerror> tag executes JavaScript in the application's origin before any redirect occurs.

Patches

Fixed in [email protected] and [email protected] by #35052. The fix percent-encodes the full set of HTML-attribute-significant characters (&, ", ', <, >) before interpolating the URL into the meta-refresh body

Workarounds

If you can't upgrade immediately, validate user-controlled URLs before passing them to navigateTo(url, { external: true }). At minimum, normalise through new URL(input).toString() and reject inputs containing < or > (a normalised URL with these characters is malformed and safe to refuse).

Record
GHSA-fx6j-w5w5-h468
CVSS 4.0
5.3 MediumCVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N
CVSS 3.1
5.4 MediumCVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:L/A:N
Weakness
CWE-83
Updated
2026-11-02
NVD 5.3

Nuxt is an open-source web development framework for Vue.js. From versions 3.4.3 to before 3.21.6 and 4.0.0-alpha.1 to before 4.4.6, navigateTo() with external: true generates 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 to navigateTo(url, { external: true }) can break out of the content="…" attribute and inject arbitrary HTML/JavaScript that executes under the application's origin. This issue has been patched in versions 3.21.6 and 4.4.6.

Record
CVE-2026-45669
CVSS 4.0
5.3 MediumCVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
CVSS 3.1
5.4 MediumCVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:L/A:N
Weakness
CWE-83
Updated
2026-11-02
OSV 5.3

Nuxt: Reflected XSS in `navigateTo()` external redirect

Nuxt is an open-source web development framework for Vue.js. From versions 3.4.3 to before 3.21.6 and 4.0.0-alpha.1 to before 4.4.6, navigateTo() with external: true generates 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 to navigateTo(url, { external: true }) can break out of the content="…" attribute and inject arbitrary HTML/JavaScript that executes under the application's origin. This issue has been patched in versions 3.21.6 and 4.4.6.

Record
CVE-2026-45669
CVSS 4.0
5.3 MediumCVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N
Weakness
CWE-83
Updated
2026-11-02
OSVGHSA-fx6j-w5w5-h468 5.3

Nuxt: Reflected XSS in `navigateTo()` external redirect

Summary

navigateTo() with external: true generates 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 to navigateTo(url, { external: true }) can break out of the content="…" attribute and inject arbitrary HTML/JavaScript that executes under the application's origin.

This is a different root cause from CVE-2024-34343 (GHSA-vf6r-87q4-2vjf), which addressed javascript: protocol bypass. The issue here is triggered by any valid URL containing >.

Impact

Applications that pass user-controlled input to navigateTo(url, { external: true }) — typically via a ?next= / ?redirect= query parameter used for post-login or "return to" flows — are vulnerable to reflected cross-site scripting. The injected script runs in the context of the application's origin during the server-rendered redirect response, before the meta-refresh fires.

Details

In packages/nuxt/src/app/composables/router.ts, the SSR redirect path builds an HTML response body with only " percent-encoded in the destination URL:

const encodedLoc = location.replace(/"/g, '%22')
nuxtApp.ssrContext!['~renderResponse'] = {
status: sanitizeStatusCode(options?.redirectCode || 302, 302),
body: `<!DOCTYPE html><html><head><meta http-equiv="refresh" content="0; url=${encodedLoc}"></head></html>`,
headers: { location: encodeURL(location, isExternalHost) },
}

The Location header is normalised through encodeURL() (which uses the URL constructor and correctly percent-encodes attribute-significant characters). The HTML body uses a narrower sanitiser. That mismatch is the root cause.

Proof of concept

Global middleware that forwards a query parameter to navigateTo:

// middleware/redirect.global.ts
export default defineNuxtRouteMiddleware((to) => {
const next = to.query.next as string | undefined
if (next) {
 return navigateTo(next, { external: true })
}
})

Request:

GET /?next=https://evil.example/x><img src=x onerror=alert(document.domain)>

Response body:

<!DOCTYPE html><html><head><meta http-equiv="refresh" content="0; url=https://evil.example/x><img src=x onerror=alert(document.domain)>"></head></html>

The > after evil.example/x terminates the content="…" attribute, and the <img onerror> tag executes JavaScript in the application's origin before any redirect occurs.

Patches

Fixed in [email protected] and [email protected] by #35052. The fix percent-encodes the full set of HTML-attribute-significant characters (&, ", ', <, >) before interpolating the URL into the meta-refresh body

Workarounds

If you can't upgrade immediately, validate user-controlled URLs before passing them to navigateTo(url, { external: true }). At minimum, normalise through new URL(input).toString() and reject inputs containing < or > (a normalised URL with these characters is malformed and safe to refuse).

Record
GHSA-fx6j-w5w5-h468
CVSS 4.0
5.3 MediumCVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N
CVSS 3.1
5.4 MediumCVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:L/A:N
Weakness
CWE-83
Updated
2026-11-02
Show 11 moreShow less
OSVCLSA-2026-1779238045 No score

TuxCare security update for nuxt (2 CVEs)

TuxCare rebuilt nuxt to address 2 CVEs. Fixed in 4.0.3-tuxcare.3.

Record
CLSA-2026-1779238045
Updated
2026-11-02
OSVCLSA-2026-1788450984 No score

TuxCare security update for nuxt (11 CVEs)

TuxCare rebuilt nuxt to address 11 CVEs. Fixed in 3.12.4-tuxcare.12.

Record
CLSA-2026-1788450984
Updated
2026-11-02
OSVCLSA-2026-1792161445 No score

TuxCare security update for @nuxt/kit (2 CVEs)

TuxCare rebuilt @nuxt/kit to address 2 CVEs. Fixed in 4.0.3-tuxcare.3.

Record
CLSA-2026-1792161445
Updated
2026-11-02
OSVCLSA-2026-1792161460 No score

TuxCare security update for @nuxt/kit (11 CVEs)

TuxCare rebuilt @nuxt/kit to address 11 CVEs. Fixed in 3.12.4-tuxcare.12.

Record
CLSA-2026-1792161460
Updated
2026-11-02
OSVCLSA-2026-1792161482 No score

TuxCare security update for @nuxt/rspack-builder (2 CVEs)

TuxCare rebuilt @nuxt/rspack-builder to address 2 CVEs. Fixed in 4.0.3-tuxcare.3.

Record
CLSA-2026-1792161482
Updated
2026-11-02
OSVCLSA-2026-1792161586 No score

TuxCare security update for @nuxt/schema (2 CVEs)

TuxCare rebuilt @nuxt/schema to address 2 CVEs. Fixed in 4.0.3-tuxcare.3.

Record
CLSA-2026-1792161586
Updated
2026-11-02
OSVCLSA-2026-1792161601 No score

TuxCare security update for @nuxt/schema (11 CVEs)

TuxCare rebuilt @nuxt/schema to address 11 CVEs. Fixed in 3.12.4-tuxcare.12.

Record
CLSA-2026-1792161601
Updated
2026-11-02
OSVCLSA-2026-1792161809 No score

TuxCare security update for @nuxt/vite-builder (2 CVEs)

TuxCare rebuilt @nuxt/vite-builder to address 2 CVEs. Fixed in 4.0.3-tuxcare.3.

Record
CLSA-2026-1792161809
Updated
2026-11-02
OSVCLSA-2026-1792161823 No score

TuxCare security update for @nuxt/vite-builder (11 CVEs)

TuxCare rebuilt @nuxt/vite-builder to address 11 CVEs. Fixed in 3.12.4-tuxcare.12.

Record
CLSA-2026-1792161823
Updated
2026-11-02
OSVCLSA-2026-1792161922 No score

TuxCare security update for @nuxt/webpack-builder (2 CVEs)

TuxCare rebuilt @nuxt/webpack-builder to address 2 CVEs. Fixed in 4.0.3-tuxcare.3.

Record
CLSA-2026-1792161922
Updated
2026-11-02
OSVCLSA-2026-1792161936 No score

TuxCare security update for @nuxt/webpack-builder (11 CVEs)

TuxCare rebuilt @nuxt/webpack-builder to address 11 CVEs. Fixed in 3.12.4-tuxcare.12.

Record
CLSA-2026-1792161936
Updated
2026-11-02

Affected products

Affected packages

Affected packages
PackageAffectedFixed
nuxt
npm
3.4.3 to 3.21.5
3.21.6
nuxt
npm
4.0.0-alpha.1 to 4.4.5
4.4.6
nuxt
TuxCare:npm
From an advisory covering 2 CVEs
4.0.3-tuxcare.0 up to 4.0.3-tuxcare.3, plus listed versions
4.0.34.0.3-tuxcare.14.0.3-tuxcare.2
4.0.3-tuxcare.3
nuxt
TuxCare:npm
From an advisory covering 11 CVEs
3.12.4-tuxcare.0 up to 3.12.4-tuxcare.12, plus listed versions
3.12.43.12.4-tuxcare.103.12.4-tuxcare.113.12.4-tuxcare.23.12.4-tuxcare.3
Show 6 moreShow less
3.12.4-tuxcare.43.12.4-tuxcare.53.12.4-tuxcare.63.12.4-tuxcare.73.12.4-tuxcare.83.12.4-tuxcare.9
3.12.4-tuxcare.12
@nuxt/kit
TuxCare:npm
From an advisory covering 2 CVEs
4.0.3-tuxcare.0 up to 4.0.3-tuxcare.3, plus listed versions
4.0.34.0.3-tuxcare.1
4.0.3-tuxcare.3
@nuxt/kit
TuxCare:npm
From an advisory covering 11 CVEs
3.12.4-tuxcare.0 up to 3.12.4-tuxcare.12, plus listed versions
3.12.43.12.4-tuxcare.113.12.4-tuxcare.23.12.4-tuxcare.33.12.4-tuxcare.63.12.4-tuxcare.73.12.4-tuxcare.83.12.4-tuxcare.9
3.12.4-tuxcare.12
@nuxt/rspack-builder
TuxCare:npm
From an advisory covering 2 CVEs
4.0.3-tuxcare.0 up to 4.0.3-tuxcare.3, plus listed versions
4.0.34.0.3-tuxcare.1
4.0.3-tuxcare.3
@nuxt/schema
TuxCare:npm
From an advisory covering 2 CVEs
4.0.3-tuxcare.0 up to 4.0.3-tuxcare.3, plus listed versions
4.0.34.0.3-tuxcare.1
4.0.3-tuxcare.3
@nuxt/schema
TuxCare:npm
From an advisory covering 11 CVEs
3.12.4-tuxcare.0 up to 3.12.4-tuxcare.12, plus listed versions
3.12.43.12.4-tuxcare.103.12.4-tuxcare.113.12.4-tuxcare.23.12.4-tuxcare.3
Show 4 moreShow less
3.12.4-tuxcare.63.12.4-tuxcare.73.12.4-tuxcare.83.12.4-tuxcare.9
3.12.4-tuxcare.12
@nuxt/vite-builder
TuxCare:npm
From an advisory covering 2 CVEs
4.0.3-tuxcare.0 up to 4.0.3-tuxcare.3, plus listed versions
4.0.34.0.3-tuxcare.1
4.0.3-tuxcare.3
Show 5 moreShow less
Affected packages
PackageAffectedFixed
@nuxt/vite-builder
TuxCare:npm
From an advisory covering 11 CVEs
3.12.4-tuxcare.0 up to 3.12.4-tuxcare.12, plus listed versions
3.12.43.12.4-tuxcare.103.12.4-tuxcare.113.12.4-tuxcare.23.12.4-tuxcare.3
Show 4 moreShow less
3.12.4-tuxcare.63.12.4-tuxcare.73.12.4-tuxcare.83.12.4-tuxcare.9
3.12.4-tuxcare.12
@nuxt/webpack-builder
TuxCare:npm
From an advisory covering 2 CVEs
4.0.3-tuxcare.0 up to 4.0.3-tuxcare.3, plus listed versions
4.0.34.0.3-tuxcare.1
4.0.3-tuxcare.3
@nuxt/webpack-builder
TuxCare:npm
From an advisory covering 11 CVEs
3.12.4-tuxcare.0 up to 3.12.4-tuxcare.12, plus listed versions
3.12.43.12.4-tuxcare.113.12.4-tuxcare.23.12.4-tuxcare.33.12.4-tuxcare.4
Show 5 moreShow less
3.12.4-tuxcare.53.12.4-tuxcare.63.12.4-tuxcare.73.12.4-tuxcare.83.12.4-tuxcare.9
3.12.4-tuxcare.12
nuxt
npm
3.4.3 up to 3.21.6
3.21.6
nuxt
npm
4.0.0-alpha.1 up to 4.4.6
4.4.6

History

History
RecordedChangedSources
affected, facts
first indexedCVE List, EUVD, GitHub Advisories, NVD, OSV

Dates are when Every CVE recorded each change. Upstream dates may differ.

In short

CVE-2026-45669 is a medium vulnerability (CVSS 5.3) in @clerk Nuxt, published May 19, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.18%, the 7th percentile. Fixed in nuxt 3.21.6.

References

MoveEnter Open