fast-uri
Ecosystem: npm
Downloads: 701.74 Mln
- 0CriticalAffects 0 versions
- 11HighAffects 31 versions
- 0MediumAffects 0 versions
- 4ModerateAffects 10 versions
- 2LowAffects 6 versions
- Critical0 (0.0%)
- High11 (64.7%)
- Medium0 (0.0%)
- Moderate4 (23.5%)
- Low2 (11.8%)
Monthly breakdown
- Critical
- High
- Medium
- Moderate
- Low
- 4 vulnerabilities
- Critical: 0
- High: 0
- Medium: 0
- Moderate: 2
- Low: 2
- 8 vulnerabilities
- Critical: 0
- High: 6
- Medium: 0
- Moderate: 2
- Low: 0
- 1 vulnerabilities
- Critical: 0
- High: 1
- Medium: 0
- Moderate: 0
- Low: 0
- 2 vulnerabilities
- Critical: 0
- High: 2
- Medium: 0
- Moderate: 0
- Low: 0
- 2 vulnerabilities
- Critical: 0
- High: 2
- Medium: 0
- Moderate: 0
- Low: 0
Vulnerabilities (17)
Known vulnerabilities affecting fast-uri, based on data from OSV.
| ID | Severity | Summary | Affected versions | Published | Source |
|---|---|---|---|---|---|
| GHSA-333x-w4r6-6crp | Low | fast-uri vulnerable to scheme injection via an unescaped first-segment colon in suffix references### Impact `fast-uri`'s `serialize()`, `normalize()`, and `resolve()`, when called with the non-default option `reference: 'suffix'` on a reference that has no authority, emit a relative reference whose first path segment contains a bare colon without escaping it. RFC 3986 section 3.3 requires the first segment of a `path-noscheme` reference not to contain a colon, precisely because a bare colon makes the string reparse as an absolute URI with a scheme. `fast-uri`'s default serialization escapes that colon, but the suffix path does not. For example, `normalize('javascript:alert(1)', { refere |
| GitHub (opens in a new tab) | |
| GHSA-w74x-v6f9-j3xg | Moderate | fast-uri vulnerable to URI scheme spoofing via percent-encoded scheme decoding### Impact `fast-uri` percent-decodes the scheme component with the legacy global `unescape()` before validating it, so an input whose decoded scheme is a valid but dangerous token is emitted as a live scheme. RFC 3986 section 3.1 does not allow percent-encoding in a scheme, so no RFC or WHATWG parser treats such input as having that scheme, but `fast-uri` does. For example, `normalize('%6Aavascript:alert(1)')` returns `javascript:alert(1)`, `resolve('https://a.example/', '%6Aavascript:alert(1)')` returns `javascript:alert(1)`, and `parse('%6Aavascript:alert(1)').scheme` returns `javascript` |
| GitHub (opens in a new tab) | |
| GHSA-wjr9-j795-jxcr | Moderate | fast-uri vulnerable to host confusion via unchecked WHATWG host canonicalization### 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 |
| GitHub (opens in a new tab) | |
| GHSA-xhq7-xmqj-769h | Low | fast-uri vulnerable to improper path equivalence in relative reference normalization### Impact `fast-uri`'s `normalize()` and `serialize()` apply RFC 3986 dot-segment removal (`remove_dot_segments`) to the path of a relative-path reference. RFC 3986 section 5.2.4 defines that algorithm only for the merged target path during resolution, not for the reference itself, so applied to the reference it drops leading `..` segments and can turn a document-relative reference into a root-relative one. For example, `normalize('a/../b')` returns `/b` and `normalize('../x')` returns `x`, so `resolve(base, normalize(ref))` points at a different resource than `resolve(base, ref)`, and `equ |
| GitHub (opens in a new tab) | |
| GHSA-hrr3-gc8f-f4qj | Moderate | fast-uri vulnerable to inconsistent host case normalization via percent-encoded octets### Impact `fast-uri` folds the host to lowercase before it percent-decodes the host, so a percent-encoded uppercase unreserved octet such as `%41` decodes to a literal `A` that is never folded. For a scheme-relative reference (`//host`) there is no scheme, so the host canonicalization that repairs this on a scheme-bearing URL does not run. As a result `parse`, `normalize`, and `equal` disagree on the same host: `parse("//%41.com").host` returns `"A.com"` while `parse("//a.com").host` and `parse("//A.com").host` return `"a.com"`, and `equal("//%41.com", "//a.com")` is `false` even though `equ |
| GitHub (opens in a new tab) | |
| GHSA-jvvf-x445-j334 | Moderate | fast-uri vulnerable to mailto header injection via percent-encoded field-name desynchronization### Impact `fast-uri`'s `mailto` scheme parser compares each query field name to the reserved names (`to`, `subject`, `body`) while the name is still percent-encoded, and only percent-decodes it when storing it as a generic header. On serialize, the decoded name is re-emitted, so a field name such as `%74o` (percent-encoded `to`) is not recognized as a recipient at parse time (`parse().to` shows only the legitimate recipient) but materializes as a literal `to=` field after `serialize()`, and reparsing then treats it as a recipient. The same technique smuggles `subject` and `body` through `%73 |
| GitHub (opens in a new tab) | |
| GHSA-58mr-gqgx-xq4g | High | fast-uri vulnerable to host confusion via an unclosed bracket in the URI authority### Impact `fast-uri` accepts a host that contains an unbalanced or misplaced authority bracket (`[` or `]`) without reporting an error. A host that starts with `[` but does not end with `]`, such as `[@127.0.0.1`, is neither validated as an IP literal nor canonicalized as a domain name, so `parse()` returns it as the host with `error` undefined, while Node's `URL` (and `http.get`, `axios`, `got`, and other clients built on it) resolve the same string to `127.0.0.1`. An application that reads `parse().host` to make a host decision (an SSRF denylist, a redirect allowlist, or proxy routing) and |
| GitHub (opens in a new tab) | |
| GHSA-qw65-cvwx-89v3 | High | fast-uri vulnerable to authority injection via an unvalidated port in serialize### Impact `fast-uri` serializes the `port` component of a URI without validating it. When recomposing the authority, `fast-uri` escapes the userinfo and host components but concatenates the port verbatim, so a `port` value that is not a sequence of digits can inject authority delimiters. For example, serializing a component whose `port` is `@127.0.0.1:8124` produces `http://trusted.example:@127.0.0.1:8124/app`, demoting the intended host to userinfo and pointing the authority at an attacker-controlled host. Both `fast-uri` and Node's `URL` read the result back as the attacker's host with no |
| GitHub (opens in a new tab) | |
| GHSA-5jgf-p345-68v8 | High | fast-uri vulnerable to host confusion via skipped IDN canonicalization on scheme-relative references### Impact `fast-uri` canonicalizes a host to its ASCII form only when the input carries an explicit scheme. When `resolve()` resolves a scheme-relative reference (`//host/`) against a scheme-bearing base, it still emits the host verbatim even though the effective scheme is known, so re-parsing the resolved URI yields a different host than the one `resolve()` returned. An application that resolves an untrusted reference with `fast-uri` and then checks or routes on the resulting host can make a policy decision on one host and reach another. This is an incomplete-fix variant of CVE-2026-13676, |
| GitHub (opens in a new tab) | |
| GHSA-f65p-4m7j-42xc | High | fast-uri vulnerable to server-side request forgery via malformed IPv6 normalization### Impact `fast-uri` does not validate the complete RFC 3986 grammar for bracketed IPv6 literals, so a malformed literal with invalid trailing text is silently truncated to a different valid IPv6 address with no error reported. For example, `normalize('http://[::not-valid]/private')` returns `http://[::]/private`, and `[fc00::not-hex]` and `[fe80::not-hex]` collapse to `[fc00::]` and `[fe80::]`. An application that normalizes an untrusted URL before an outbound request, redirect, or host-policy check can be routed to a local or private address such as loopback (`::1`), unique-local, or link- |
| GitHub (opens in a new tab) |
- GHSA-333x-w4r6-6crpLowfast-uri vulnerable to scheme injection via an unescaped first-segment colon in suffix references
< 2.4.8>= 3.0.0, < 3.1.9- +1 more
Affected versions:< 2.4.8>= 3.0.0, < 3.1.9>= 4.0.0, < 4.2.3
### Impact `fast-uri`'s `serialize()`, `normalize()`, and `resolve()`, when called with the non-default option `reference: 'suffix'` on a reference that has no authority, emit a relative reference whose first path segment contains a bare colon without escaping it. RFC 3986 section 3.3 requires the first segment of a `path-noscheme` reference not to contain a colon, precisely because a bare colon makes the string reparse as an absolute URI with a scheme. `fast-uri`'s default serialization escapes that colon, but the suffix path does not. For example, `normalize('javascript:alert(1)', { refere
CVE: CVE-2026-110725
- GHSA-w74x-v6f9-j3xgModeratefast-uri vulnerable to URI scheme spoofing via percent-encoded scheme decoding
< 2.4.8>= 3.0.0, < 3.1.9- +1 more
Affected versions:< 2.4.8>= 3.0.0, < 3.1.9>= 4.0.0, < 4.2.3
### Impact `fast-uri` percent-decodes the scheme component with the legacy global `unescape()` before validating it, so an input whose decoded scheme is a valid but dangerous token is emitted as a live scheme. RFC 3986 section 3.1 does not allow percent-encoding in a scheme, so no RFC or WHATWG parser treats such input as having that scheme, but `fast-uri` does. For example, `normalize('%6Aavascript:alert(1)')` returns `javascript:alert(1)`, `resolve('https://a.example/', '%6Aavascript:alert(1)')` returns `javascript:alert(1)`, and `parse('%6Aavascript:alert(1)').scheme` returns `javascript`
CVE: CVE-2026-110306
- GHSA-wjr9-j795-jxcrModeratefast-uri vulnerable to host confusion via unchecked WHATWG host canonicalization
>= 2.4.2, < 2.4.8>= 3.1.3, < 3.1.9- +1 more
Affected versions:>= 2.4.2, < 2.4.8>= 3.1.3, < 3.1.9>= 4.0.1, < 4.2.3
### 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
CVE: CVE-2026-110180
- GHSA-xhq7-xmqj-769hLowfast-uri vulnerable to improper path equivalence in relative reference normalization
< 2.4.8>= 3.0.0, < 3.1.9- +1 more
Affected versions:< 2.4.8>= 3.0.0, < 3.1.9>= 4.0.0, < 4.2.3
### Impact `fast-uri`'s `normalize()` and `serialize()` apply RFC 3986 dot-segment removal (`remove_dot_segments`) to the path of a relative-path reference. RFC 3986 section 5.2.4 defines that algorithm only for the merged target path during resolution, not for the reference itself, so applied to the reference it drops leading `..` segments and can turn a document-relative reference into a root-relative one. For example, `normalize('a/../b')` returns `/b` and `normalize('../x')` returns `x`, so `resolve(base, normalize(ref))` points at a different resource than `resolve(base, ref)`, and `equ
CVE: CVE-2026-110095
- GHSA-hrr3-gc8f-f4qjModeratefast-uri vulnerable to inconsistent host case normalization via percent-encoded octets
< 2.4.7>= 3.0.0, < 3.1.8- +1 more
Affected versions:< 2.4.7>= 3.0.0, < 3.1.8>= 4.0.0, < 4.1.5
### Impact `fast-uri` folds the host to lowercase before it percent-decodes the host, so a percent-encoded uppercase unreserved octet such as `%41` decodes to a literal `A` that is never folded. For a scheme-relative reference (`//host`) there is no scheme, so the host canonicalization that repairs this on a scheme-bearing URL does not run. As a result `parse`, `normalize`, and `equal` disagree on the same host: `parse("//%41.com").host` returns `"A.com"` while `parse("//a.com").host` and `parse("//A.com").host` return `"a.com"`, and `equal("//%41.com", "//a.com")` is `false` even though `equ
CVE: CVE-2026-86472
- GHSA-jvvf-x445-j334Moderatefast-uri vulnerable to mailto header injection via percent-encoded field-name desynchronization
>= 4.1.3, < 4.1.5
### Impact `fast-uri`'s `mailto` scheme parser compares each query field name to the reserved names (`to`, `subject`, `body`) while the name is still percent-encoded, and only percent-decodes it when storing it as a generic header. On serialize, the decoded name is re-emitted, so a field name such as `%74o` (percent-encoded `to`) is not recognized as a recipient at parse time (`parse().to` shows only the legitimate recipient) but materializes as a literal `to=` field after `serialize()`, and reparsing then treats it as a recipient. The same technique smuggles `subject` and `body` through `%73
CVE: CVE-2026-86818
- GHSA-58mr-gqgx-xq4gHighfast-uri vulnerable to host confusion via an unclosed bracket in the URI authority
>= 2.4.5, < 2.4.6>= 3.1.6, < 3.1.7- +1 more
Affected versions:>= 2.4.5, < 2.4.6>= 3.1.6, < 3.1.7>= 4.1.3, < 4.1.4
### Impact `fast-uri` accepts a host that contains an unbalanced or misplaced authority bracket (`[` or `]`) without reporting an error. A host that starts with `[` but does not end with `]`, such as `[@127.0.0.1`, is neither validated as an IP literal nor canonicalized as a domain name, so `parse()` returns it as the host with `error` undefined, while Node's `URL` (and `http.get`, `axios`, `got`, and other clients built on it) resolve the same string to `127.0.0.1`. An application that reads `parse().host` to make a host decision (an SSRF denylist, a redirect allowlist, or proxy routing) and
CVE: CVE-2026-84394
- GHSA-qw65-cvwx-89v3Highfast-uri vulnerable to authority injection via an unvalidated port in serialize
< 2.4.6>= 3.0.0, < 3.1.7- +1 more
Affected versions:< 2.4.6>= 3.0.0, < 3.1.7>= 4.0.0, < 4.1.4
### Impact `fast-uri` serializes the `port` component of a URI without validating it. When recomposing the authority, `fast-uri` escapes the userinfo and host components but concatenates the port verbatim, so a `port` value that is not a sequence of digits can inject authority delimiters. For example, serializing a component whose `port` is `@127.0.0.1:8124` produces `http://trusted.example:@127.0.0.1:8124/app`, demoting the intended host to userinfo and pointing the authority at an attacker-controlled host. Both `fast-uri` and Node's `URL` read the result back as the attacker's host with no
CVE: CVE-2026-84292
- GHSA-5jgf-p345-68v8Highfast-uri vulnerable to host confusion via skipped IDN canonicalization on scheme-relative references
>= 2.4.2, < 2.4.5>= 3.1.3, < 3.1.6- +1 more
Affected versions:>= 2.4.2, < 2.4.5>= 3.1.3, < 3.1.6>= 4.0.1, < 4.1.3
### Impact `fast-uri` canonicalizes a host to its ASCII form only when the input carries an explicit scheme. When `resolve()` resolves a scheme-relative reference (`//host/`) against a scheme-bearing base, it still emits the host verbatim even though the effective scheme is known, so re-parsing the resolved URI yields a different host than the one `resolve()` returned. An application that resolves an untrusted reference with `fast-uri` and then checks or routes on the resulting host can make a policy decision on one host and reach another. This is an incomplete-fix variant of CVE-2026-13676,
CVE: CVE-2026-75931
- GHSA-f65p-4m7j-42xcHighfast-uri vulnerable to server-side request forgery via malformed IPv6 normalization
>= 2.3.1, < 2.4.5>= 3.0.0, < 3.1.6- +1 more
Affected versions:>= 2.3.1, < 2.4.5>= 3.0.0, < 3.1.6>= 4.0.0, < 4.1.3
### Impact `fast-uri` does not validate the complete RFC 3986 grammar for bracketed IPv6 literals, so a malformed literal with invalid trailing text is silently truncated to a different valid IPv6 address with no error reported. For example, `normalize('http://[::not-valid]/private')` returns `http://[::]/private`, and `[fc00::not-hex]` and `[fe80::not-hex]` collapse to `[fc00::]` and `[fe80::]`. An application that normalizes an untrusted URL before an outbound request, redirect, or host-policy check can be routed to a local or private address such as loopback (`::1`), unique-local, or link-
CVE: CVE-2026-75975