chore(deps): update dependency nuxt to v3 [security] - #117
Conversation
|
Important Review skippedBot user detected. To trigger a single review, invoke the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
📝 WalkthroughWalkthroughThe upgrade from Nuxt.js version Changes
Poem
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 0
Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Files ignored due to path filters (1)
nuxt/package-lock.jsonis excluded by!**/package-lock.json
Files selected for processing (1)
- nuxt/package.json (1 hunks)
Additional comments not posted (1)
nuxt/package.json (1)
35-35: Approve the Nuxt version upgrade but verify compatibility and code adjustments.The upgrade from Nuxt.js version
2.15.8to3.12.4is necessary to address the security vulnerability (CVE-2024-34343) and introduces significant improvements. However, this major version upgrade may impact compatibility with other dependencies and require code adjustments. Ensure to verify compatibility and make necessary code adjustments to fully leverage the benefits of Nuxt 3.
9e240c5 to
e135577
Compare
e135577 to
1afe030
Compare
1afe030 to
eb8cb06
Compare
eb8cb06 to
d4d9b41
Compare
d4d9b41 to
b970f57
Compare
b970f57 to
4e156c5
Compare
4e156c5 to
e0a61b3
Compare
e0a61b3 to
1b4616c
Compare
1b4616c to
ce80d86
Compare
ce80d86 to
4d24ef0
Compare
4d24ef0 to
e69b685
Compare
e69b685 to
910e643
Compare
910e643 to
57a9a85
Compare
cd57e99 to
691fd34
Compare
691fd34 to
b535233
Compare
b535233 to
c265058
Compare
11c184f to
a88dc9f
Compare
a88dc9f to
bfef0f3
Compare
6500997 to
304cc5f
Compare
4549204 to
daceb68
Compare
1af63d8 to
ddd2f4d
Compare
ddd2f4d to
37c4570
Compare
837bbfb to
752a3e0
Compare
a846f98 to
199bec0
Compare
199bec0 to
dea72f4
Compare
3244cd0 to
c5be67d
Compare
c5be67d to
3a0c944
Compare
3a0c944 to
7e4634b
Compare
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## develop #117 +/- ##
===========================================
+ Coverage 90.24% 90.54% +0.29%
===========================================
Files 13 9 -4
Lines 2132 2125 -7
Branches 103 103
===========================================
Hits 1924 1924
+ Misses 203 196 -7
Partials 5 5 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
7e4634b to
078ceb4
Compare
|
This PR contains the following updates:
2.15.8→3.21.7nuxt vulnerable to Cross-site Scripting in navigateTo if used after SSR
CVE-2024-34343 / GHSA-vf6r-87q4-2vjf
More information
Details
Summary
The
navigateTofunction attempts to blockthejavascript:protocol, but does not correctly use API's provided byunjs/ufo. This library also contains parsing discrepancies.Details
The function first tests to see if the specified URL has a protocol. This uses the unjs/ufo package for URL parsing. This function works effectively, and returns true for a
javascript:protocol.After this, the URL is parsed using the
parseURLfunction. This function will refuse to parse poorly formatted URLs. Parsingjavascript:alert(1)returns null/"" for all values.Next, the protocol of the URL is then checked using the
isScriptProtocolfunction. This function simply checks the input against a list of protocols, and does not perform any parsing.The combination of refusing to parse poorly formatted URLs, and not performing additional parsing means that script checks fail as no protocol can be found. Even if a protocol was identified, whitespace is not stripped in the
parseURLimplementation, bypassing theisScriptProtocolchecks.Certain special protocols are identified at the top of
parseURL. Inserting a newline or tab into this sequence will block the special protocol check, and bypass the latter checks.PoC
POC - https://stackblitz.com/edit/nuxt-xss-navigateto?file=app.vue
Attempt payload X, then attempt payload Y.
Impact
XSS, access to cookies, make requests on user's behalf.
Recommendations
As always with these bugs, the
URLconstructor provided by the browser is always the safest method of parsing a URL.Given the cross-platform requirements of nuxt/ufo a more appropriate solution is to make parsing consistent between functions, and to adapt parsing to be more consistent with the WHATWG URL specification.
Note
I've reported this vulnerability here as it is unclear if this is a bug in ufo or a misuse of the ufo library.
This ONLY has impact after SSR has occurred, the
javascript:protocol within a location header does not trigger XSS.Severity
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:N/VI:N/VA:N/SC:L/SI:L/SA:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Cross-site scripting via slot content in Nuxt's head components
GHSA-m3q2-p4fw-w38m
More information
Details
Impact
Nuxt's globally registered
<NoScript>component (from@unhead/vuehead components, re-exported by Nuxt) wrote its default-slot content to theinnerHTMLof the<noscript>head tag, bypassing the HTML escaping that{{ }}interpolation normally applies in Vue templates.Applications that placed untrusted, attacker-controllable data inside a
<NoScript>slot, for example:would emit that value unescaped inside
<noscript>in the server-rendered HTML. With scripting enabled, the HTML parser treats<noscript>content in<head>under the "in head noscript" insertion mode: any tag other thanlink,meta,noframes, orstyleimplicitly closes<noscript>and is re-processed in the head. A payload such as<script>...</script>therefore escapes the element and executes in the document context.Sibling head components (
<Style>,<Title>) were not affected because they already routed slot text through the safetextContentpath.Affected versions
All currently supported versions of
nuxtthat ship the<NoScript>global component.Patches
Fixed in
nuxt@4.4.7(commit4b054e9d) and backported tonuxt@3.21.7(commit7fea9fd6). The fix escapes<NoScript>slot content withescapeHtmlfrom@vue/sharedand writes it totextContentrather thaninnerHTML. Slot content is now rendered as text; intentional markup inside<NoScript>is no longer parsed as HTML.Workarounds
Until you can upgrade:
<NoScript>slots. Replace<NoScript>{{ x }}</NoScript>with a static string, or sanitise / HTML-escapexat the source.useHead({ noscript: [{ textContent: escapedValue }] })after escapingescapedValue.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.Severity
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:P/VC:L/VI:L/VA:N/SC:N/SI:N/SA:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Release Notes
nuxt/nuxt (nuxt)
v3.21.7Compare Source
👉 make sure to check https://github.com/nuxt/nuxt/security/advisories to view open advisories resolved by this release.
👉 Changelog
compare changes
🩹 Fixes
noSSRbefore deciding payload extraction (#35108)allowDirs(#35112)pathefor buildCache path boundary check (#35111)isValidin dev clipboard-copy listener (#35109)reloadNuxtApppath before reload (#35115)clientServerwithssr: false(#34959).d.mts/.d.ctsinresolveTypePaths(#35235)<NuxtClientFallback>ssr output (#35199)isScriptProtocolguard tonavigateToopen option (#35206)defuin app config template (40bedf0db)vue-router(3f3e3fa7b)<NoScript>slot content (7fea9fd68)navigateTo(1f2dd5e78)reloadNuxtApp(6497d99dd)<NuxtLink>href (53284043d)defu(d11d7b1b5)📖 Documentation
🏡 Chore
execFileSyncfor safety in release scripts (9a455a658)✅ Tests
🤖 CI
❤️ Contributors
v3.21.6Compare Source
👉 Changelog
compare changes
🩹 Fixes
setPageLayoutprops on same-path navigation (#35055)useLoadingIndicatorproperties as readonly (#35062)statusCodefor nitro v2 compatibility (82dcd6a31)💅 Refactors
📖 Documentation
🏡 Chore
✅ Tests
app/(6d2ac69ff)🤖 CI
test:enginesfails (958abb882)❤️ Contributors
v3.21.5Compare Source
👉 Changelog
compare changes
🔥 Performance
isIgnoredrelative (#35015)🩹 Fixes
/+ overridessr: true(#34990).envbefore resolving nuxt schema (#34958)serverHandlersarray afternitro:config(#34985)📖 Documentation
🏡 Chore
✅ Tests
buildDirper matrix project for shared fixtures (#35007)❤️ Contributors
v3.21.4Compare Source
v3.21.2Compare Source
v3.21.1Compare Source
👉 Changelog
compare changes
🩹 Fixes
server/forbuilder:watchhook (#34208)x-nitro-prerenderheader (#34202)error.messagefor fatal errors (#34226)#appbarrel export in keyed functions (#34199)datetime in` (#33992)nuxt/schema(#34255)meta.name(#34263)#componentsimport mapping conflict for packages outside rootDir (#34139)nuxt/schemaonce more (9f5bb611d)💅 Refactors
genObjectKeyto omit unnecessary quotes (#34245)ComponentPropshelper to extract layout props (#34248)📖 Documentation
keyedComposables(#34201)🏡 Chore
pxfromwidthattribute (e80147f7d)✅ Tests
<NuxtPage>navigation (707a9dc44)❤️ Contributors
v3.21.0Compare Source
Nuxt 4.3 and 3.21 bring powerful new features for layouts, caching, and developer experience – plus significant performance improvements under the hood.
📣 Some News
Extended v3 Support
Early this month, I opened a discussion to find out how the upgrade had gone from v3 to v4. I was really pleased to hear how well it had gone for most people.
Having said that, we're committed to making sure no one gets left behind. And so we will continue to provide security updates and critical bug fix releases beyond the previously announced end-of-life date of January 31, 2026, meaning Nuxt v3 will meet its end-of-life on July 31, 2026.
Preparing for Nuxt 5
We're closer than ever to the releases of Nuxt v5 and Nitro v3. In the coming weeks, the
mainbranch of the Nuxt repository will begin receiving initial commits for Nuxt 5. However, it's still business as usual.mainbranch4.xand3.xbranchesKeep an eye out on the Upgrade Guide – we'll be adding details about how you can already start migrating your projects to prepare for Nuxt v4 with
future.compatibilityVersion: 5.🗂️ Route Rule Layouts
But that's enough about the future. We have a lot of good things for you today!
First, you can now set layouts directly in route rules using the new
appLayoutproperty (#31092). This provides a centralized, declarative way to manage layouts across your application without scatteringdefinePageMetacalls throughout your pages.This might be useful for:
📦 ISR/SWR Payload Extraction
Payload extraction now works with ISR (incremental static regeneration), SWR (stale-while-revalidate) and cache
routeRules(#33467). Previously, only pre-rendered pages could generate_payload.jsonfiles.This means:
🧹 Dev Mode Payload Extraction
Related to the above, payload extraction now also works in development mode (#30784). This makes it easier to test and debug payload behavior without needing to run a production build.
🚫 Disable Modules from Layers
When extending Nuxt layers, you can now disable specific modules that you don't need (#33883). Just pass
falseto the module's options:🏷️ Route Groups in Page Meta
Route groups (folders wrapped in parentheses like
(protected)/) are now exposed in page meta (#33460). This makes it easy to check which groups a route belongs to in middleware or anywhere you have access to the route.This provides a clean, convention-based approach to route-level authorization without needing to add
definePageMetato every protected page.🎨 Layout Props with
setPageLayoutThe
setPageLayoutcomposable now accepts a second parameter to pass props to your layout (#33805):🔧
#serverAliasA new
#serveralias provides clean imports within your server directory (#33870), similar to how#sharedworks:The alias includes import protection – you can't accidentally import
#servercode from client or shared contexts.🪟 Draggable Error Overlay
The development error overlay introduced in Nuxt 4.2 is now draggable and can be minimized (#33695). You can:
This is a quality-of-life improvement when you're iterating on fixes and don't want the overlay blocking your view.
https://github.com/user-attachments/assets/nuxt_4-3_error_demo.mp4
⚙️ Async Plugin Constructors
Module authors can now use async functions when adding build plugins (#33619):
This enables true lazy loading of build plugins, avoiding unnecessary code loading when plugins aren't needed.
🚀 Performance Improvements
This release includes several performance optimizations for faster builds:
nuxt:ssr-stylesplugin is now significantly faster (#33862, #33865)rou3, removing the need forradix3in the client bundle and eliminating app manifest fetches (#33920)🎨 Inline Styles for Webpack/Rspack
The
inlineStylesfeature now works with webpack and rspack builders (#33966), not just Vite. This enables critical CSS inlining for better Core Web Vitals regardless of your bundler choice.statusCode→status,statusMessage→statusTextIn preparation for Nitro v3 and H3 v2, we're moving to use Web API naming conventions (#33912). The old properties still work but are deprecated in advance of v5:
🐛 Bug Fixes
Notable fixes in this release:
keyattribute (#33958, #33963)useCookieunsafe number parsing during decode (#34007)NuxtPagenot re-rendering when nestedNuxtLayouthas layouts disabled (#34078)allowArbitraryExtensionsby default in TypeScript config (#34084)noUncheckedIndexedAccessto server tsconfig for safer typing (#33985)📚 Documentation
🎉 Nuxt 3.21.0
Alongside v4.3.0, we're releasing Nuxt v3.21.0 with many of the same improvements backported to the 3.x branch. This release includes:
setPageLayout,#serveralias, draggable error overlay, and morefalseuseCookienumber parsing, head component deduplication, and more✅ Upgrading
Our recommendation for upgrading is to run:
This will deduplicate your lockfile and help ensure you pull in updates from other dependencies that Nuxt relies on, particularly in the unjs ecosystem.
👉 Changelog
compare changes
🚀 Enhancements
#serveralias for server directory imports (#33870)crosswstypes (6ff79ea6c)false(#33883)moduleDependenciesas an async function (#33504)appLayoutin route rules (#31092)setPageLayout(#33805)🔥 Performance
nuxt:ssr-stylesplugin (#33862)🩹 Fixes
router.replacein page hmr (#33897)page:loading:endin cache if already called (fbbe10133)NUXT_VITE_NODE_OPTIONS(8abb7ef5b)appMiddlewarereferences invalid key (ed8bb68c5)nuxt/meta(b748840bc)keyfor tag deduplication in<Head>component (#33958)build.transpilewhen initialising vite (#33868)onUpgradearguments with types (#33988)rou3(7da94e8c3)noUncheckedIndexedAccessto server tsconfig (#33985)useRequestFetch(#33976)h3types to auto-imports (#34035)nuxt/schema(9b40196a6)NuxtPagewhen nestedNuxtLayouthas explicitly disabled layouts (#34078)allowArbitraryExtensionsby default (#34084)useAsyncDatadebounced execute post watcher flush (#34125)typeFromsupport forimports.d.tstemplate exports (#34135)hydrate-nevercomponents (#34132)💅 Refactors
defu+consola(e31668f67).tsfile extensions to relative imports (458f3c9b6)<>toas(08f72881e)~prefix for internal ssrContext properties (#33896)status/statusText+ deprecate old props (#33912)nitropack/runtimenamespace (b06d53166)nitropack/runtimenamespace (897a2259f)📖 Documentation
useHeadreturn type (#33857)Module Author Guides(#33803)statusText(#32834)defineWrappedResponseHandler(#33952)useStatedocs (#34105).nuxtrcexample (#34107)appLayout(9b78698c3)falseto its options (18500730c)sourcefrom<NuxtIsland>(08778c98c)📦 Build
vite-nodeentrypoints (#33893)obuildexcept for nuxt + nitro-server packages (#34049)/builder-envsubpath types (1951648fa)🏡 Chore
build:stubcommand for those that need it (c682b2681)Configuration
📅 Schedule: (UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.