A wildcard redirect route rule whose target is /** copies the rest of the request path into the Location header. The 2.13.4 fix for GHSA-9phm-9p8f-hw5m collapses only a leading //, and only when the rule has no strip base. A remainder that starts with a backslash (raw or %5C) or with a tab followed by a slash (%09/) is emitted unchanged. Browsers treat \ as / in special-scheme URLs and strip tab, LF and CR, so /\evil.example and /<TAB>/evil.example resolve to //evil.example, a cross-origin redirect.
Affected code (nitropack v2):
src/runtime/internal/route-rules.ts, redirect branch:'/old/**'): isPathInScope() passes, because WHATWG URL canonicalizes \ to / and the path stays under /old. Then withoutBase(event.path, base) returns /\evil.example unchanged, and joinURL("/", ...) keeps it.'/**'): only ^//+ is collapsed. /\, /%5C and /<TAB>/ pass through.%5C and %09 in event.path, so the Location contains the literal characters.export default defineNitroConfig({
routeRules: { "/old/**": { redirect: "/**" } },
});| Request | Location (≤ 2.13.5) | Browser resolves to | Location after fix |
|---|---|---|---|
/old/%5Cevil.example | /\evil.example | https://evil.example | /evil.example |
/old/\evil.example | /\evil.example | https://evil.example | /evil.example |
/old/%5c%5cevil.example | /\\evil.example | https://evil.example | /evil.example |
/old/%5C/evil.example | /\/evil.example | https://evil.example | /evil.example |
/old/%09/evil.example | /<TAB>/evil.example | https://evil.example | /evil.example |
/%5Cevil.example (catch-all '/**') | /\evil.example | https://evil.example | /evil.example |
/%09/evil.example (catch-all) | /<TAB>/evil.example | https://evil.example | /evil.example |
/old/%0A/evil.example | 500 (Node rejects the header) | not exploitable on Node; defence in depth | /evil.example |
An attacker sends a victim a link on the trusted site, such as https://victim.example/old/%5Cevil.example. The site redirects the victim's browser to an attacker-controlled origin.
You are affected if all of these are true:
redirect route rule whose target is exactly /**, with nothing before it;Fixed in nitropack 2.13.6. Any leading run of slashes, backslashes, control characters and their percent-encoded forms in the redirect remainder is collapsed to a single /, so the Location header is always a same-origin path.
If you cannot upgrade:
/new/** instead of /**);Fuente: NVD
Evaluación gratuita de vulnerabilidades
Evalúa tus prácticas de seguridad en la nube en 9 dominios de seguridad para evaluar tu nivel de riesgo e identificar brechas en tus defensas.
Obtén una demostración personalizada
"La mejor experiencia de usuario que he visto en mi vida, proporciona una visibilidad completa de las cargas de trabajo en la nube."
"Wiz proporciona un panel único para ver lo que ocurre en nuestros entornos en la nube."
"Sabemos que si Wiz identifica algo como crítico, en realidad lo es."