Addressable URI normalization resolves some dotted path segments to the wrong path
Published: October 30, 2026
SECURITY IDENTIFIERS
- GHSA: GHSA-8gmh-2hhj-2hv9
- Vendor Advisory: https://github.com/sporkmonger/addressable/security/advisories/GHSA-8gmh-2hhj-2hv9
GEM
SEVERITY
CVSS v3.x: 4.8 (Medium)
UNAFFECTED VERSIONS
< 2.2.5
PATCHED VERSIONS
>= 2.9.1
DESCRIPTION
Addressable::URI.normalize_path resolves some paths containing .. segments to a different path than RFC 3986 does. When a path climbs above the root before any other .. is resolved, the segments that later .. segments should remove are instead kept: /../../public/x/../../secret normalizes to /public/x/secret instead of /secret. URI#normalize, URI#join, URI#== and URI#=== all use this normalization. An application that checks a normalized Addressable path against an allowlist, but sends the original URI to something that resolves it according to RFC 3986, can be made to allow a request for a path outside the allowlist.
