CVE-2026-110306: fast-uri vulnerable to URI scheme spoofing via percent-encoded scheme decoding

Published Oct 20, 2026
·
Updated

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. The %uXXXX form (%u006Aavascript:) produces the same result, and equal('%68ttp://a/', 'http://a/') returns true.

An application that screens dangerous schemes on the raw input and then stores or renders normalize(input) or resolve(base, input) turns an inert string into an executable javascript:, data:, or vbscript: URL, a stored or reflected cross-site scripting vector in the consuming application. equal() also treats an encoded and a plain scheme as the same, which can bypass equality-based allowlists.

Patches

Upgrade to fast-uri 2.4.8, 3.1.9, or 4.2.3.

Workarounds

Reject input whose scheme part (before the first :, and before any /, ?, or #) contains %. Alternatively, check parse(x).scheme against an allowlist after normalization and use that same parsed result rather than the raw string.

Other sources

fast-uri is a dependency-free RFC 3986 URI parser and serializer for Node.js. In versions before 2.4.8, from 3.0.0 through 3.1.8, and from 4.0.0 through 4.2.2, fast-uri percent-decodes the scheme component with the legacy global unescape() function before validating it, so an input whose decoded scheme is a dangerous token is emitted as a live scheme even though RFC 3986 does not allow percent-encoding in a scheme and no other parser accepts it. An application that screens dangerous schemes on the raw input and then stores or renders the normalized or resolved result can turn an inert string into an executable javascript, data, or vbscript URL, producing a stored or reflected cross-site scripting vector, and the equal() comparison treats an encoded and a plain scheme as the same, which can bypass equality-based allowlists. The issue is fixed in fast-uri 2.4.8, 3.1.9, and 4.2.3, and users should upgrade to one of these versions or later. As a workaround, reject input whose scheme part contains a percent sign, or check the parsed scheme against an allowlist after normalization and use that same parsed result rather than the raw string.

— Ubuntu

Affected Software

11 affected componentsFixes available
npm/fast-uri<2.4.8, >=3.0.0<=3.1.8, >=4.0.0<=4.2.2
npm/fast-uri>=4.0.0<4.2.3
4.2.3
npm/fast-uri>=3.0.0<3.1.9
3.1.9
npm/fast-uri<2.4.8
2.4.8
ubuntu/node-ajv*
ubuntu/node-ajv*
ubuntu/node-ajv*
ubuntu/node-ajv*
ubuntu/node-ajv*
ubuntu/node-ajv*
debian/node-ajv<=6.12.6-3, <=8.12.0~ds+~2.1.1-5
8.20.0~ds+~cs7.2.4-1

Remediation

Recommended actions to resolve this vulnerability, in priority order.

  1. Upgrade

    Upgrade npm/fast-uri to a version that resolves this vulnerability.

    Fixed in 4.2.3
  2. Upgrade

    Upgrade npm/fast-uri to a version that resolves this vulnerability.

    Fixed in 3.1.9
  3. Upgrade

    Upgrade npm/fast-uri to a version that resolves this vulnerability.

    Fixed in 2.4.8
  4. Upgrade

    Upgrade debian/node-ajv to a version that resolves this vulnerability.

    Fixed in 8.20.0~ds+~cs7.2.4-1
  5. Upgrade

    Upgrade fast-uri to a version that resolves this vulnerability.

    Fixed in 2.4.8
  6. Upgrade

    Upgrade fast-uri to a version that resolves this vulnerability.

    Fixed in 3.1.9
  7. Upgrade

    Upgrade fast-uri to a version that resolves this vulnerability.

    Fixed in 4.2.3
  8. Configuration

    Reject input whose scheme part contains a percent sign; alternatively, after normalization, check parse(x).scheme against an allowlist and use that same parsed result rather than the raw string.

    Application URI input validation URI scheme validation = Reject schemes containing % before the first :, /, ?, or #

Event History

Oct 20, 2026
CVE Published
via Ubuntu·12:00 AM
Data Sourced
via Ubuntu·12:00 AM
RemedyDescriptionSeverityAffected Software
CVE Published
via MITRE·07:03 AM
Data Sourced
via MITRE·07:03 AM
DescriptionSeverityWeakness
Data Sourced
via OSV·07:17 AM
DescriptionSeverityAffected Software
Data Sourced
via NVD·07:17 AM
DescriptionSeverityWeakness
Oct 23, 2026
Advisory Published
via GitHub·09:41 PM
Data Sourced
via GitHub·09:41 PM
DescriptionSeverityWeaknessAffected Software

Frequently Asked Questions

1

Which applications are realistically exposed to exploitation?

Applications are exposed when they accept attacker-controlled URIs, screen dangerous schemes only in the raw input, and then store or render the normalized or resolved fast-uri output. This can create stored or reflected cross-site scripting through javascript, data, or vbscript URLs; equality-based scheme allowlists may also be bypassed.

2

Does exploitation require authentication or special access?

No authentication or privileges are required, but exploitation requires user interaction. An attacker must supply a URI with a percent-encoded scheme that becomes a dangerous scheme after fast-uri decodes and normalizes it.

3

What can be done if upgrading is not immediately possible?

Reject any input whose scheme portion contains a percent sign. Alternatively, parse and normalize the URI, enforce an allowlist against the parsed scheme after normalization, and use that same parsed result rather than returning to the raw input.

4

How can we determine whether our deployment is affected?

Check the installed fast-uri version. Versions before 2.4.8, versions from 3.0.0 through 3.1.8, and versions from 4.0.0 through 4.2.2 are affected; fixed versions are 2.4.8, 3.1.9, and 4.2.3 or later.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203