Aug 6, 2026·7 min read·2 visits
Nuxt route rules are silently bypassed for mixed-case paths due to a key-matching case mismatch, allowing unauthenticated attackers to skip authorization checks.
An security bypass vulnerability exists in Nuxt frameworks where route rules containing mixed-case characters are silently dropped during case-insensitive routing. This occurs because lookups are folded to lowercase, but keys are stored in their original casing in the route-matching trie. As a result, critical authorization middleware, such as appMiddleware, is bypassed, allowing unauthorized access to restricted pages.
Nuxt is an open-source web development framework built on top of Vue.js. To implement centralized security rules, authentication checks, and rendering behaviors, Nuxt relies on application-level route rules defined within the framework configuration. These rules map specific URL paths to critical settings such as authorization guards (appMiddleware), server-side rendering configurations (ssr), and caching behaviors. The routing layer processes client requests and applies these middleware definitions prior to page rendering.
The vulnerability identified as CVE-2026-71315 arises from improper case-sensitivity handling within this routing layer. It constitutes an incomplete patch for a predecessor vulnerability, CVE-2026-53721. While the client request paths are matched case-insensitively by default inside the front-end router (vue-router), the backing route rules engine fails to apply matching policies correctly when mixed-case paths are requested. This mismatch results in security-critical middleware being silently dropped.
An unauthenticated remote attacker can exploit this discrepancy to bypass administrative authentication gates and access restricted pages. Because the router matches the URL and serves the corresponding page, but the rule engine fails to register the matching security policy, the targeted page is rendered without executing the specified security middleware. This leads to a complete bypass of client-side or server-side authorization controls on the affected routes.
The core of the vulnerability lies in the structural discrepancy between how the client-side routing library (vue-router) and the matching trie structure (rou3) process URL paths. By default, Nuxt configures routing in a case-insensitive manner to ensure standard web compatibility. This means that a client request to /admin or /Admin is routed to the exact same component, typically generated from a Vue file structure such as pages/Admin.vue.
To prevent routing bypasses in previous versions (specifically CVE-2026-53721), the framework developers attempted to force case insensitivity during the rule-matching phase. They achieved this by converting the incoming client-requested path to lowercase via .toLowerCase() before querying the route rules engine. However, this normalization was only performed on one half of the lookup pair. The keys representing the compiled route rules were still stored verbatim in the rou3 matching tree.
If an application registers a route rule using a mixed-case or capitalized key, such as /Admin/**, the rule is stored in the trie with those exact uppercase characters. When a client requests /admin, the incoming path is folded to lowercase /admin and compared against the trie. Because /admin does not match /Admin/** in the case-sensitive trie engine, the lookup fails and returns an empty rule set. The framework then renders the route without enforcing the associated security controls.
The vulnerability stems from the compile-time generation of the route rules dictionary and the run-time lookup logic. The vulnerable codebase utilized a forced lowercase normalization during runtime lookups inside packages/nuxt/src/app/composables/manifest.ts:
// Vulnerable lookup logic in packages/nuxt/src/app/composables/manifest.ts
export function getRouteRules (arg: string | H3Event | { path: string }) {
const path = typeof arg === 'string' ? arg : arg.path
try {
// The path was forcibly converted to lowercase, causing mismatches
// with case-sensitive route keys registered in the router.
return routeRulesMatcher(path.toLowerCase())
} catch (e) {
manifestDiagnostics.NUXT_E5003({ path, cause: e })
return {}
}
}The fix implemented in commits 6199633 and ad624a7 addresses this by generating two distinct matchers during build-time compilation. The build system evaluates the application configuration to determine if router.options.sensitive is active. It then constructs a verbatim sensitiveMatcher and a case-folded foldedMatcher within packages/nitro-server/src/index.ts. If routing is case-insensitive, the keys within the foldedMatcher are normalized to lowercase during initialization.
// Patched build-time key folding in packages/nitro-server/src/index.ts
const caseSensitiveRouteRules = !!nuxt.options.router.options.sensitive
const foldRouteRuleKey = (route: string) => caseSensitiveRouteRules || typeof route !== 'string' ? route : route.toLowerCase()
function getRouteRulesRouter (fold: boolean) {
const routeRulesRouter = createRou3Router<NitroRouteRules>()
if (nuxt._nitro) {
const foldedKeys = new Map<string, string>()
for (const [route, rules] of Object.entries(nuxt._nitro.options.routeRules)) {
if (route === '/__nuxt_error') { continue }
if (validManifestKeys.every(key => !(key in rules))) { continue }
// Key is folded to lowercase if folding is enabled
const key = fold && typeof route === 'string' ? route.toLowerCase() : route
if (fold) {
const existing = foldedKeys.get(key)
if (existing !== undefined && existing !== route && !caseSensitiveRouteRules) {
logger.warn(`Route rules match collision...`)
}
foldedKeys.set(key, route)
}
addRoute(routeRulesRouter, undefined, key, rules)
}
}
return routeRulesRouter
}Additionally, the forced .toLowerCase() call was removed from the runtime client composable. This ensures that when case sensitivity is explicitly enabled, the original path casing is preserved, preventing structural regressions while maintaining reliable matching under default case-insensitive conditions.
To exploit this vulnerability, an attacker must identify an application that relies on Nuxt route rules to enforce middleware-level authorization. The vulnerability requires that the target application has declared route rules using mixed-case paths (e.g., /Admin/** or /SecureDash/**) and is running a vulnerable version of Nuxt. Furthermore, the routing configuration must be set to the default case-insensitive mode.
The attack relies on sending HTTP requests that trigger a mismatch inside the route engine while remaining valid in the page router. An attacker targeting a protected admin page situated at pages/Admin.vue sends an unauthenticated HTTP GET request to /admin. Because vue-router resolves paths case-insensitively, it maps /admin to the administrative page component and proceeds to execute rendering.
During this rendering phase, Nuxt queries the route rules matcher to load the configuration for /admin. The matcher folds the lookup path to /admin but queries a trie containing only /Admin/**. Finding no match, the rule engine returns empty results. The application-level security middleware (appMiddleware), which would normally intercept unauthorized requests, is never executed. The server then transmits the rendered restricted interface directly to the attacker.
The security impact of CVE-2026-71315 is rated High, with a CVSS v3.1 base score of 8.2. The primary consequence is the total bypass of application-level authorization controls, leading to unauthorized access to restricted features, administrative panels, and sensitive data. Since the bypass is executed entirely through standard client requests, exploitation requires no prior privileges or user interaction.
The vulnerability compromises the integrity of defense-in-depth architectures. When developers place authentication checks exclusively in nuxt.config.ts route rules (such as specifying token verification in appMiddleware), they assume these gates are infallible entry points. This vulnerability invalidates that assumption, exposing internal APIs and administrative workflows directly to the public internet.
Although the vulnerability does not directly allow remote code execution, the unauthorized administrative access achieved can be leveraged as a stepping stone. Attackers can abuse exposed administrative workflows to modify database records, disclose proprietary data, or compromise user sessions. The lack of public exploit code does not diminish the severity, as exploitation involves simple path manipulation.
The most effective resolution is upgrading the Nuxt dependency to a patched release. For applications running on the 3.x branch, upgrade to version 3.21.10 or higher. Applications running on the 4.x branch must upgrade to version 4.5.1 or higher. These updates ensure that compiled route rules are properly synchronized with runtime lookups.
If an immediate upgrade is not feasible, developers must normalize their configurations to mitigate the risk. Modify all routeRules declared in nuxt.config.ts to be strictly lowercase (e.g., rename /Admin/** to /admin/**). This alignment eliminates the casing mismatch between the trie keys and the runtime lookups.
Alternatively, applications can transition to case-sensitive routing by configuring router.options.sensitive: true inside the Nuxt configuration file. As a final defensive measure, avoid relying solely on global configuration rules for access control. Implement component-level authorization checks inside page setup scripts using definePageMeta or inline route guards to ensure robust protection.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:L/A:N| Product | Affected Versions | Fixed Version |
|---|---|---|
Nuxt Nuxt | >= 3.21.7, < 3.21.10 | 3.21.10 |
Nuxt Nuxt | >= 4.4.7, < 4.5.1 | 4.5.1 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-178 / CWE-863 |
| Attack Vector | Network (AV:N) |
| CVSS Severity | 8.2 (High) |
| Exploit Status | No public PoC or active exploitation |
| Impact | Authorization Bypass & Data Disclosure |
| Vulnerable Component | Nuxt Route Rules Matcher |
The software does not properly handle case sensitivity when processing names or identifiers, leading to security bypasses or unexpected behavior.
A path traversal vulnerability (Zip Slip variant) exists in rclone's archive extract functionality before version 1.74.4. The command fails to sanitize relative directory components in archive headers, allowing files to be written outside the target directory or cloud prefix. This issue can result in arbitrary file writes or cloud object overwrites depending on the permissions of the credentials used. Nick Craig-Wood authored the patch on June 29, 2026, which was released in version 1.74.4 on July 14, 2026. This vulnerability is assigned CVE-2026-59732 and is cataloged as GHSA-4vr5-p2gc-h23p. This report provides a detailed root cause analysis, code-level diff, and remediation steps.
A local encoding path traversal vulnerability exists in rclone versions from v1.51.0 up to v1.75.0. When non-default local encoding parameters (such as Slash, None, or Raw) are specified, rclone's standard decoder maps safely encoded fullwidth dot-dot characters back into native directory traversal components. Since the local backend historically lacked a post-resolution path containment check, these relative segments resolved outside the designated synchronization root, allowing arbitrary file creation and modification on the host system.
CVE-2026-71316 is a high-severity vulnerability affecting the Nuxt web development framework in versions 4.4.0 up to (but excluding) 4.5.1. Due to the lack of runtime isolation in the shared server runtime storage driver, unauthenticated remote attackers can query the static-like JSON representation of a route's server-side rendered (SSR) state (_payload.json) and bypass configured page guards and application middleware to obtain highly sensitive user session records.
CVE-2026-71318 is a vulnerability in Nuxt where unauthenticated remote attackers can trigger unauthorized component instantiation and arbitrary HTML element injection. This security flaw is caused by default attribute inheritance (fallthrough) combined with polymorphic root components inside island components accessible via the /__nuxt_island/ endpoint. Attackers can bypass standard routing checks to instantiate globally registered components or inject raw HTML tags like iframes. This vector is highly reachable since it does not require enabling the vue.runtimeCompiler option. It is patched in Nuxt versions 3.21.10 and 4.5.1.
An unauthenticated remote code execution (RCE) vulnerability exists in Nuxt DevTools prior to version 3.3.1. The vulnerability arises from an unauthenticated RPC channel exposed over the Vite Hot Module Replacement (HMR) WebSocket server, allowing an attacker to modify file editor configurations and execute arbitrary commands under the server context.
A highly critical Server-Side Remote Code Execution (RCE) vulnerability exists in the Nuxt framework when Server Islands and the Vue runtime compiler are simultaneously enabled. This allows unauthenticated remote attackers to execute arbitrary system commands on the host process by passing a crafted component definition object to the dynamic component resolution engine via public island endpoints.