GHSA-wjr9-j795-jxcr: Input Validation
Impact
fast-uri versions >= 2.4.2, <= 2.4.7, >= 3.1.3, <= 3.1.8, and >= 4.0.1, <= 4.2.2 can silently rewrite the host of an HTTP-family URL (http, https, ws, wss, or any scheme with domainHost: true). For those schemes canonicalizeHost() passes the parsed host to the WHATWG URL parser and adopts its .hostname without checking that the parser read the whole input as a host. RFC 3986 permits @ inside the host group and the WHATWG parser strips TAB, LF, and CR, so the authority fast-uri reports is rewritten by that second parser with no error set: data before an @ is dropped and whitespace is removed.
For example, fast-uri parses http://a@b@evil.example/ to host evil.example (dropping the b segment), and a host containing a raw TAB, CR, or LF has those characters stripped. equal() then treats a whitespace-smuggled host as the same as the clean one, and resolve() rewrites the authority the same way.
Applications that use fast-uri to enforce host-based policy (denylists, loopback filtering, redirect validation, outbound proxy routing) on one representation, such as the raw input, see a policy/use desync: the canonical host fast-uri returns differs from what was checked, and traffic can be steered to an unintended destination.
Patches
Upgrade to fast-uri 2.4.8, 3.1.9, or 4.2.3.
Workarounds
Reject URIs whose authority contains more than one @, or contains TAB, CR, or LF, before calling fast-uri. Alternatively, treat any non-empty parse(x).error as fatal, and compare hosts only from the same parse() result.
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
npm/fast-urito a version that resolves this vulnerability.Fixed in 4.2.3 - Upgrade
Upgrade
npm/fast-urito a version that resolves this vulnerability.Fixed in 3.1.9 - Upgrade
Upgrade
npm/fast-urito a version that resolves this vulnerability.Fixed in 2.4.8 - Upgrade
Upgrade
fast-urito a version that resolves this vulnerability.Fixed in 2.4.8 - Upgrade
Upgrade
fast-urito a version that resolves this vulnerability.Fixed in 3.1.9 - Upgrade
Upgrade
fast-urito a version that resolves this vulnerability.Fixed in 4.2.3 - Compensating control
Before calling fast-uri, reject URIs whose authority contains more than one @ or contains TAB, CR, or LF.
- Compensating control
Treat any non-empty parse(x).error as fatal, and compare hosts only from the same parse() result.
Event History
Frequently Asked Questions
What does an attacker need to supply to trigger the parsing discrepancy?
The attacker needs control of a URL using http, https, ws, wss, or another scheme configured with domainHost: true. Relevant inputs include authorities with multiple @ characters, such as http://a@b@evil.example/, or hosts containing raw TAB, CR, or LF characters.
Which applications are realistically exposed?
Applications are exposed when they use fast-uri to make host-based security decisions on one URL representation and later use the canonicalized, resolved, or compared result. Examples called out include denylist enforcement, loopback filtering, redirect validation, and outbound proxy routing.
How can this affect host validation logic?
The host accepted or checked by application policy can differ from the host ultimately canonicalized by fast-uri without an error being set. Data before an @ may be dropped, whitespace may be removed, and equal() can treat a whitespace-smuggled host as equivalent to the clean host.