Packages / srvx / Security

ModerateVulnerabilityGHSA-p36q-q72m-gchrCVE-2026-33732Published 26 Mar 2026

srvx is vulnerable to middleware bypass via absolute URI in request line

Affected releases · srvx

  • 0.11.x0.11.0 – 0.11.12Fixed in 0.11.13
  • 0.10.x0.10.0 – 0.10.1No fix on this line yet
  • 0.9.x0.9.0 – 0.9.8No fix on this line yet
  • 0.8.x and older0.0.0 – 0.8.16No fix, no longer updated

On 0.11.x, the newest line:

npm install srvx@0.11.13
1.x
  1. Not affected

    1.0.0 – 1.0.7

    8 releases, latest

0.x
  1. Affected

    0.0.0 – 0.11.12

    68 releases

  2. Fixed

    0.11.13 – 0.12.8

    19 releases

95 stable releases of srvx, oldest to newest, one row per major.

Is your project affected?

Paste your package.json, or type the range you declare for srvx. It is read in your browser and sent nowhere.

What happens

Summary

A pathname parsing discrepancy in srvx's FastURL allows middleware bypass on the Node.js adapter when a raw HTTP request uses an absolute URI with a non-standard scheme (e.g. file://).

Details

When Node.js receives an absolute URI in the request line (e.g. GET file://hehe?/internal/run HTTP/1.1), req.url is set verbatim to file://hehe?/internal/run. Since this doesn't start with /, NodeRequestURL passes it directly to FastURL as a string, which stores it in #href for lazy manual parsing.

FastURL#getPos() locates the pathname by finding :// then scanning for the next / — but this fails for URLs like file://hehe?/internal/run where a ? appears before the first / after the authority. The manual parser extracts pathname as /internal/run, while native URL correctly parses it as pathname / with search ?/internal/run.

This discrepancy means the router (using the fast-path) matches /internal/run, but if any middleware triggers a deopt to native URL (e.g. by accessing hostname), subsequent middleware sees a different pathname — bypassing route-based middleware guards.

This is a bypass of CVE-2026-33131.

Impact

Route-based middleware (auth guards, rate limiters, etc.) can be bypassed on the Node.js adapter when a prior middleware triggers FastURL deopt. Requires sending a raw HTTP request (not possible from browsers).

Fix

srvx FastURL constructor now deopts to native URL for any string not starting with /, ensuring consistent pathname resolution.