CVE-2026-22860
Rack has a Directory Traversal via Rack:Directory
Rack is a modular Ruby web server interface. Prior to versions 2.2.22, 3.1.20, and 3.2.5, Rack::Directory’s path check used a string prefix match on the expanded path. A request like /../root_example/ can escape the configured root if the target path starts with the root string, allowing directory listing outside the intended root. Versions 2.2.22, 3.1.20, and 3.2.5 fix the issue.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- None
- User interaction
- None
What an attacker can affect
- Confidentiality
- High
- Integrity
- None
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
7.5
Rack has a Directory Traversal via Rack:Directory
Rack is a modular Ruby web server interface. Prior to versions 2.2.22, 3.1.20, and 3.2.5, Rack::Directory’s path check used a string prefix match on the expanded path. A request like /../root_example/ can escape the configured root if the target path starts with the root string, allowing directory listing outside the intended root. Versions 2.2.22, 3.1.20, and 3.2.5 fix the issue.
- Record
CVE-2026-22860- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N - Weakness
- CWE-22, CWE-548, CWE-22
- Updated
- 2026-11-02
EUVDEUVD-2026-7914
7.5
Rack is a modular Ruby web server interface. Prior to versions 2.2.22, 3.1.20, and 3.2.5, Rack::Directory’s path check used a string prefix match on the expanded path. A request like /../root_example/ can escape the configured root if the target path starts with the root string, allowing directory listing outside the intended root. Versions 2.2.22, 3.1.20, and 3.2.5 fix the issue.
- Record
EUVD-2026-7914- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-mxw3-3hh2-x2mh
7.5
Rack has a Directory Traversal via Rack:Directory
Summary
Rack::Directory’s path check used a string prefix match on the expanded path. A request like /../root_example/ can escape the configured root if the target path starts with the root string, allowing directory listing outside the intended root.
Details
In directory.rb, File.expand_path(File.join(root, path_info)).start_with?(root) does not enforce a path boundary. If the server root is /var/www/root, a path like /var/www/root_backup passes the check because it shares the same prefix, so Rack::Directory will list that directory also.
Impact
Information disclosure via directory listing outside the configured root when Rack::Directory is exposed to untrusted clients and a directory shares the root prefix (e.g., public2, www_backup).
Mitigation
- Update to a patched version of Rack that correctly checks the root prefix.
- Don't name directories with the same prefix as one which is exposed via
Rack::Directory.
- Record
GHSA-mxw3-3hh2-x2mh- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N - Weakness
- CWE-22, CWE-548
- Updated
- 2026-11-02
NVD
7.5
Rack is a modular Ruby web server interface. Prior to versions 2.2.22, 3.1.20, and 3.2.5, Rack::Directory’s path check used a string prefix match on the expanded path. A request like /../root_example/ can escape the configured root if the target path starts with the root string, allowing directory listing outside the intended root. Versions 2.2.22, 3.1.20, and 3.2.5 fix the issue.
- Record
CVE-2026-22860- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N - Weakness
- CWE-22, CWE-548
- Updated
- 2026-11-02
OSV
7.5
Rack has a Directory Traversal via Rack:Directory
Rack is a modular Ruby web server interface. Prior to versions 2.2.22, 3.1.20, and 3.2.5, Rack::Directory’s path check used a string prefix match on the expanded path. A request like /../root_example/ can escape the configured root if the target path starts with the root string, allowing directory listing outside the intended root. Versions 2.2.22, 3.1.20, and 3.2.5 fix the issue.
- Record
CVE-2026-22860- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N - Weakness
- CWE-22, CWE-548
- Updated
- 2026-11-02
OSVDEBIAN-CVE-2026-22860
7.5
Rack is a modular Ruby web server interface. Prior to versions 2.2.22, 3.1.20, and 3.2.5, Rack::Directory’s path check used a string prefix match on the expanded path. A request like /../root_example/ can escape the configured root if the target path starts with the root string, allowing directory listing outside the intended root. Versions 2.2.22, 3.1.20, and 3.2.5 fix the issue.
- Record
DEBIAN-CVE-2026-22860- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N - Updated
- 2026-11-02
Show 5 moreShow less
OSVGHSA-mxw3-3hh2-x2mh
7.5
Rack has a Directory Traversal via Rack:Directory
Summary
Rack::Directory’s path check used a string prefix match on the expanded path. A request like /../root_example/ can escape the configured root if the target path starts with the root string, allowing directory listing outside the intended root.
Details
In directory.rb, File.expand_path(File.join(root, path_info)).start_with?(root) does not enforce a path boundary. If the server root is /var/www/root, a path like /var/www/root_backup passes the check because it shares the same prefix, so Rack::Directory will list that directory also.
Impact
Information disclosure via directory listing outside the configured root when Rack::Directory is exposed to untrusted clients and a directory shares the root prefix (e.g., public2, www_backup).
Mitigation
- Update to a patched version of Rack that correctly checks the root prefix.
- Don't name directories with the same prefix as one which is exposed via
Rack::Directory.
- Record
GHSA-mxw3-3hh2-x2mh- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N - Weakness
- CWE-22, CWE-548
- Updated
- 2026-11-02
OSVUBUNTU-CVE-2026-22860
7.5
Rack is a modular Ruby web server interface. Prior to versions 2.2.22, 3.1.20, and 3.2.5, Rack::Directory’s path check used a string prefix match on the expanded path. A request like /../root_example/ can escape the configured root if the target path starts with the root string, allowing directory listing outside the intended root. Versions 2.2.22, 3.1.20, and 3.2.5 fix the issue.
- Record
UBUNTU-CVE-2026-22860- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N - Updated
- 2026-11-02
OSVMGASA-2026-0075 No score
Updated ruby-rack packages fix security vulnerabilities
Rack has a Directory Traversal via Rack:Directory. (CVE-2026-22860) Rack's Stored XSS in Rack::Directory via javascript: filenames rendered into anchor href. (CVE-2026-25500)
- Record
MGASA-2026-0075- Updated
- 2026-11-02
OSVopenSUSE-SU-2026:10286-1 No score
ruby4.0-rubygem-rack-2.2-2.2.22-1.1 on GA media
These are all security issues fixed in the ruby4.0-rubygem-rack-2.2-2.2.22-1.1 package on the GA media of openSUSE Tumbleweed.
- Record
openSUSE-SU-2026:10286-1- Updated
- 2026-11-02
OSVUSN-8066-1 No score
ruby-rack vulnerabilities
Minh Pham Quang discovered that Rack did not correctly handle parsing certain paths, which could lead to a path traversal attack. An attacker could possibly use this issue to leak sensitive information. (CVE-2026-22860)
Ali Firas discovered that Rack did not correctly sanitize certain inputs. An attacker could possibly use this issue to execute arbitrary code. (CVE-2026-25500)
- Record
USN-8066-1- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
rackRubyGems |
before 2.2.22 | 2.2.22 |
rackRubyGems |
3.0.0.beta1 up to 3.1.20 | 3.1.20 |
rackRubyGems |
3.2.0 up to 3.2.5 | 3.2.5 |
ruby-rackDebian:12 |
before 2.2.22-0+deb12u1, plus listed versions 2.2.13-1~deb12u12.2.20-0+deb12u12.2.6.4-12.2.6.4-1+deb12u12.2.7-12.2.7-1.1 |
2.2.22-0+deb12u1 |
ruby-rackDebian:13 |
before 3.1.20-0+deb13u1, plus listed versions 3.1.16-0.13.1.18-13.1.18-1~deb13u1 |
3.1.20-0+deb13u1 |
ruby-rackDebian:14 |
before 3.2.5-1, plus listed versions 3.1.16-0.13.1.18-13.1.18-1~deb13u13.2.4-1 |
3.2.5-1 |
ruby-rackDebian:11 From an advisory covering 2 CVEs |
before 2.1.4-3+deb11u5, plus listed versions 2.1.4-32.1.4-3+deb11u12.1.4-3+deb11u22.1.4-3+deb11u32.1.4-3+deb11u4 |
2.1.4-3+deb11u5 |
ruby-rackDebian:12 From an advisory covering 2 CVEs |
before 2.2.22-0+deb12u1, plus listed versions 2.2.13-1~deb12u12.2.20-0+deb12u12.2.6.4-12.2.6.4-1+deb12u12.2.7-12.2.7-1.1 |
2.2.22-0+deb12u1 |
ruby-rackDebian:13 From an advisory covering 2 CVEs |
before 3.1.20-0+deb13u1, plus listed versions 3.1.16-0.13.1.18-13.1.18-1~deb13u1 |
3.1.20-0+deb13u1 |
rackRubyGems |
before 2.2.22, plus listed versions 0.1.00.2.00.3.00.4.00.9.0 Show 45 moreShow less0.9.11.0.01.0.11.1.01.1.11.1.1.pre1.1.21.1.31.1.41.1.51.1.61.2.01.2.11.2.21.2.31.2.41.2.51.2.61.2.71.2.81.3.01.3.0.beta1.3.0.beta21.3.11.3.101.3.21.3.31.3.41.3.51.3.61.3.71.3.81.3.91.4.01.4.11.4.21.4.31.4.41.4.51.4.61.4.71.5.01.5.0.beta.11.5.0.beta.21.5.1 |
2.2.22 |
Show 13 moreShow less
| Package | Affected | Fixed |
|---|---|---|
rackRubyGems |
3.0.0.beta1 up to 3.1.20, plus listed versions 3.0.03.0.0.rc13.0.13.0.103.0.11 Show 39 moreShow less3.0.123.0.133.0.143.0.153.0.163.0.173.0.183.0.23.0.33.0.43.0.4.13.0.4.23.0.53.0.63.0.6.13.0.73.0.83.0.93.0.9.13.1.03.1.13.1.103.1.113.1.123.1.133.1.143.1.153.1.163.1.173.1.183.1.193.1.23.1.33.1.43.1.53.1.63.1.73.1.83.1.9 |
3.1.20 |
rackRubyGems |
3.2.0 up to 3.2.5, plus listed versions 3.2.13.2.23.2.33.2.4 |
3.2.5 |
ruby-rackMageia:9 From an advisory covering 2 CVEs |
before 2.2.22-1.mga9 | 2.2.22-1.mga9 |
ruby-rackUbuntu:Pro:14.04:LTS |
All versions, plus listed versions 1.5.2-11.5.2-1ubuntu0.1~esm11.5.2-3+deb8u3ubuntu1~esm21.5.2-3+deb8u3ubuntu1~esm31.5.2-3+deb8u3ubuntu1~esm4 Show 6 moreShow less1.5.2-3+deb8u3ubuntu1~esm61.5.2-3+deb8u3ubuntu1~esm71.5.2-3+deb8u3ubuntu1~esm81.5.2-3+deb8u3ubuntu1~esm91.5.2-3+deb8u3ubuntu1~esm101.5.2-3+deb8u3ubuntu1~esm11 |
None known |
ruby-rackUbuntu:Pro:16.04:LTS |
All versions, plus listed versions 1.5.2-41.6.4-21.6.4-31.6.4-3ubuntu0.11.6.4-3ubuntu0.2 Show 9 moreShow less1.6.4-3ubuntu0.2+esm11.6.4-3ubuntu0.2+esm21.6.4-3ubuntu0.2+esm41.6.4-3ubuntu0.2+esm51.6.4-3ubuntu0.2+esm61.6.4-3ubuntu0.2+esm71.6.4-3ubuntu0.2+esm81.6.4-3ubuntu0.2+esm91.6.4-3ubuntu0.2+esm10 |
None known |
ruby-rackUbuntu:Pro:18.04:LTS |
All versions, plus listed versions 1.6.4-41.6.4-4ubuntu0.11.6.4-4ubuntu0.21.6.4-4ubuntu0.2+esm11.6.4-4ubuntu0.2+esm2 Show 7 moreShow less1.6.4-4ubuntu0.2+esm41.6.4-4ubuntu0.2+esm51.6.4-4ubuntu0.2+esm61.6.4-4ubuntu0.2+esm71.6.4-4ubuntu0.2+esm81.6.4-4ubuntu0.2+esm91.6.4-4ubuntu0.2+esm10 |
None known |
ruby-rackUbuntu:Pro:20.04:LTS |
before 2.0.7-2ubuntu0.1+esm9, plus listed versions 2.0.6-32.0.7-22.0.7-2ubuntu0.12.0.7-2ubuntu0.1+esm12.0.7-2ubuntu0.1+esm2 Show 6 moreShow less2.0.7-2ubuntu0.1+esm32.0.7-2ubuntu0.1+esm42.0.7-2ubuntu0.1+esm52.0.7-2ubuntu0.1+esm62.0.7-2ubuntu0.1+esm72.0.7-2ubuntu0.1+esm8 |
2.0.7-2ubuntu0.1+esm9 |
ruby-rackUbuntu:Pro:22.04:LTS |
before 2.1.4-5ubuntu1.2+esm2, plus listed versions 2.1.4-32.1.4-42.1.4-52.1.4-5ubuntu12.1.4-5ubuntu1+esm2 Show 8 moreShow less2.1.4-5ubuntu1+esm32.1.4-5ubuntu1+esm42.1.4-5ubuntu1+esm52.1.4-5ubuntu1.12.1.4-5ubuntu1.1+esm12.1.4-5ubuntu1.1+esm22.1.4-5ubuntu1.22.1.4-5ubuntu1.2+esm1 |
2.1.4-5ubuntu1.2+esm2 |
ruby-rackUbuntu:24.04:LTS |
before 2.2.7-1ubuntu0.6, plus listed versions 2.2.4-32.2.7-12.2.7-1ubuntu0.12.2.7-1ubuntu0.22.2.7-1ubuntu0.32.2.7-1ubuntu0.42.2.7-1ubuntu0.5 |
2.2.7-1ubuntu0.6 |
ruby-rackUbuntu:25.10 |
before 3.1.16-0.1ubuntu0.2, plus listed versions 2.2.7-1.13.1.16-0.13.1.16-0.1ubuntu0.1 |
3.1.16-0.1ubuntu0.2 |
ruby-rackUbuntu:26.10 |
before 3.2.4-1ubuntu1 | 3.2.4-1ubuntu1 |
ruby-rackUbuntu:26.04:LTS |
before 3.2.4-1ubuntu1, plus listed versions 3.1.16-0.13.1.18-13.1.18-1build1 |
3.2.4-1ubuntu1 |
rubygem-rack-2.2openSUSE:Tumbleweed From an advisory covering 27 CVEs |
before 2.2.22-1.1 | 2.2.22-1.1 |
History
| Recorded | Changed | Sources |
|---|---|---|
| affected, facts | ||
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-22860 is a high vulnerability (CVSS 7.5) in Rack, published February 17, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.76%, the 55th percentile. Fixed in rack 2.2.22.
References
github.com/rack/rack/security/advisories/GHSA-mxw3-3hh2-x2mh
github.com/rack/rack/commit/75c5745c286637a8f049a33790c71237762069e7
access.redhat.com/security/cve/CVE-2026-22860
bugzilla.redhat.com/show_bug.cgi?id=2440737
security.access.redhat.com/data/csaf/v2/vex/2026/cve-2026-22860.json
nvd.nist.gov/vuln/detail/CVE-2026-22860
Show 39 moreShow less
github.com/rubysec/ruby-advisory-db/blob/master/gems/rack/CVE-2026-22860.yml
github.com/advisories/GHSA-mxw3-3hh2-x2mh
github.com/CVEProject/cvelistV5/tree/main/cves/2026/22xxx/CVE-2026-22860.json
security-tracker.debian.org/tracker/CVE-2026-22860
github.com/rack/rack
advisories.mageia.org/MGASA-2026-0075.html
bugs.mageia.org/show_bug.cgi?id=35285
lists.debian.org/debian-security-announce/2026/msg00089.html
ubuntu.com/security/CVE-2026-22860
cve.org/CVERecord?id=CVE-2026-22860
ubuntu.com/security/notices/USN-8066-1
ubuntu.com/security/CVE-2026-25500
suse.com/security/cve/CVE-2013-0262
suse.com/security/cve/CVE-2013-0263
suse.com/security/cve/CVE-2015-3225
suse.com/security/cve/CVE-2018-16471
suse.com/security/cve/CVE-2019-16782
suse.com/security/cve/CVE-2020-8184
suse.com/security/cve/CVE-2022-30122
suse.com/security/cve/CVE-2022-30123
suse.com/security/cve/CVE-2022-44570
suse.com/security/cve/CVE-2022-44571
suse.com/security/cve/CVE-2022-44572
suse.com/security/cve/CVE-2023-27530
suse.com/security/cve/CVE-2023-27539
suse.com/security/cve/CVE-2024-25126
suse.com/security/cve/CVE-2024-26141
suse.com/security/cve/CVE-2024-26146
suse.com/security/cve/CVE-2025-25184
suse.com/security/cve/CVE-2025-27111
suse.com/security/cve/CVE-2025-27610
suse.com/security/cve/CVE-2025-46727
suse.com/security/cve/CVE-2025-59830
suse.com/security/cve/CVE-2025-61770
suse.com/security/cve/CVE-2025-61771
suse.com/security/cve/CVE-2025-61772
suse.com/security/cve/CVE-2025-61919
suse.com/security/cve/CVE-2026-22860
suse.com/security/cve/CVE-2026-25500
Left out here: 72 versions. The JSON record has them.