GHSA-hxvh-4h3w-prp9

Suggest an improvement
Source
https://github.com/advisories/GHSA-hxvh-4h3w-prp9
Import Source
https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/08/GHSA-hxvh-4h3w-prp9/GHSA-hxvh-4h3w-prp9.json
JSON Data
https://api.test.osv.dev/v1/vulns/GHSA-hxvh-4h3w-prp9
Aliases
Published
2026-08-05T21:05:18Z
Modified
2026-08-05T21:15:15.800839380Z
Severity
  • 8.2 (High) CVSS_V3 - CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:L/A:N CVSS Calculator
Summary
Nuxt route rules silently dropped for mixed-case paths, bypassing appMiddleware auth gates (incomplete fix for CVE-2026-53721)
Details

Impact

Nuxt matches route rules case-insensitively by default (mirroring vue-router's default sensitive: false routing). The fix for GHSA-mm7m-92g8-7m47 / CVE-2026-53721 lowercased the lookup path before matching route rules, but the route-rule keys compiled into the matcher were left verbatim. As a result, any route rule whose key contains an uppercase character (for example /Admin, /Dashboard/**, or the rules Nuxt derives from PascalCase/camelCase page files such as pages/Admin.vue) never matches, because every lookup is folded to lowercase while the key stays mixed-case.

vue-router still serves the page case-insensitively, so the page renders with none of its Nuxt route-rule protections applied. The most serious consequence is an authorization bypass: an appMiddleware rule used as an auth gate (routeRules: { '/Admin/dashboard': { appMiddleware: 'auth' } }) is dropped, and /Admin/dashboard, /admin/dashboard, and /ADMIN/dashboard all render the protected page (and its SSR-fetched data) to an unauthenticated visitor instead of redirecting to login. The same gap drops Nuxt's other app-side route-rule behaviours for mixed-case keys, including the client redirect middleware, the app-side ssr: false decision, prerender, and payload handling.

Patches

Fixed in nuxt@4.5.1 (4.x) and nuxt@3.21.10 (3.x). The route-rule matcher now case-folds the compiled keys the same way it folds the lookup path, so key and lookup normalisation are symmetric. Both sides are gated on router.options.sensitive: with sensitive: true (case-sensitive routing) configured casing is preserved on both sides.

Scope note: server-emitted per-route headers, server redirect, and proxy are matched by Nitro's own case-sensitive route-rule matcher, not by Nuxt's app-level matcher. They are unchanged by this advisory. The fix covers the app-level protections Nuxt owns (appMiddleware, appLayout, the client redirect middleware, the app ssr decision, prerender, and payload).

Workarounds

If you cannot upgrade immediately, any one of:

  • Key all routeRules (and name your page files) in lowercase, so the keys already match the folded lookup path.
  • Set router: { options: { sensitive: true } } so routing and route-rule matching are both case-sensitive and exact (requests must then use the exact casing).
  • Enforce the sensitive protections server-side independently of route rules (for example a server middleware that checks auth), which does not rely on case-insensitive route-rule matching.
Database specific
{
    "nvd_published_at": null,
    "severity": "HIGH",
    "github_reviewed": true,
    "cwe_ids": [
        "CWE-178",
        "CWE-863"
    ],
    "github_reviewed_at": "2026-08-05T21:05:18Z"
}
References

Affected packages

npm / nuxt

Package

Affected ranges

Type
SEMVER
Events
Introduced
4.4.7
Fixed
4.5.1

Database specific

source
"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/08/GHSA-hxvh-4h3w-prp9/GHSA-hxvh-4h3w-prp9.json"

npm / nuxt

Package

Affected ranges

Type
SEMVER
Events
Introduced
3.21.7
Fixed
3.21.10

Database specific

source
"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/08/GHSA-hxvh-4h3w-prp9/GHSA-hxvh-4h3w-prp9.json"