{"id":"CVE-2026-44373","aliases":["EUVD-2026-30163","GHSA-5w89-w975-hf9q"],"status":"published","title":"Nitro: Proxy scope bypass via percent-encoded path traversal in `routeRules`","description":"Nitro is a next generation server toolkit. Prior to 3.0.260429-beta, an attacker could bypass a proxy route rule by sending percent-encoded path traversal (..%2f) in the URL, causing Nitro to forward a request that the upstream resolved outside the configured scope. This vulnerability is fixed in 3.0.260429-beta.","severity":{"version":"3.1","score":5.3,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N","level":"medium","assessor":"cna","from":"cve"},"epss":{"day":"2026-11-12","score":0.00453,"percentile":0.39789,"model":"v2026.06.15"},"facts":{"in_kev":false,"known_exploited":false,"public_exploit":false,"fix_available":true},"cwes":["CWE-22"],"published":"2026-05-06T23:01:27Z","modified":"2026-10-28T02:31:10Z","fixes":[{"ecosystem":"npm","package":"nitro","fixed_in":["3.0.260429-beta"],"sources":["ghsa","osv"]},{"ecosystem":"npm","package":"nitropack","fixed_in":["2.13.4"],"sources":["ghsa","osv"]}],"affected":[{"source":"ghsa","ecosystem":"npm","package":"nitro","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"3.0.260429-beta"}]}]},{"source":"ghsa","ecosystem":"npm","package":"nitropack","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"2.13.4"}]}]},{"source":"osv","ecosystem":"npm","package":"nitro","ranges":[{"type":"SEMVER","events":[{"introduced":"0"},{"fixed":"3.0.260429-beta"}]}]},{"source":"osv","ecosystem":"npm","package":"nitropack","ranges":[{"type":"SEMVER","events":[{"introduced":"0"},{"fixed":"2.13.4"}]}]}],"products":[{"vendor":"nitro","product":"nitro"},{"vendor":"nitrojs","product":"nitro"},{"vendor":"nitrojs","product":"nitropack"}],"references":[{"url":"https://github.com/nitrojs/nitro/security/advisories/GHSA-5w89-w975-hf9q","tags":["x_refsource_CONFIRM","Third Party Advisory","advisory","web"]},{"url":"https://github.com/nitrojs/nitro/pull/4222","tags":["x_refsource_MISC","Issue Tracking","Patch","fix","web"]},{"url":"https://github.com/nitrojs/nitro/pull/4223","tags":["x_refsource_MISC","Issue Tracking","Patch","fix","web"]},{"url":"https://github.com/nitrojs/nitro/releases/tag/v2.13.4","tags":["x_refsource_MISC","Release Notes","web"]},{"url":"https://github.com/nitrojs/nitro/releases/tag/v3.0.260429-beta","tags":["x_refsource_MISC","Release Notes","web"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-44373","tags":["advisory"]},{"url":"https://github.com/advisories/GHSA-5w89-w975-hf9q"},{"url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/44xxx/CVE-2026-44373.json","tags":["advisory"]},{"url":"https://github.com/nitrojs/nitro","tags":["package"]}],"sources":{"cve":[{"id":"CVE-2026-44373","title":"Nitro: Proxy scope bypass via percent-encoded path traversal in `routeRules`","description":"Nitro is a next generation server toolkit. Prior to 3.0.260429-beta, an attacker could bypass a proxy route rule by sending percent-encoded path traversal (..%2f) in the URL, causing Nitro to forward a request that the upstream resolved outside the configured scope. This vulnerability is fixed in 3.0.260429-beta.","status":"published","published":"2026-05-13T20:26:28.255Z","modified":"2026-05-14T13:16:50.542Z","cvss":[{"version":"3.1","score":5.3,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N","level":"medium","assessor":"cna"}],"cwes":["CWE-22"],"updated_at":"2026-11-02T13:43:00.288193Z"}],"euvd":[{"id":"EUVD-2026-30163","description":"Nitro is a next generation server toolkit. Prior to 3.0.260429-beta, an attacker could bypass a proxy route rule by sending percent-encoded path traversal (..%2f) in the URL, causing Nitro to forward a request that the upstream resolved outside the configured scope. This vulnerability is fixed in 3.0.260429-beta.","status":"published","published":"2026-05-13T20:26:28Z","modified":"2026-05-14T13:16:50Z","cvss":[{"version":"3.1","score":5.3,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N","level":"medium"}],"updated_at":"2026-11-02T19:04:31.58892Z"}],"ghsa":[{"id":"GHSA-5w89-w975-hf9q","title":"Nitro has a proxy scope bypass via percent-encoded path traversal in `routeRules`","description":"A proxy route rule like:\n\n```ts\nrouteRules: {\n  \"/api/orders/**\": { proxy: { to: \"http://upstream/orders/**\" } }\n}\n```\n\nis intended to limit the proxy to URLs under `/api/orders/`. Before the patch, an attacker could bypass that scope by sending percent-encoded path traversal (`..%2f`) in the URL, causing Nitro to forward a request that the upstream resolved outside the configured scope. Example exploit:\n\n```\nGET /api/orders/..%2fadmin%2fconfig.json\n```\n\nNitro sees `..%2f` as opaque characters at match time, the `/api/orders/**` rule matched, and the raw path was forwarded to the upstream as `/orders/..%2fadmin/config.json`. An upstream that decodes `%2F` to  `/` then resolved `..` and can serve `/admin/config.json` outside the intended scope.\n\n### Are you affected?\n\nUsers may be affected if **ALL** of the following are true:\n\n1. Their project uses Nitro's `routeRules` with a `proxy` entry (`{ proxy: { to: \"...\" } }`).\n2. The proxy `to` value uses a `/**` wildcard suffix to forward sub-paths.\n3. The **upstream** behind the proxy decodes `%2F` as `/` before routing or filesystem lookup.\n4. Proxy route rules are _not_ handled natively at CDN (nitro v3 and vercel)\n\nWhether the bypass actually leaks data depends on the upstream. Modern JS frameworks keep `%2F` opaque per RFC 3986 and are safe by construction. \n\n- **Safe examples:** H3 v2, Express v5, Hono v4 — modern JS frameworks keep `%2F` opaque per RFC 3986.\n- **Vulnerable examples:** naive imlementations that decodes the URL, static file servers, CGI dispatchers, Python `os.path`-based routing, anything sitting behind another layer that decodes `%2F` (common in microservice meshes).\n\n## Impact\n\nAny HTTP path reachable from the Nitro server to the upstream could be requested, regardless of the configured `/**` scope. In typical deployments (API gateway, BFF, microservice proxy) this could expose internal admin endpoints, secrets endpoints, or other services the developer believed the scope rule fenced off.\n\n## Patched versions\n\nUpgrade to one of:\n\n- [2.13.4](https://github.com/nitrojs/nitro/releases/tag/v2.13.4) or later (https://github.com/nitrojs/nitro/pull/4223) \n- [3.0.260429-beta](https://github.com/nitrojs/nitro/releases/tag/v3.0.260429-beta) or later (https://github.com/nitrojs/nitro/pull/4222)\n\nThe fix canonicalizes the incoming pathname before building the upstream URL and rejects requests with `400 Bad Request` if the resolved path would escape the rule's base. The bytes forwarded upstream are unchanged when the request is allowed.\n\n\u003e Note: the fix assumes the upstream does not double-decode percent-encoding. If your upstream decodes twice (`%252F → %2F → /`), it remains your responsibility to harden it. **Single-decode is standard**.\n\n## Credits\n\nReported by [@mHe4am](https://github.com/mHe4am) ([@he4am on HackerOne](https://hackerone.com/he4am)) via the [Vercel Open Source](https://hackerone.com/vercel-open-source?type=team) program.","status":"published","published":"2026-05-06T23:01:27Z","modified":"2026-05-14T20:42:51Z","cvss":[{"version":"3.1","score":5.3,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N","level":"medium"}],"cwes":["CWE-22"],"updated_at":"2026-11-02T14:40:10.269075Z"}],"nvd":[{"id":"CVE-2026-44373","description":"Nitro is a next generation server toolkit. Prior to 3.0.260429-beta, an attacker could bypass a proxy route rule by sending percent-encoded path traversal (..%2f) in the URL, causing Nitro to forward a request that the upstream resolved outside the configured scope. This vulnerability is fixed in 3.0.260429-beta.","status":"published","published":"2026-05-13T21:16:48.033Z","modified":"2026-10-26T17:10:03.27Z","cvss":[{"version":"3.1","score":5.3,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N","level":"medium","assessor":"secondary"}],"cwes":["CWE-22"],"updated_at":"2026-11-02T14:12:19.020465Z"}],"osv":[{"id":"CVE-2026-44373","title":"Nitro: Proxy scope bypass via percent-encoded path traversal in `routeRules`","description":"Nitro is a next generation server toolkit. Prior to 3.0.260429-beta, an attacker could bypass a proxy route rule by sending percent-encoded path traversal (..%2f) in the URL, causing Nitro to forward a request that the upstream resolved outside the configured scope. This vulnerability is fixed in 3.0.260429-beta.","status":"published","published":"2026-05-13T20:26:28.255Z","modified":"2026-10-28T02:31:10.237130006Z","cvss":[{"version":"3.1","score":5.3,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N","level":"medium"}],"cwes":["CWE-22"],"updated_at":"2026-11-02T15:45:04.820169Z"},{"id":"GHSA-5w89-w975-hf9q","title":"Nitro has a proxy scope bypass via percent-encoded path traversal in `routeRules`","description":"A proxy route rule like:\n\n```ts\nrouteRules: {\n  \"/api/orders/**\": { proxy: { to: \"http://upstream/orders/**\" } }\n}\n```\n\nis intended to limit the proxy to URLs under `/api/orders/`. Before the patch, an attacker could bypass that scope by sending percent-encoded path traversal (`..%2f`) in the URL, causing Nitro to forward a request that the upstream resolved outside the configured scope. Example exploit:\n\n```\nGET /api/orders/..%2fadmin%2fconfig.json\n```\n\nNitro sees `..%2f` as opaque characters at match time, the `/api/orders/**` rule matched, and the raw path was forwarded to the upstream as `/orders/..%2fadmin/config.json`. An upstream that decodes `%2F` to  `/` then resolved `..` and can serve `/admin/config.json` outside the intended scope.\n\n### Are you affected?\n\nUsers may be affected if **ALL** of the following are true:\n\n1. Their project uses Nitro's `routeRules` with a `proxy` entry (`{ proxy: { to: \"...\" } }`).\n2. The proxy `to` value uses a `/**` wildcard suffix to forward sub-paths.\n3. The **upstream** behind the proxy decodes `%2F` as `/` before routing or filesystem lookup.\n4. Proxy route rules are _not_ handled natively at CDN (nitro v3 and vercel)\n\nWhether the bypass actually leaks data depends on the upstream. Modern JS frameworks keep `%2F` opaque per RFC 3986 and are safe by construction. \n\n- **Safe examples:** H3 v2, Express v5, Hono v4 — modern JS frameworks keep `%2F` opaque per RFC 3986.\n- **Vulnerable examples:** naive imlementations that decodes the URL, static file servers, CGI dispatchers, Python `os.path`-based routing, anything sitting behind another layer that decodes `%2F` (common in microservice meshes).\n\n## Impact\n\nAny HTTP path reachable from the Nitro server to the upstream could be requested, regardless of the configured `/**` scope. In typical deployments (API gateway, BFF, microservice proxy) this could expose internal admin endpoints, secrets endpoints, or other services the developer believed the scope rule fenced off.\n\n## Patched versions\n\nUpgrade to one of:\n\n- [2.13.4](https://github.com/nitrojs/nitro/releases/tag/v2.13.4) or later (https://github.com/nitrojs/nitro/pull/4223) \n- [3.0.260429-beta](https://github.com/nitrojs/nitro/releases/tag/v3.0.260429-beta) or later (https://github.com/nitrojs/nitro/pull/4222)\n\nThe fix canonicalizes the incoming pathname before building the upstream URL and rejects requests with `400 Bad Request` if the resolved path would escape the rule's base. The bytes forwarded upstream are unchanged when the request is allowed.\n\n\u003e Note: the fix assumes the upstream does not double-decode percent-encoding. If your upstream decodes twice (`%252F → %2F → /`), it remains your responsibility to harden it. **Single-decode is standard**.\n\n## Credits\n\nReported by [@mHe4am](https://github.com/mHe4am) ([@he4am on HackerOne](https://hackerone.com/he4am)) via the [Vercel Open Source](https://hackerone.com/vercel-open-source?type=team) program.","status":"published","published":"2026-05-06T23:01:27Z","modified":"2026-05-14T20:48:31.940118Z","cvss":[{"version":"3.1","score":5.3,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N","level":"medium"}],"cwes":["CWE-22"],"updated_at":"2026-11-02T15:46:38.911014Z"}]}}
