Ruby/rack/1.6.0.beta2


Rack provides a minimal, modular and adaptable interface for developing web applications in Ruby. By wrapping HTTP requests and responses in the simplest way possible, it unifies and distills the API for web servers, web frameworks, and software in between (the so-called middleware) into a single method call.

https://rubygems.org/gems/rack
MIT

59 Security Vulnerabilities

Rack vulnerable to ReDoS in content type parsing (2nd degree polynomial)

Published date: 2024-02-28T22:57:26Z
CVE: CVE-2024-25126
Links:

Summary

module Rack
  class MediaType
    SPLIT_PATTERN = %r{\s*[;,]\s*}

The above regexp is subject to ReDos. 50K blank characters as a prefix to the header will take over 10s to split.

PoC

A simple HTTP request with lots of blank characters in the content-type header:

request["Content-Type"] = (" " * 50_000) + "a,"

Impact

It's a very easy to craft ReDoS. Like all ReDoS the impact is debatable.

Affected versions: ["2.2.8", "2.2.7", "2.2.6.4", "2.2.6.3", "2.2.6.2", "2.2.6.1", "2.2.6", "2.2.5", "2.2.4", "2.2.3.1", "2.2.3", "2.2.2", "2.2.1", "2.2.0", "2.1.4.4", "2.1.4.3", "2.1.4.2", "2.1.4.1", "2.1.4", "2.1.3", "2.1.2", "2.1.1", "2.1.0", "2.0.9.4", "2.0.9.3", "2.0.9.2", "2.0.9.1", "2.0.9", "2.0.8", "2.0.7", "2.0.6", "2.0.5", "2.0.4", "2.0.3", "2.0.2", "2.0.1", "2.0.0.rc1", "2.0.0.alpha", "1.6.13", "1.6.12", "1.6.11", "1.6.10", "1.6.9", "1.6.8", "1.6.7", "1.6.6", "1.6.5", "1.6.4", "1.6.3", "1.6.2", "1.6.1", "1.6.0", "1.6.0.beta2", "1.6.0.beta", "1.5.5", "1.5.4", "1.5.3", "1.5.2", "1.5.1", "1.5.0", "1.5.0.beta.2", "1.5.0.beta.1", "1.4.7", "1.4.6", "1.4.5", "1.4.4", "1.4.3", "1.4.2", "1.4.1", "1.4.0", "1.3.10", "1.3.9", "1.3.8", "1.3.7", "1.3.6", "1.3.5", "1.3.4", "1.3.3", "1.3.2", "1.3.1", "1.3.0", "1.3.0.beta2", "1.3.0.beta", "1.2.8", "1.2.7", "1.2.6", "1.2.5", "1.2.4", "1.2.3", "1.2.2", "1.2.1", "1.2.0", "1.1.6", "1.1.5", "1.1.4", "1.1.3", "1.1.2", "1.1.1", "1.1.1.pre", "1.1.0", "1.0.1", "1.0.0", "0.9.1", "0.9.0", "0.4.0", "3.0.9", "3.0.8", "3.0.7", "3.0.6.1", "3.0.6", "3.0.5", "3.0.4.2", "3.0.4.1", "3.0.4", "3.0.3", "3.0.2", "3.0.1", "3.0.0"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Rack has possible DoS Vulnerability in Multipart MIME parsing

Published date: 2023-03-08T17:20:04Z
CVE: CVE-2023-27530
Links:

There is a possible DoS vulnerability in the Multipart MIME parsing code in Rack. This vulnerability has been assigned the CVE identifier CVE-2023-27530.

Versions Affected: All. Not affected: None Fixed Versions: 3.0.4.2, 2.2.6.3, 2.1.4.3, 2.0.9.3

Impact

The Multipart MIME parsing code in Rack limits the number of file parts, but does not limit the total number of parts that can be uploaded. Carefully crafted requests can abuse this and cause multipart parsing to take longer than expected.

All users running an affected release should either upgrade or use one of the workarounds immediately.

Workarounds

A proxy can be configured to limit the POST body size which will mitigate this issue.

Affected versions: ["3.0.4.1", "3.0.4", "3.0.3", "3.0.2", "3.0.1", "3.0.0", "2.2.6.2", "2.2.6.1", "2.2.6", "2.2.5", "2.2.4", "2.2.3.1", "2.2.3", "2.2.2", "2.2.1", "2.2.0", "2.1.4.2", "2.1.4.1", "2.1.4", "2.1.3", "2.1.2", "2.1.1", "2.1.0", "2.0.9.2", "2.0.9.1", "2.0.9", "2.0.8", "2.0.7", "2.0.6", "2.0.5", "2.0.4", "2.0.3", "2.0.2", "2.0.1", "2.0.0.rc1", "2.0.0.alpha", "1.6.13", "1.6.12", "1.6.11", "1.6.10", "1.6.9", "1.6.8", "1.6.7", "1.6.6", "1.6.5", "1.6.4", "1.6.3", "1.6.2", "1.6.1", "1.6.0", "1.6.0.beta2", "1.6.0.beta", "1.5.5", "1.5.4", "1.5.3", "1.5.2", "1.5.1", "1.5.0", "1.5.0.beta.2", "1.5.0.beta.1", "1.4.7", "1.4.6", "1.4.5", "1.4.4", "1.4.3", "1.4.2", "1.4.1", "1.4.0", "1.3.10", "1.3.9", "1.3.8", "1.3.7", "1.3.6", "1.3.5", "1.3.4", "1.3.3", "1.3.2", "1.3.1", "1.3.0", "1.3.0.beta2", "1.3.0.beta", "1.2.8", "1.2.7", "1.2.6", "1.2.5", "1.2.4", "1.2.3", "1.2.2", "1.2.1", "1.2.0", "1.1.6", "1.1.5", "1.1.4", "1.1.3", "1.1.2", "1.1.1", "1.1.1.pre", "1.1.0", "1.0.1", "1.0.0", "0.9.1", "0.9.0", "0.4.0", "0.3.0", "0.2.0", "0.1.0"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Rack Header Parsing leads to Possible Denial of Service Vulnerability

Published date: 2024-02-28T22:57:03Z
CVE: CVE-2024-26146
Links:

Possible Denial of Service Vulnerability in Rack Header Parsing

There is a possible denial of service vulnerability in the header parsing routines in Rack. This vulnerability has been assigned the CVE identifier CVE-2024-26146.

Versions Affected: All. Not affected: None Fixed Versions: 2.0.9.4, 2.1.4.4, 2.2.8.1, 3.0.9.1

Impact

Carefully crafted headers can cause header parsing in Rack to take longer than expected resulting in a possible denial of service issue. Accept and Forwarded headers are impacted.

Ruby 3.2 has mitigations for this problem, so Rack applications using Ruby 3.2 or newer are unaffected.

Releases

The fixed releases are available at the normal locations.

Workarounds

There are no feasible workarounds for this issue.

Patches

To aid users who aren't able to upgrade immediately we have provided patches for the two supported release series. They are in git-am format and consist of a single changeset.

  • 2-0-header-redos.patch - Patch for 2.0 series
  • 2-1-header-redos.patch - Patch for 2.1 series
  • 2-2-header-redos.patch - Patch for 2.2 series
  • 3-0-header-redos.patch - Patch for 3.0 series

Credits

Thanks to svalkanov for reporting this and providing patches!

Affected versions: ["2.0.9.3", "2.0.9.2", "2.0.9.1", "2.0.9", "2.0.8", "2.0.7", "2.0.6", "2.0.5", "2.0.4", "2.0.3", "2.0.2", "2.0.1", "2.0.0.rc1", "2.0.0.alpha", "1.6.13", "1.6.12", "1.6.11", "1.6.10", "1.6.9", "1.6.8", "1.6.7", "1.6.6", "1.6.5", "1.6.4", "1.6.3", "1.6.2", "1.6.1", "1.6.0", "1.6.0.beta2", "1.6.0.beta", "1.5.5", "1.5.4", "1.5.3", "1.5.2", "1.5.1", "1.5.0", "1.5.0.beta.2", "1.5.0.beta.1", "1.4.7", "1.4.6", "1.4.5", "1.4.4", "1.4.3", "1.4.2", "1.4.1", "1.4.0", "1.3.10", "1.3.9", "1.3.8", "1.3.7", "1.3.6", "1.3.5", "1.3.4", "1.3.3", "1.3.2", "1.3.1", "1.3.0", "1.3.0.beta2", "1.3.0.beta", "1.2.8", "1.2.7", "1.2.6", "1.2.5", "1.2.4", "1.2.3", "1.2.2", "1.2.1", "1.2.0", "1.1.6", "1.1.5", "1.1.4", "1.1.3", "1.1.2", "1.1.1", "1.1.1.pre", "1.1.0", "1.0.1", "1.0.0", "0.9.1", "0.9.0", "0.4.0", "0.3.0", "0.2.0", "0.1.0", "2.1.4.3", "2.1.4.2", "2.1.4.1", "2.1.4", "2.1.3", "2.1.2", "2.1.1", "2.1.0", "2.2.8", "2.2.7", "2.2.6.4", "2.2.6.3", "2.2.6.2", "2.2.6.1", "2.2.6", "2.2.5", "2.2.4", "2.2.3.1", "2.2.3", "2.2.2", "2.2.1", "2.2.0", "3.0.9", "3.0.8", "3.0.7", "3.0.6.1", "3.0.6", "3.0.5", "3.0.4.2", "3.0.4.1", "3.0.4", "3.0.3", "3.0.2", "3.0.1", "3.0.0"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Directory traversal in Rack::Directory app bundled with Rack

Published date: 2020-07-06T21:31:02Z
CVE: CVE-2020-8161
Links:

A directory traversal vulnerability exists in rack < 2.2.0 that allows an attacker perform directory traversal vulnerability in the Rack::Directory app that is bundled with Rack which could result in information disclosure.

Affected versions: ["2.1.2", "2.1.1", "2.1.0", "2.0.9.4", "2.0.9.3", "2.0.9.2", "2.0.9.1", "2.0.9", "2.0.8", "2.0.7", "2.0.6", "2.0.5", "2.0.4", "2.0.3", "2.0.2", "2.0.1", "2.0.0.rc1", "2.0.0.alpha", "1.6.13", "1.6.12", "1.6.11", "1.6.10", "1.6.9", "1.6.8", "1.6.7", "1.6.6", "1.6.5", "1.6.4", "1.6.3", "1.6.2", "1.6.1", "1.6.0", "1.6.0.beta2", "1.6.0.beta", "1.5.5", "1.5.4", "1.5.3", "1.5.2", "1.5.1", "1.5.0", "1.5.0.beta.2", "1.5.0.beta.1", "1.4.7", "1.4.6", "1.4.5", "1.4.4", "1.4.3", "1.4.2", "1.4.1", "1.4.0", "1.3.10", "1.3.9", "1.3.8", "1.3.7", "1.3.6", "1.3.5", "1.3.4", "1.3.3", "1.3.2", "1.3.1", "1.3.0", "1.3.0.beta2", "1.3.0.beta", "1.2.8", "1.2.7", "1.2.6", "1.2.5", "1.2.4", "1.2.3", "1.2.2", "1.2.1", "1.2.0", "1.1.6", "1.1.5", "1.1.4", "1.1.3", "1.1.2", "1.1.1", "1.1.1.pre", "1.1.0", "1.0.1", "1.0.0", "0.9.1", "0.9.0", "0.4.0", "0.3.0", "0.2.0", "0.1.0"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Rack vulnerable to Cross-site Scripting

Published date: 2018-11-15T15:59:08Z
CVE: CVE-2018-16471
Links:

There is a possible XSS vulnerability in Rack before 2.0.6 and 1.6.11. Carefully crafted requests can impact the data returned by the scheme method on Rack::Request. Applications that expect the scheme to be limited to 'http' or 'https' and do not escape the return value could be vulnerable to an XSS attack. Note that applications using the normal escaping mechanisms provided by Rails may not impacted, but applications that bypass the escaping mechanisms, or do not use them may be vulnerable.

Affected versions: ["1.6.10", "1.6.9", "1.6.8", "1.6.7", "1.6.6", "1.6.5", "1.6.4", "1.6.3", "1.6.2", "1.6.1", "1.6.0", "1.6.0.beta2", "1.6.0.beta", "1.5.5", "1.5.4", "1.5.3", "1.5.2", "1.5.1", "1.5.0", "1.5.0.beta.2", "1.5.0.beta.1", "1.4.7", "1.4.6", "1.4.5", "1.4.4", "1.4.3", "1.4.2", "1.4.1", "1.4.0", "1.3.10", "1.3.9", "1.3.8", "1.3.7", "1.3.6", "1.3.5", "1.3.4", "1.3.3", "1.3.2", "1.3.1", "1.3.0", "1.3.0.beta2", "1.3.0.beta", "1.2.8", "1.2.7", "1.2.6", "1.2.5", "1.2.4", "1.2.3", "1.2.2", "1.2.1", "1.2.0", "1.1.6", "1.1.5", "1.1.4", "1.1.3", "1.1.2", "1.1.1", "1.1.1.pre", "1.1.0", "1.0.1", "1.0.0", "0.9.1", "0.9.0", "0.4.0", "0.3.0", "0.2.0", "0.1.0", "2.0.5", "2.0.4", "2.0.3", "2.0.2", "2.0.1"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Rack has an unsafe default in Rack::QueryParser allows params_limit bypass via semicolon-separated parameters

Published date: 2025-09-25T16:39:27Z
CVE: CVE-2025-59830
Links:

Summary

Rack::QueryParser in version < 2.2.18 enforces its params_limit only for parameters separated by &, while still splitting on both & and ;. As a result, attackers could use ; separators to bypass the parameter count limit and submit more parameters than intended.

Details

The issue arises because Rack::QueryParser#check_query_string counts only & characters when determining the number of parameters, but the default separator regex DEFAULT_SEP = /[&;] */n splits on both & and ;. This mismatch means that queries using ; separators were not included in the parameter count, allowing params_limit to be bypassed.

Other safeguards (bytesize_limit and key_space_limit) still applied, but did not prevent this particular bypass.

Impact

Applications or middleware that directly invoke Rack::QueryParser with its default configuration (no explicit delimiter) could be exposed to increased CPU and memory consumption. This can be abused as a limited denial-of-service vector.

Rack::Request, the primary entry point for typical Rack applications, uses QueryParser in a safe way and does not appear vulnerable by default. As such, the severity is considered low, with the impact limited to edge cases where QueryParser is used directly.

Mitigation

  • Upgrade to a patched version of Rack where both & and ; are counted consistently toward params_limit.
  • If upgrading is not immediately possible, configure QueryParser with an explicit delimiter (e.g., &) to avoid the mismatch.
  • As a general precaution, enforce query string and request size limits at the web server or proxy layer (e.g., Nginx, Apache, or a CDN) to mitigate excessive parsing overhead.

Affected versions: ["2.2.17", "2.2.16", "2.2.15", "2.2.14", "2.2.13", "2.2.12", "2.2.11", "2.2.10", "2.2.9", "2.2.8.1", "2.2.8", "2.2.7", "2.2.6.4", "2.2.6.3", "2.2.6.2", "2.2.6.1", "2.2.6", "2.2.5", "2.2.4", "2.2.3.1", "2.2.3", "2.2.2", "2.2.1", "2.2.0", "2.1.4.4", "2.1.4.3", "2.1.4.2", "2.1.4.1", "2.1.4", "2.1.3", "2.1.2", "2.1.1", "2.1.0", "2.0.9.4", "2.0.9.3", "2.0.9.2", "2.0.9.1", "2.0.9", "2.0.8", "2.0.7", "2.0.6", "2.0.5", "2.0.4", "2.0.3", "2.0.2", "2.0.1", "2.0.0.rc1", "2.0.0.alpha", "1.6.13", "1.6.12", "1.6.11", "1.6.10", "1.6.9", "1.6.8", "1.6.7", "1.6.6", "1.6.5", "1.6.4", "1.6.3", "1.6.2", "1.6.1", "1.6.0", "1.6.0.beta2", "1.6.0.beta", "1.5.5", "1.5.4", "1.5.3", "1.5.2", "1.5.1", "1.5.0", "1.5.0.beta.2", "1.5.0.beta.1", "1.4.7", "1.4.6", "1.4.5", "1.4.4", "1.4.3", "1.4.2", "1.4.1", "1.4.0", "1.3.10", "1.3.9", "1.3.8", "1.3.7", "1.3.6", "1.3.5", "1.3.4", "1.3.3", "1.3.2", "1.3.1", "1.3.0", "1.3.0.beta2", "1.3.0.beta", "1.2.8", "1.2.7", "1.2.6", "1.2.5", "1.2.4", "1.2.3", "1.2.2", "1.2.1", "1.2.0", "1.1.6", "1.1.5", "1.1.4", "1.1.3", "1.1.2", "1.1.1", "1.1.1.pre", "1.1.0", "1.0.1", "1.0.0", "0.9.1", "0.9.0", "0.4.0", "0.3.0", "0.2.0", "0.1.0"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Denial of service via header parsing in Rack

Published date: 2023-01-18T18:19:33Z
CVE: CVE-2022-44570
Links:

There is a possible denial of service vulnerability in the Range header parsing component of Rack. This vulnerability has been assigned the CVE identifier CVE-2022-44570.

Versions Affected: >= 1.5.0 Not affected: None. Fixed Versions: 2.0.9.2, 2.1.4.2, 2.2.6.2, 3.0.0.1 Impact

Carefully crafted input can cause the Range header parsing component in Rack to take an unexpected amount of time, possibly resulting in a denial of service attack vector. Any applications that deal with Range requests (such as streaming applications, or applications that serve files) may be impacted. Releases

The fixed releases are available at the normal locations. Workarounds

There are no feasible workarounds for this issue. Patches

To aid users who aren’t able to upgrade immediately we have provided patches for the two supported release series. They are in git-am format and consist of a single changeset.

2-0-Fix-ReDoS-in-Rack-Utils.get_byte_ranges.patch - Patch for 2.0 series
2-1-Fix-ReDoS-in-Rack-Utils.get_byte_ranges.patch - Patch for 2.1 series
2-2-Fix-ReDoS-in-Rack-Utils.get_byte_ranges.patch - Patch for 2.2 series
3-0-Fix-ReDoS-in-Rack-Utils.get_byte_ranges.patch - Patch for 3.0 series

Affected versions: ["3.0.4", "3.0.3", "3.0.2", "3.0.1", "3.0.0", "2.2.6.1", "2.2.6", "2.2.5", "2.2.4", "2.2.3.1", "2.2.3", "2.2.2", "2.2.1", "2.2.0", "2.1.4.1", "2.1.4", "2.1.3", "2.1.2", "2.1.1", "2.1.0", "2.0.9.1", "2.0.9", "2.0.8", "2.0.7", "2.0.6", "2.0.5", "2.0.4", "2.0.3", "2.0.2", "2.0.1", "2.0.0.rc1", "2.0.0.alpha", "1.6.13", "1.6.12", "1.6.11", "1.6.10", "1.6.9", "1.6.8", "1.6.7", "1.6.6", "1.6.5", "1.6.4", "1.6.3", "1.6.2", "1.6.1", "1.6.0", "1.6.0.beta2", "1.6.0.beta", "1.5.5", "1.5.4", "1.5.3", "1.5.2", "1.5.1", "1.5.0"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Rack is vulnerable to a memory-exhaustion DoS through unbounded URL-encoded body parsing

Published date: 2025-10-10T17:33:35Z
CVE: CVE-2025-61919
Links:

Summary

Rack::Request#POST reads the entire request body into memory for Content-Type: application/x-www-form-urlencoded, calling rack.input.read(nil) without enforcing a length or cap. Large request bodies can therefore be buffered completely into process memory before parsing, leading to denial of service (DoS) through memory exhaustion.

Details

When handling non-multipart form submissions, Rack’s request parser performs:

form_vars = get_header(RACK_INPUT).read

Since read is called with no argument, the entire request body is loaded into a Ruby String. This occurs before query parameter parsing or enforcement of any params_limit. As a result, Rack applications without an upstream body-size limit can experience unbounded memory allocation proportional to request size.

Impact

Attackers can send large application/x-www-form-urlencoded bodies to consume process memory, causing slowdowns or termination by the operating system (OOM). The effect scales linearly with request size and concurrency. Even with parsing limits configured, the issue occurs before those limits are enforced.

Mitigation

  • Update to a patched version of Rack that enforces form parameter limits using query_parser.bytesize_limit, preventing unbounded reads of application/x-www-form-urlencoded bodies.
  • Enforce strict maximum body size at the proxy or web server layer (e.g., Nginx client_max_body_size, Apache LimitRequestBody).

Affected versions: ["3.2.2", "3.2.1", "3.2.0", "3.1.17", "3.1.16", "3.1.15", "3.1.14", "3.1.13", "3.1.12", "3.1.11", "3.1.10", "3.1.9", "3.1.8", "3.1.7", "3.1.6", "3.1.5", "3.1.4", "3.1.3", "3.1.2", "3.1.1", "3.1.0", "3.0.18", "3.0.17", "3.0.16", "3.0.15", "3.0.14", "3.0.13", "3.0.12", "3.0.11", "3.0.10", "3.0.9.1", "3.0.9", "3.0.8", "3.0.7", "3.0.6.1", "3.0.6", "3.0.5", "3.0.4.2", "3.0.4.1", "3.0.4", "3.0.3", "3.0.2", "3.0.1", "3.0.0", "2.2.19", "2.2.18", "2.2.17", "2.2.16", "2.2.15", "2.2.14", "2.2.13", "2.2.12", "2.2.11", "2.2.10", "2.2.9", "2.2.8.1", "2.2.8", "2.2.7", "2.2.6.4", "2.2.6.3", "2.2.6.2", "2.2.6.1", "2.2.6", "2.2.5", "2.2.4", "2.2.3.1", "2.2.3", "2.2.2", "2.2.1", "2.2.0", "2.1.4.4", "2.1.4.3", "2.1.4.2", "2.1.4.1", "2.1.4", "2.1.3", "2.1.2", "2.1.1", "2.1.0", "2.0.9.4", "2.0.9.3", "2.0.9.2", "2.0.9.1", "2.0.9", "2.0.8", "2.0.7", "2.0.6", "2.0.5", "2.0.4", "2.0.3", "2.0.2", "2.0.1", "2.0.0.rc1", "2.0.0.alpha", "1.6.13", "1.6.12", "1.6.11", "1.6.10", "1.6.9", "1.6.8", "1.6.7", "1.6.6", "1.6.5", "1.6.4", "1.6.3", "1.6.2", "1.6.1", "1.6.0", "1.6.0.beta2", "1.6.0.beta", "1.5.5", "1.5.4", "1.5.3", "1.5.2", "1.5.1", "1.5.0", "1.5.0.beta.2", "1.5.0.beta.1", "1.4.7", "1.4.6", "1.4.5", "1.4.4", "1.4.3", "1.4.2", "1.4.1", "1.4.0", "1.3.10", "1.3.9", "1.3.8", "1.3.7", "1.3.6", "1.3.5", "1.3.4", "1.3.3", "1.3.2", "1.3.1", "1.3.0", "1.3.0.beta2", "1.3.0.beta", "1.2.8", "1.2.7", "1.2.6", "1.2.5", "1.2.4", "1.2.3", "1.2.2", "1.2.1", "1.2.0", "1.1.6", "1.1.5", "1.1.4", "1.1.3", "1.1.2", "1.1.1", "1.1.1.pre", "1.1.0", "1.0.1", "1.0.0", "0.9.1", "0.9.0", "0.4.0", "0.3.0", "0.2.0", "0.1.0"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Possible Log Injection in Rack::CommonLogger

Published date: 2025-02-12T19:18:35Z
CVE: CVE-2025-25184
Links:

Summary

Rack::CommonLogger can be exploited by crafting input that includes newline characters to manipulate log entries. The supplied proof-of-concept demonstrates injecting malicious content into logs.

Details

When a user provides the authorization credentials via Rack::Auth::Basic, if success, the username will be put in env['REMOTE_USER'] and later be used by Rack::CommonLogger for logging purposes.

The issue occurs when a server intentionally or unintentionally allows a user creation with the username contain CRLF and white space characters, or the server just want to log every login attempts. If an attacker enters a username with CRLF character, the logger will log the malicious username with CRLF characters into the logfile.

Impact

Attackers can break log formats or insert fraudulent entries, potentially obscuring real activity or injecting malicious data into log files.

Mitigation

  • Update to the latest version of Rack.

Affected versions: ["3.1.9", "3.1.8", "3.1.7", "3.1.6", "3.1.5", "3.1.4", "3.1.3", "3.1.2", "3.1.1", "3.1.0", "3.0.11", "3.0.10", "3.0.9.1", "3.0.9", "3.0.8", "3.0.7", "3.0.6.1", "3.0.6", "3.0.5", "3.0.4.2", "3.0.4.1", "3.0.4", "3.0.3", "3.0.2", "3.0.1", "3.0.0", "2.2.10", "2.2.9", "2.2.8.1", "2.2.8", "2.2.7", "2.2.6.4", "2.2.6.3", "2.2.6.2", "2.2.6.1", "2.2.6", "2.2.5", "2.2.4", "2.2.3.1", "2.2.3", "2.2.2", "2.2.1", "2.2.0", "2.1.4.4", "2.1.4.3", "2.1.4.2", "2.1.4.1", "2.1.4", "2.1.3", "2.1.2", "2.1.1", "2.1.0", "2.0.9.4", "2.0.9.3", "2.0.9.2", "2.0.9.1", "2.0.9", "2.0.8", "2.0.7", "2.0.6", "2.0.5", "2.0.4", "2.0.3", "2.0.2", "2.0.1", "2.0.0.rc1", "2.0.0.alpha", "1.6.13", "1.6.12", "1.6.11", "1.6.10", "1.6.9", "1.6.8", "1.6.7", "1.6.6", "1.6.5", "1.6.4", "1.6.3", "1.6.2", "1.6.1", "1.6.0", "1.6.0.beta2", "1.6.0.beta", "1.5.5", "1.5.4", "1.5.3", "1.5.2", "1.5.1", "1.5.0", "1.5.0.beta.2", "1.5.0.beta.1", "1.4.7", "1.4.6", "1.4.5", "1.4.4", "1.4.3", "1.4.2", "1.4.1", "1.4.0", "1.3.10", "1.3.9", "1.3.8", "1.3.7", "1.3.6", "1.3.5", "1.3.4", "1.3.3", "1.3.2", "1.3.1", "1.3.0", "1.3.0.beta2", "1.3.0.beta", "1.2.8", "1.2.7", "1.2.6", "1.2.5", "1.2.4", "1.2.3", "1.2.2", "1.2.1", "1.2.0", "1.1.6", "1.1.5", "1.1.4", "1.1.3", "1.1.2", "1.1.1", "1.1.1.pre", "1.1.0", "1.0.1", "1.0.0", "0.9.1", "0.9.0", "0.4.0", "0.3.0", "0.2.0", "0.1.0"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Rack has a root directory disclosure via unescaped regex interpolation in Rack::Directory

Published date: 2026-04-02T20:32:42Z
CVE: CVE-2026-34763
Links:

Summary

Rack::Directory interpolates the configured root path directly into a regular expression when deriving the displayed directory path. If root contains regex metacharacters such as +, *, or ., the prefix stripping can fail and the generated directory listing may expose the full filesystem path in the HTML output.

Details

Rack::Directory::DirectoryBody#each computes the visible path using code equivalent to:

show_path = Utils.escape_html(path.sub(/\A#{root}/, ''))

Here, root is a developer-configured filesystem path. It is normalized earlier with File.expand_path(root) and then inserted directly into a regular expression without escaping.

Because the value is treated as regex syntax rather than as a literal string, metacharacters in the configured path can change how the prefix match behaves. When that happens, the expected root prefix is not removed from path, and the absolute filesystem path is rendered into the HTML directory listing.

Impact

If Rack::Directory is configured to serve a directory whose absolute path contains regex metacharacters, the generated directory listing may disclose the full server filesystem path instead of only the request-relative path.

This can expose internal deployment details such as directory layout, usernames, mount points, or naming conventions that would otherwise not be visible to clients.

Mitigation

  • Update to a patched version of Rack in which the root prefix is removed using an escaped regular expression.
  • Avoid using Rack::Directory with a root path that contains regular expression metacharacters.

Affected versions: ["3.2.5", "3.2.4", "3.2.3", "3.2.2", "3.2.1", "3.2.0", "3.1.20", "3.1.19", "3.1.18", "3.1.17", "3.1.16", "3.1.15", "3.1.14", "3.1.13", "3.1.12", "3.1.11", "3.1.10", "3.1.9", "3.1.8", "3.1.7", "3.1.6", "3.1.5", "3.1.4", "3.1.3", "3.1.2", "3.1.1", "3.1.0", "3.0.18", "3.0.17", "3.0.16", "3.0.15", "3.0.14", "3.0.13", "3.0.12", "3.0.11", "3.0.10", "3.0.9.1", "3.0.9", "3.0.8", "3.0.7", "3.0.6.1", "3.0.6", "3.0.5", "3.0.4.2", "3.0.4.1", "3.0.4", "3.0.3", "3.0.2", "3.0.1", "3.0.0", "3.0.0.rc1", "3.0.0.beta1", "2.2.22", "2.2.21", "2.2.20", "2.2.19", "2.2.18", "2.2.17", "2.2.16", "2.2.15", "2.2.14", "2.2.13", "2.2.12", "2.2.11", "2.2.10", "2.2.9", "2.2.8.1", "2.2.8", "2.2.7", "2.2.6.4", "2.2.6.3", "2.2.6.2", "2.2.6.1", "2.2.6", "2.2.5", "2.2.4", "2.2.3.1", "2.2.3", "2.2.2", "2.2.1", "2.2.0", "2.1.4.4", "2.1.4.3", "2.1.4.2", "2.1.4.1", "2.1.4", "2.1.3", "2.1.2", "2.1.1", "2.1.0", "2.0.9.4", "2.0.9.3", "2.0.9.2", "2.0.9.1", "2.0.9", "2.0.8", "2.0.7", "2.0.6", "2.0.5", "2.0.4", "2.0.3", "2.0.2", "2.0.1", "2.0.0.rc1", "2.0.0.alpha", "1.6.13", "1.6.12", "1.6.11", "1.6.10", "1.6.9", "1.6.8", "1.6.7", "1.6.6", "1.6.5", "1.6.4", "1.6.3", "1.6.2", "1.6.1", "1.6.0", "1.6.0.beta2", "1.6.0.beta", "1.5.5", "1.5.4", "1.5.3", "1.5.2", "1.5.1", "1.5.0", "1.5.0.beta.2", "1.5.0.beta.1", "1.4.7", "1.4.6", "1.4.5", "1.4.4", "1.4.3", "1.4.2", "1.4.1", "1.4.0", "1.3.10", "1.3.9", "1.3.8", "1.3.7", "1.3.6", "1.3.5", "1.3.4", "1.3.3", "1.3.2", "1.3.1", "1.3.0", "1.3.0.beta2", "1.3.0.beta", "1.2.8", "1.2.7", "1.2.6", "1.2.5", "1.2.4", "1.2.3", "1.2.2", "1.2.1", "1.2.0", "1.1.6", "1.1.5", "1.1.4", "1.1.3", "1.1.2", "1.1.1", "1.1.1.pre", "1.1.0", "1.0.1", "1.0.0", "0.9.1", "0.9.0", "0.4.0", "0.3.0", "0.2.0", "0.1.0"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Local File Inclusion in Rack::Static

Published date: 2025-03-10T22:19:30Z
CVE: CVE-2025-27610
Links:

Summary

Rack::Static can serve files under the specified root: even if urls: are provided, which may expose other files under the specified root: unexpectedly.

Details

The vulnerability occurs because Rack::Static does not properly sanitize user-supplied paths before serving files. Specifically, encoded path traversal sequences are not correctly validated, allowing attackers to access files outside the designated static file directory.

Impact

By exploiting this vulnerability, an attacker can gain access to all files under the specified root: directory, provided they are able to determine then path of the file.

Mitigation

  • Update to the latest version of Rack, or
  • Remove usage of Rack::Static, or
  • Ensure that root: points at a directory path which only contains files which should be accessed publicly.

It is likely that a CDN or similar static file server would also mitigate the issue.

Affected versions: ["3.1.11", "3.1.10", "3.1.9", "3.1.8", "3.1.7", "3.1.6", "3.1.5", "3.1.4", "3.1.3", "3.1.2", "3.1.1", "3.1.0", "3.0.13", "3.0.12", "3.0.11", "3.0.10", "3.0.9.1", "3.0.9", "3.0.8", "3.0.7", "3.0.6.1", "3.0.6", "3.0.5", "3.0.4.2", "3.0.4.1", "3.0.4", "3.0.3", "3.0.2", "3.0.1", "3.0.0", "2.2.12", "2.2.11", "2.2.10", "2.2.9", "2.2.8.1", "2.2.8", "2.2.7", "2.2.6.4", "2.2.6.3", "2.2.6.2", "2.2.6.1", "2.2.6", "2.2.5", "2.2.4", "2.2.3.1", "2.2.3", "2.2.2", "2.2.1", "2.2.0", "2.1.4.4", "2.1.4.3", "2.1.4.2", "2.1.4.1", "2.1.4", "2.1.3", "2.1.2", "2.1.1", "2.1.0", "2.0.9.4", "2.0.9.3", "2.0.9.2", "2.0.9.1", "2.0.9", "2.0.8", "2.0.7", "2.0.6", "2.0.5", "2.0.4", "2.0.3", "2.0.2", "2.0.1", "2.0.0.rc1", "2.0.0.alpha", "1.6.13", "1.6.12", "1.6.11", "1.6.10", "1.6.9", "1.6.8", "1.6.7", "1.6.6", "1.6.5", "1.6.4", "1.6.3", "1.6.2", "1.6.1", "1.6.0", "1.6.0.beta2", "1.6.0.beta", "1.5.5", "1.5.4", "1.5.3", "1.5.2", "1.5.1", "1.5.0", "1.5.0.beta.2", "1.5.0.beta.1", "1.4.7", "1.4.6", "1.4.5", "1.4.4", "1.4.3", "1.4.2", "1.4.1", "1.4.0", "1.3.10", "1.3.9", "1.3.8", "1.3.7", "1.3.6", "1.3.5", "1.3.4", "1.3.3", "1.3.2", "1.3.1", "1.3.0", "1.3.0.beta2", "1.3.0.beta", "1.2.8", "1.2.7", "1.2.6", "1.2.5", "1.2.4", "1.2.3", "1.2.2", "1.2.1", "1.2.0", "1.1.6", "1.1.5", "1.1.4", "1.1.3", "1.1.2", "1.1.1", "1.1.1.pre", "1.1.0", "1.0.1", "1.0.0", "0.9.1", "0.9.0", "0.4.0", "0.3.0", "0.2.0", "0.1.0"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Escape Sequence Injection vulnerability in Rack lead to Possible Log Injection

Published date: 2025-03-04T15:27:06Z
CVE: CVE-2025-27111
Links:

Summary

Rack::Sendfile can be exploited by crafting input that includes newline characters to manipulate log entries.

Details

The Rack::Sendfile middleware logs unsanitized header values from the X-Sendfile-Type header. An attacker can exploit this by injecting escape sequences (such as newline characters) into the header, resulting in log injection.

Impact

This vulnerability can distort log files, obscure attack traces, and complicate security auditing.

Mitigation

  • Update to the latest version of Rack, or
  • Remove usage of Rack::Sendfile.

Affected versions: ["3.1.10", "3.1.9", "3.1.8", "3.1.7", "3.1.6", "3.1.5", "3.1.4", "3.1.3", "3.1.2", "3.1.1", "3.1.0", "3.0.12", "3.0.11", "3.0.10", "3.0.9.1", "3.0.9", "3.0.8", "3.0.7", "3.0.6.1", "3.0.6", "3.0.5", "3.0.4.2", "3.0.4.1", "3.0.4", "3.0.3", "3.0.2", "3.0.1", "3.0.0", "2.2.11", "2.2.10", "2.2.9", "2.2.8.1", "2.2.8", "2.2.7", "2.2.6.4", "2.2.6.3", "2.2.6.2", "2.2.6.1", "2.2.6", "2.2.5", "2.2.4", "2.2.3.1", "2.2.3", "2.2.2", "2.2.1", "2.2.0", "2.1.4.4", "2.1.4.3", "2.1.4.2", "2.1.4.1", "2.1.4", "2.1.3", "2.1.2", "2.1.1", "2.1.0", "2.0.9.4", "2.0.9.3", "2.0.9.2", "2.0.9.1", "2.0.9", "2.0.8", "2.0.7", "2.0.6", "2.0.5", "2.0.4", "2.0.3", "2.0.2", "2.0.1", "2.0.0.rc1", "2.0.0.alpha", "1.6.13", "1.6.12", "1.6.11", "1.6.10", "1.6.9", "1.6.8", "1.6.7", "1.6.6", "1.6.5", "1.6.4", "1.6.3", "1.6.2", "1.6.1", "1.6.0", "1.6.0.beta2", "1.6.0.beta", "1.5.5", "1.5.4", "1.5.3", "1.5.2", "1.5.1", "1.5.0", "1.5.0.beta.2", "1.5.0.beta.1", "1.4.7", "1.4.6", "1.4.5", "1.4.4", "1.4.3", "1.4.2", "1.4.1", "1.4.0", "1.3.10", "1.3.9", "1.3.8", "1.3.7", "1.3.6", "1.3.5", "1.3.4", "1.3.3", "1.3.2", "1.3.1", "1.3.0", "1.3.0.beta2", "1.3.0.beta", "1.2.8", "1.2.7", "1.2.6", "1.2.5", "1.2.4", "1.2.3", "1.2.2", "1.2.1", "1.2.0", "1.1.6", "1.1.5", "1.1.4", "1.1.3", "1.1.2", "1.1.1", "1.1.1.pre", "1.1.0", "1.0.1", "1.0.0", "0.9.1", "0.9.0", "0.4.0", "0.3.0", "0.2.0", "0.1.0"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Rack's multipart parsing without Content-Length header allows unbounded chunked file uploads

Published date: 2026-04-02T20:34:48Z
CVE: CVE-2026-34829
Links:

Summary

Rack::Multipart::Parser only wraps the request body in a BoundedIO when CONTENT_LENGTH is present. When a multipart/form-data request is sent without a Content-Length header, such as with HTTP chunked transfer encoding, multipart parsing continues until end-of-stream with no total size limit.

For file parts, the uploaded body is written directly to a temporary file on disk rather than being constrained by the buffered in-memory upload limit. An unauthenticated attacker can therefore stream an arbitrarily large multipart file upload and consume unbounded disk space.

This results in a denial of service condition for Rack applications that accept multipart form data.

Details

Rack::Multipart::Parser.parse applies BoundedIO only when content_length is not nil:

io = BoundedIO.new(io, content_length) if content_length

When CONTENT_LENGTH is absent, the parser reads the multipart body until EOF without a global byte limit.

Although Rack enforces BUFFERED_UPLOAD_BYTESIZE_LIMIT for retained non-file parts, file uploads are handled differently. When a multipart part includes a filename, the body is streamed to a Tempfile, and the retained-size accounting is not applied to that file content. As a result, file parts are not subject to the same upload size bound.

An attacker can exploit this by sending a chunked multipart/form-data request containing a file part and continuously streaming data without declaring a Content-Length. Rack will continue writing the uploaded data to disk until the client stops or the server exhausts available storage.

Impact

Any Rack application that accepts multipart/form-data uploads may be affected if no upstream component enforces a request body size limit.

An unauthenticated attacker can send a large chunked file upload to consume disk space on the application host. This may cause request failures, application instability, or broader service disruption if the host runs out of available storage.

The practical impact depends on deployment architecture. Reverse proxies or application servers that enforce upload limits may reduce or eliminate exploitability, but Rack itself does not impose a total multipart upload limit in this code path when CONTENT_LENGTH is absent.

Mitigation

  • Update to a patched version of Rack that enforces a total multipart upload size limit even when CONTENT_LENGTH is absent.
  • Enforce request body size limits at the reverse proxy or application server.
  • Isolate temporary upload storage and monitor disk consumption for multipart endpoints.

Affected versions: ["3.2.5", "3.2.4", "3.2.3", "3.2.2", "3.2.1", "3.2.0", "3.1.20", "3.1.19", "3.1.18", "3.1.17", "3.1.16", "3.1.15", "3.1.14", "3.1.13", "3.1.12", "3.1.11", "3.1.10", "3.1.9", "3.1.8", "3.1.7", "3.1.6", "3.1.5", "3.1.4", "3.1.3", "3.1.2", "3.1.1", "3.1.0", "3.0.18", "3.0.17", "3.0.16", "3.0.15", "3.0.14", "3.0.13", "3.0.12", "3.0.11", "3.0.10", "3.0.9.1", "3.0.9", "3.0.8", "3.0.7", "3.0.6.1", "3.0.6", "3.0.5", "3.0.4.2", "3.0.4.1", "3.0.4", "3.0.3", "3.0.2", "3.0.1", "3.0.0", "3.0.0.rc1", "3.0.0.beta1", "2.2.22", "2.2.21", "2.2.20", "2.2.19", "2.2.18", "2.2.17", "2.2.16", "2.2.15", "2.2.14", "2.2.13", "2.2.12", "2.2.11", "2.2.10", "2.2.9", "2.2.8.1", "2.2.8", "2.2.7", "2.2.6.4", "2.2.6.3", "2.2.6.2", "2.2.6.1", "2.2.6", "2.2.5", "2.2.4", "2.2.3.1", "2.2.3", "2.2.2", "2.2.1", "2.2.0", "2.1.4.4", "2.1.4.3", "2.1.4.2", "2.1.4.1", "2.1.4", "2.1.3", "2.1.2", "2.1.1", "2.1.0", "2.0.9.4", "2.0.9.3", "2.0.9.2", "2.0.9.1", "2.0.9", "2.0.8", "2.0.7", "2.0.6", "2.0.5", "2.0.4", "2.0.3", "2.0.2", "2.0.1", "2.0.0.rc1", "2.0.0.alpha", "1.6.13", "1.6.12", "1.6.11", "1.6.10", "1.6.9", "1.6.8", "1.6.7", "1.6.6", "1.6.5", "1.6.4", "1.6.3", "1.6.2", "1.6.1", "1.6.0", "1.6.0.beta2", "1.6.0.beta", "1.5.5", "1.5.4", "1.5.3", "1.5.2", "1.5.1", "1.5.0", "1.5.0.beta.2", "1.5.0.beta.1", "1.4.7", "1.4.6", "1.4.5", "1.4.4", "1.4.3", "1.4.2", "1.4.1", "1.4.0", "1.3.10", "1.3.9", "1.3.8", "1.3.7", "1.3.6", "1.3.5", "1.3.4", "1.3.3", "1.3.2", "1.3.1", "1.3.0", "1.3.0.beta2", "1.3.0.beta", "1.2.8", "1.2.7", "1.2.6", "1.2.5", "1.2.4", "1.2.3", "1.2.2", "1.2.1", "1.2.0", "1.1.6", "1.1.5", "1.1.4", "1.1.3", "1.1.2", "1.1.1", "1.1.1.pre", "1.1.0", "1.0.1", "1.0.0", "0.9.1", "0.9.0", "0.4.0", "0.3.0", "0.2.0", "0.1.0"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Rack has an Unbounded-Parameter DoS in Rack::QueryParser

Published date: 2025-05-08T14:45:48Z
CVE: CVE-2025-46727
Links:

Summary

Rack::QueryParser parses query strings and application/x-www-form-urlencoded bodies into Ruby data structures without imposing any limit on the number of parameters, allowing attackers to send requests with extremely large numbers of parameters.

Details

The vulnerability arises because Rack::QueryParser iterates over each &-separated key-value pair and adds it to a Hash without enforcing an upper bound on the total number of parameters. This allows an attacker to send a single request containing hundreds of thousands (or more) of parameters, which consumes excessive memory and CPU during parsing.

Impact

An attacker can trigger denial of service by sending specifically crafted HTTP requests, which can cause memory exhaustion or pin CPU resources, stalling or crashing the Rack server. This results in full service disruption until the affected worker is restarted.

Mitigation

  • Update to a version of Rack that limits the number of parameters parsed, or
  • Use middleware to enforce a maximum query string size or parameter count, or
  • Employ a reverse proxy (such as Nginx) to limit request sizes and reject oversized query strings or bodies.

Limiting request body sizes and query string lengths at the web server or CDN level is an effective mitigation.

Affected versions: ["3.1.13", "3.1.12", "3.1.11", "3.1.10", "3.1.9", "3.1.8", "3.1.7", "3.1.6", "3.1.5", "3.1.4", "3.1.3", "3.1.2", "3.1.1", "3.1.0", "3.0.15", "3.0.14", "3.0.13", "3.0.12", "3.0.11", "3.0.10", "3.0.9.1", "3.0.9", "3.0.8", "3.0.7", "3.0.6.1", "3.0.6", "3.0.5", "3.0.4.2", "3.0.4.1", "3.0.4", "3.0.3", "3.0.2", "3.0.1", "3.0.0", "2.2.13", "2.2.12", "2.2.11", "2.2.10", "2.2.9", "2.2.8.1", "2.2.8", "2.2.7", "2.2.6.4", "2.2.6.3", "2.2.6.2", "2.2.6.1", "2.2.6", "2.2.5", "2.2.4", "2.2.3.1", "2.2.3", "2.2.2", "2.2.1", "2.2.0", "2.1.4.4", "2.1.4.3", "2.1.4.2", "2.1.4.1", "2.1.4", "2.1.3", "2.1.2", "2.1.1", "2.1.0", "2.0.9.4", "2.0.9.3", "2.0.9.2", "2.0.9.1", "2.0.9", "2.0.8", "2.0.7", "2.0.6", "2.0.5", "2.0.4", "2.0.3", "2.0.2", "2.0.1", "2.0.0.rc1", "2.0.0.alpha", "1.6.13", "1.6.12", "1.6.11", "1.6.10", "1.6.9", "1.6.8", "1.6.7", "1.6.6", "1.6.5", "1.6.4", "1.6.3", "1.6.2", "1.6.1", "1.6.0", "1.6.0.beta2", "1.6.0.beta", "1.5.5", "1.5.4", "1.5.3", "1.5.2", "1.5.1", "1.5.0", "1.5.0.beta.2", "1.5.0.beta.1", "1.4.7", "1.4.6", "1.4.5", "1.4.4", "1.4.3", "1.4.2", "1.4.1", "1.4.0", "1.3.10", "1.3.9", "1.3.8", "1.3.7", "1.3.6", "1.3.5", "1.3.4", "1.3.3", "1.3.2", "1.3.1", "1.3.0", "1.3.0.beta2", "1.3.0.beta", "1.2.8", "1.2.7", "1.2.6", "1.2.5", "1.2.4", "1.2.3", "1.2.2", "1.2.1", "1.2.0", "1.1.6", "1.1.5", "1.1.4", "1.1.3", "1.1.2", "1.1.1", "1.1.1.pre", "1.1.0", "1.0.1", "1.0.0", "0.9.1", "0.9.0", "0.4.0", "0.3.0", "0.2.0", "0.1.0"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Rack::Static prefix matching can expose unintended files under the static root

Published date: 2026-04-02T18:44:25Z
CVE: CVE-2026-34785
Links:

Summary

Rack::Static determines whether a request should be served as a static file using a simple string prefix check. When configured with URL prefixes such as "/css", it matches any request path that begins with that string, including unrelated paths such as "/css-config.env" or "/css-backup.sql".

As a result, files under the static root whose names merely share the configured prefix may be served unintentionally, leading to information disclosure.

Details

Rack::Static#route_file performs static-route matching using logic equivalent to:

@urls.any? { |url| path.index(url) == 0 }

This checks only whether the request path starts with the configured prefix string. It does not require a path segment boundary after the prefix.

For example, with:

use Rack::Static, urls: ["/css", "/js"], root: "public"

the following path is matched as intended:

/css/style.css

but these paths are also matched:

/css-config.env
/css-backup.sql
/csssecrets.yml

If such files exist under the configured static root, Rack forwards the request to the file server and serves them as static content.

This means a configuration intended to expose only directory trees such as /css/... and /js/... may also expose sibling files whose names begin with those same strings.

Impact

An attacker can request files under the configured static root whose names share a configured URL prefix and obtain their contents.

In affected deployments, this may expose configuration files, secrets, backups, environment files, or other unintended static content located under the same root directory.

Mitigation

  • Update to a patched version of Rack that enforces a path boundary when matching configured static URL prefixes.
  • Match only paths that are either exactly equal to the configured prefix or begin with prefix + "/".
  • Avoid placing sensitive files under the Rack::Static root directory.
  • Prefer static URL mappings that cannot overlap with sensitive filenames.

Affected versions: ["3.2.5", "3.2.4", "3.2.3", "3.2.2", "3.2.1", "3.2.0", "3.1.20", "3.1.19", "3.1.18", "3.1.17", "3.1.16", "3.1.15", "3.1.14", "3.1.13", "3.1.12", "3.1.11", "3.1.10", "3.1.9", "3.1.8", "3.1.7", "3.1.6", "3.1.5", "3.1.4", "3.1.3", "3.1.2", "3.1.1", "3.1.0", "3.0.18", "3.0.17", "3.0.16", "3.0.15", "3.0.14", "3.0.13", "3.0.12", "3.0.11", "3.0.10", "3.0.9.1", "3.0.9", "3.0.8", "3.0.7", "3.0.6.1", "3.0.6", "3.0.5", "3.0.4.2", "3.0.4.1", "3.0.4", "3.0.3", "3.0.2", "3.0.1", "3.0.0", "3.0.0.rc1", "3.0.0.beta1", "2.2.22", "2.2.21", "2.2.20", "2.2.19", "2.2.18", "2.2.17", "2.2.16", "2.2.15", "2.2.14", "2.2.13", "2.2.12", "2.2.11", "2.2.10", "2.2.9", "2.2.8.1", "2.2.8", "2.2.7", "2.2.6.4", "2.2.6.3", "2.2.6.2", "2.2.6.1", "2.2.6", "2.2.5", "2.2.4", "2.2.3.1", "2.2.3", "2.2.2", "2.2.1", "2.2.0", "2.1.4.4", "2.1.4.3", "2.1.4.2", "2.1.4.1", "2.1.4", "2.1.3", "2.1.2", "2.1.1", "2.1.0", "2.0.9.4", "2.0.9.3", "2.0.9.2", "2.0.9.1", "2.0.9", "2.0.8", "2.0.7", "2.0.6", "2.0.5", "2.0.4", "2.0.3", "2.0.2", "2.0.1", "2.0.0.rc1", "2.0.0.alpha", "1.6.13", "1.6.12", "1.6.11", "1.6.10", "1.6.9", "1.6.8", "1.6.7", "1.6.6", "1.6.5", "1.6.4", "1.6.3", "1.6.2", "1.6.1", "1.6.0", "1.6.0.beta2", "1.6.0.beta", "1.5.5", "1.5.4", "1.5.3", "1.5.2", "1.5.1", "1.5.0", "1.5.0.beta.2", "1.5.0.beta.1", "1.4.7", "1.4.6", "1.4.5", "1.4.4", "1.4.3", "1.4.2", "1.4.1", "1.4.0", "1.3.10", "1.3.9", "1.3.8", "1.3.7", "1.3.6", "1.3.5", "1.3.4", "1.3.3", "1.3.2", "1.3.1", "1.3.0", "1.3.0.beta2", "1.3.0.beta", "1.2.8", "1.2.7", "1.2.6", "1.2.5", "1.2.4", "1.2.3", "1.2.2", "1.2.1", "1.2.0", "1.1.6", "1.1.5", "1.1.4", "1.1.3", "1.1.2", "1.1.1", "1.1.1.pre", "1.1.0", "1.0.1", "1.0.0", "0.9.1", "0.9.0", "0.4.0", "0.3.0", "0.2.0", "0.1.0"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Possible Information Leak / Session Hijack Vulnerability in Rack

Published date: 2019-12-18T19:01:31Z
CVE: CVE-2019-16782
Links:

There's a possible information leak / session hijack vulnerability in Rack. Attackers may be able to find and hijack sessions by using timing attacks targeting the session id. Session ids are usually stored and indexed in a database that uses some kind of scheme for speeding up lookups of that session id. By carefully measuring the amount of time it takes to look up a session, an attacker may be able to find a valid session id and hijack the session.

The session id itself may be generated randomly, but the way the session is indexed by the backing store does not use a secure comparison.

Impact

The session id stored in a cookie is the same id that is used when querying the backing session storage engine. Most storage mechanisms (for example a database) use some sort of indexing in order to speed up the lookup of that id. By carefully timing requests and session lookup failures, an attacker may be able to perform a timing attack to determine an existing session id and hijack that session.

Releases

The 1.6.12 and 2.0.8 releases are available at the normal locations.

Workarounds

There are no known workarounds.

Patches

To aid users who aren't able to upgrade immediately we have provided patches for the two supported release series. They are in git-am format and consist of a single changeset.

  • 1-6-session-timing-attack.patch - Patch for 1.6 series
  • 2-0-session-timing-attack.patch - Patch for 2.6 series

Credits

Thanks Will Leinweber for reporting this!

Affected versions: ["2.0.7", "2.0.6", "2.0.5", "2.0.4", "2.0.3", "2.0.2", "2.0.1", "1.6.11", "1.6.10", "1.6.9", "1.6.8", "1.6.7", "1.6.6", "1.6.5", "1.6.4", "1.6.3", "1.6.2", "1.6.1", "1.6.0", "1.6.0.beta2", "1.6.0.beta", "1.5.5", "1.5.4", "1.5.3", "1.5.2", "1.5.1", "1.5.0", "1.5.0.beta.2", "1.5.0.beta.1", "1.4.7", "1.4.6", "1.4.5", "1.4.4", "1.4.3", "1.4.2", "1.4.1", "1.4.0", "1.3.10", "1.3.9", "1.3.8", "1.3.7", "1.3.6", "1.3.5", "1.3.4", "1.3.3", "1.3.2", "1.3.1", "1.3.0", "1.3.0.beta2", "1.3.0.beta", "1.2.8", "1.2.7", "1.2.6", "1.2.5", "1.2.4", "1.2.3", "1.2.2", "1.2.1", "1.2.0", "1.1.6", "1.1.5", "1.1.4", "1.1.3", "1.1.2", "1.1.1", "1.1.1.pre", "1.1.0", "1.0.1", "1.0.0", "0.9.1", "0.9.0", "0.4.0", "0.3.0", "0.2.0", "0.1.0"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Denial of Service Vulnerability in Rack Multipart Parsing

Published date: 2022-05-27T16:36:52Z
CVE: CVE-2022-30122
Links:

There is a possible denial of service vulnerability in the multipart parsing component of Rack. This vulnerability has been assigned the CVE identifier CVE-2022-30122.

Versions Affected: >= 1.2 Not affected: < 1.2 Fixed Versions: 2.0.9.1, 2.1.4.1, 2.2.3.1

Impact

Carefully crafted multipart POST requests can cause Rack's multipart parser to take much longer than expected, leading to a possible denial of service vulnerability.

Impacted code will use Rack's multipart parser to parse multipart posts. This includes directly using the multipart parser like this:

params = Rack::Multipart.parse_multipart(env)

But it also includes reading POST data from a Rack request object like this:

p request.POST # read POST data
p request.params # reads both query params and POST data

All users running an affected release should either upgrade or use one of the workarounds immediately.

Workarounds

There are no feasible workarounds for this issue.

Affected versions: ["2.2.3", "2.2.2", "2.2.1", "2.2.0", "2.1.4", "2.1.3", "2.1.2", "2.1.1", "2.1.0", "2.0.9", "2.0.8", "2.0.7", "2.0.6", "2.0.5", "2.0.4", "2.0.3", "2.0.2", "2.0.1", "2.0.0.rc1", "2.0.0.alpha", "1.6.13", "1.6.12", "1.6.11", "1.6.10", "1.6.9", "1.6.8", "1.6.7", "1.6.6", "1.6.5", "1.6.4", "1.6.3", "1.6.2", "1.6.1", "1.6.0", "1.6.0.beta2", "1.6.0.beta", "1.5.5", "1.5.4", "1.5.3", "1.5.2", "1.5.1", "1.5.0", "1.5.0.beta.2", "1.5.0.beta.1", "1.4.7", "1.4.6", "1.4.5", "1.4.4", "1.4.3", "1.4.2", "1.4.1", "1.4.0", "1.3.10", "1.3.9", "1.3.8", "1.3.7", "1.3.6", "1.3.5", "1.3.4", "1.3.3", "1.3.2", "1.3.1", "1.3.0", "1.3.0.beta2", "1.3.0.beta", "1.2.8", "1.2.7", "1.2.6", "1.2.5", "1.2.4", "1.2.3", "1.2.2", "1.2.1", "1.2.0"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Rack allows Percent-encoded cookies to overwrite existing prefixed cookie names

Published date: 2020-06-24T17:15:00Z
CVE: CVE-2020-8184
Links:

A reliance on cookies without validation/integrity check security vulnerability exists in rack < 2.2.3, rack < 2.1.4 that makes it possible for an attacker to forge a secure or host-only cookie prefix.

Affected versions: ["2.2.2", "2.2.1", "2.2.0", "2.1.3", "2.1.2", "2.1.1", "2.1.0", "2.0.9.4", "2.0.9.3", "2.0.9.2", "2.0.9.1", "2.0.9", "2.0.8", "2.0.7", "2.0.6", "2.0.5", "2.0.4", "2.0.3", "2.0.2", "2.0.1", "2.0.0.rc1", "2.0.0.alpha", "1.6.13", "1.6.12", "1.6.11", "1.6.10", "1.6.9", "1.6.8", "1.6.7", "1.6.6", "1.6.5", "1.6.4", "1.6.3", "1.6.2", "1.6.1", "1.6.0", "1.6.0.beta2", "1.6.0.beta", "1.5.5", "1.5.4", "1.5.3", "1.5.2", "1.5.1", "1.5.0", "1.5.0.beta.2", "1.5.0.beta.1", "1.4.7", "1.4.6", "1.4.5", "1.4.4", "1.4.3", "1.4.2", "1.4.1", "1.4.0", "1.3.10", "1.3.9", "1.3.8", "1.3.7", "1.3.6", "1.3.5", "1.3.4", "1.3.3", "1.3.2", "1.3.1", "1.3.0", "1.3.0.beta2", "1.3.0.beta", "1.2.8", "1.2.7", "1.2.6", "1.2.5", "1.2.4", "1.2.3", "1.2.2", "1.2.1", "1.2.0", "1.1.6", "1.1.5", "1.1.4", "1.1.3", "1.1.2", "1.1.1", "1.1.1.pre", "1.1.0", "1.0.1", "1.0.0", "0.9.1", "0.9.0", "0.4.0", "0.3.0", "0.2.0", "0.1.0"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Rack has a Directory Traversal via Rack:Directory

Published date: 2026-02-17T16:14:11Z
CVE: CVE-2026-22860
Links:

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.

Affected versions: ["3.2.4", "3.2.3", "3.2.2", "3.2.1", "3.2.0", "3.1.19", "3.1.18", "3.1.17", "3.1.16", "3.1.15", "3.1.14", "3.1.13", "3.1.12", "3.1.11", "3.1.10", "3.1.9", "3.1.8", "3.1.7", "3.1.6", "3.1.5", "3.1.4", "3.1.3", "3.1.2", "3.1.1", "3.1.0", "3.0.18", "3.0.17", "3.0.16", "3.0.15", "3.0.14", "3.0.13", "3.0.12", "3.0.11", "3.0.10", "3.0.9.1", "3.0.9", "3.0.8", "3.0.7", "3.0.6.1", "3.0.6", "3.0.5", "3.0.4.2", "3.0.4.1", "3.0.4", "3.0.3", "3.0.2", "3.0.1", "3.0.0", "3.0.0.rc1", "3.0.0.beta1", "2.2.21", "2.2.20", "2.2.19", "2.2.18", "2.2.17", "2.2.16", "2.2.15", "2.2.14", "2.2.13", "2.2.12", "2.2.11", "2.2.10", "2.2.9", "2.2.8.1", "2.2.8", "2.2.7", "2.2.6.4", "2.2.6.3", "2.2.6.2", "2.2.6.1", "2.2.6", "2.2.5", "2.2.4", "2.2.3.1", "2.2.3", "2.2.2", "2.2.1", "2.2.0", "2.1.4.4", "2.1.4.3", "2.1.4.2", "2.1.4.1", "2.1.4", "2.1.3", "2.1.2", "2.1.1", "2.1.0", "2.0.9.4", "2.0.9.3", "2.0.9.2", "2.0.9.1", "2.0.9", "2.0.8", "2.0.7", "2.0.6", "2.0.5", "2.0.4", "2.0.3", "2.0.2", "2.0.1", "2.0.0.rc1", "2.0.0.alpha", "1.6.13", "1.6.12", "1.6.11", "1.6.10", "1.6.9", "1.6.8", "1.6.7", "1.6.6", "1.6.5", "1.6.4", "1.6.3", "1.6.2", "1.6.1", "1.6.0", "1.6.0.beta2", "1.6.0.beta", "1.5.5", "1.5.4", "1.5.3", "1.5.2", "1.5.1", "1.5.0", "1.5.0.beta.2", "1.5.0.beta.1", "1.4.7", "1.4.6", "1.4.5", "1.4.4", "1.4.3", "1.4.2", "1.4.1", "1.4.0", "1.3.10", "1.3.9", "1.3.8", "1.3.7", "1.3.6", "1.3.5", "1.3.4", "1.3.3", "1.3.2", "1.3.1", "1.3.0", "1.3.0.beta2", "1.3.0.beta", "1.2.8", "1.2.7", "1.2.6", "1.2.5", "1.2.4", "1.2.3", "1.2.2", "1.2.1", "1.2.0", "1.1.6", "1.1.5", "1.1.4", "1.1.3", "1.1.2", "1.1.1", "1.1.1.pre", "1.1.0", "1.0.1", "1.0.0", "0.9.1", "0.9.0", "0.4.0", "0.3.0", "0.2.0", "0.1.0"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Rack's unbounded multipart preamble buffering enables DoS (memory exhaustion)

Published date: 2025-10-07T17:26:16Z
CVE: CVE-2025-61770
Links:

Summary

Rack::Multipart::Parser buffers the entire multipart preamble (bytes before the first boundary) in memory without any size limit. A client can send a large preamble followed by a valid boundary, causing significant memory use and potential process termination due to out-of-memory (OOM) conditions.

Details

While searching for the first boundary, the parser appends incoming data into a shared buffer (@sbuf.concat(content)) and scans for the boundary pattern:

@sbuf.scan_until(@body_regex)

If the boundary is not yet found, the parser continues buffering data indefinitely. There is no trimming or size cap on the preamble, allowing attackers to send arbitrary amounts of data before the first boundary.

Impact

Remote attackers can trigger large transient memory spikes by including a long preamble in multipart/form-data requests. The impact scales with allowed request sizes and concurrency, potentially causing worker crashes or severe slowdown due to garbage collection.

Mitigation

  • Upgrade: Use a patched version of Rack that enforces a preamble size limit (e.g., 16 KiB) or discards preamble data entirely per RFC 2046 § 5.1.1.
  • Workarounds:
    • Limit total request body size at the proxy or web server level.
    • Monitor memory and set per-process limits to prevent OOM conditions.

Affected versions: ["3.2.1", "3.2.0", "3.1.16", "3.1.15", "3.1.14", "3.1.13", "3.1.12", "3.1.11", "3.1.10", "3.1.9", "3.1.8", "3.1.7", "3.1.6", "3.1.5", "3.1.4", "3.1.3", "3.1.2", "3.1.1", "3.1.0", "2.2.18", "2.2.17", "2.2.16", "2.2.15", "2.2.14", "2.2.13", "2.2.12", "2.2.11", "2.2.10", "2.2.9", "2.2.8.1", "2.2.8", "2.2.7", "2.2.6.4", "2.2.6.3", "2.2.6.2", "2.2.6.1", "2.2.6", "2.2.5", "2.2.4", "2.2.3.1", "2.2.3", "2.2.2", "2.2.1", "2.2.0", "2.1.4.4", "2.1.4.3", "2.1.4.2", "2.1.4.1", "2.1.4", "2.1.3", "2.1.2", "2.1.1", "2.1.0", "2.0.9.4", "2.0.9.3", "2.0.9.2", "2.0.9.1", "2.0.9", "2.0.8", "2.0.7", "2.0.6", "2.0.5", "2.0.4", "2.0.3", "2.0.2", "2.0.1", "2.0.0.rc1", "2.0.0.alpha", "1.6.13", "1.6.12", "1.6.11", "1.6.10", "1.6.9", "1.6.8", "1.6.7", "1.6.6", "1.6.5", "1.6.4", "1.6.3", "1.6.2", "1.6.1", "1.6.0", "1.6.0.beta2", "1.6.0.beta", "1.5.5", "1.5.4", "1.5.3", "1.5.2", "1.5.1", "1.5.0", "1.5.0.beta.2", "1.5.0.beta.1", "1.4.7", "1.4.6", "1.4.5", "1.4.4", "1.4.3", "1.4.2", "1.4.1", "1.4.0", "1.3.10", "1.3.9", "1.3.8", "1.3.7", "1.3.6", "1.3.5", "1.3.4", "1.3.3", "1.3.2", "1.3.1", "1.3.0", "1.3.0.beta2", "1.3.0.beta", "1.2.8", "1.2.7", "1.2.6", "1.2.5", "1.2.4", "1.2.3", "1.2.2", "1.2.1", "1.2.0", "1.1.6", "1.1.5", "1.1.4", "1.1.3", "1.1.2", "1.1.1", "1.1.1.pre", "1.1.0", "1.0.1", "1.0.0", "0.9.1", "0.9.0", "0.4.0", "0.3.0", "0.2.0", "0.1.0"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Rack has Content-Length mismatch in Rack::Files error responses

Published date: 2026-04-02T20:36:10Z
CVE: CVE-2026-34831
Links:

Summary

Rack::Files#fail sets the Content-Length response header using String#size instead of String#bytesize. When the response body contains multibyte UTF-8 characters, the declared Content-Length is smaller than the number of bytes actually sent on the wire.

Because Rack::Files reflects the requested path in 404 responses, an attacker can trigger this mismatch by requesting a non-existent path containing percent-encoded UTF-8 characters.

This results in incorrect HTTP response framing and may cause response desynchronization in deployments that rely on the incorrect Content-Length value.

Details

Rack::Files#fail constructs error responses using logic equivalent to:

def fail(status, body, headers = {})
  body += "\n"
  [
    status,
    {
      "content-type" => "text/plain",
      "content-length" => body.size.to_s,
      "x-cascade" => "pass"
    }.merge!(headers),
    [body]
  ]
end

Here, body.size returns the number of characters, not the number of bytes. For multibyte UTF-8 strings, this produces an incorrect Content-Length value.

Rack::Files includes the decoded request path in 404 responses. A request containing percent-encoded UTF-8 path components therefore causes the response body to contain multibyte characters, while the Content-Length header still reflects character count rather than byte count.

As a result, the server can send more bytes than declared in the response headers.

This violates HTTP message framing requirements, which define Content-Length as the number of octets in the message body.

Impact

Applications using Rack::Files may emit incorrectly framed error responses when handling requests for non-existent paths containing multibyte characters.

In some deployment topologies, particularly with keep-alive connections and intermediaries that rely on Content-Length, this mismatch may lead to response parsing inconsistencies or response desynchronization. The practical exploitability depends on the behavior of downstream proxies, clients, and connection reuse.

Even where no secondary exploitation is possible, the response is malformed and may trigger protocol errors in strict components.

Mitigation

  • Update to a patched version of Rack that computes Content-Length using String#bytesize.
  • Avoid exposing Rack::Files directly to untrusted traffic until a fix is available, if operationally feasible.
  • Where possible, place Rack behind a proxy or server that normalizes or rejects malformed backend responses.
  • Prefer closing backend connections on error paths if response framing anomalies are a concern.

Affected versions: ["3.2.5", "3.2.4", "3.2.3", "3.2.2", "3.2.1", "3.2.0", "3.1.20", "3.1.19", "3.1.18", "3.1.17", "3.1.16", "3.1.15", "3.1.14", "3.1.13", "3.1.12", "3.1.11", "3.1.10", "3.1.9", "3.1.8", "3.1.7", "3.1.6", "3.1.5", "3.1.4", "3.1.3", "3.1.2", "3.1.1", "3.1.0", "3.0.18", "3.0.17", "3.0.16", "3.0.15", "3.0.14", "3.0.13", "3.0.12", "3.0.11", "3.0.10", "3.0.9.1", "3.0.9", "3.0.8", "3.0.7", "3.0.6.1", "3.0.6", "3.0.5", "3.0.4.2", "3.0.4.1", "3.0.4", "3.0.3", "3.0.2", "3.0.1", "3.0.0", "3.0.0.rc1", "3.0.0.beta1", "2.2.22", "2.2.21", "2.2.20", "2.2.19", "2.2.18", "2.2.17", "2.2.16", "2.2.15", "2.2.14", "2.2.13", "2.2.12", "2.2.11", "2.2.10", "2.2.9", "2.2.8.1", "2.2.8", "2.2.7", "2.2.6.4", "2.2.6.3", "2.2.6.2", "2.2.6.1", "2.2.6", "2.2.5", "2.2.4", "2.2.3.1", "2.2.3", "2.2.2", "2.2.1", "2.2.0", "2.1.4.4", "2.1.4.3", "2.1.4.2", "2.1.4.1", "2.1.4", "2.1.3", "2.1.2", "2.1.1", "2.1.0", "2.0.9.4", "2.0.9.3", "2.0.9.2", "2.0.9.1", "2.0.9", "2.0.8", "2.0.7", "2.0.6", "2.0.5", "2.0.4", "2.0.3", "2.0.2", "2.0.1", "2.0.0.rc1", "2.0.0.alpha", "1.6.13", "1.6.12", "1.6.11", "1.6.10", "1.6.9", "1.6.8", "1.6.7", "1.6.6", "1.6.5", "1.6.4", "1.6.3", "1.6.2", "1.6.1", "1.6.0", "1.6.0.beta2", "1.6.0.beta", "1.5.5", "1.5.4", "1.5.3", "1.5.2", "1.5.1", "1.5.0", "1.5.0.beta.2", "1.5.0.beta.1", "1.4.7", "1.4.6", "1.4.5", "1.4.4", "1.4.3", "1.4.2", "1.4.1", "1.4.0", "1.3.10", "1.3.9", "1.3.8", "1.3.7", "1.3.6", "1.3.5", "1.3.4", "1.3.3", "1.3.2", "1.3.1", "1.3.0", "1.3.0.beta2", "1.3.0.beta", "1.2.8", "1.2.7", "1.2.6", "1.2.5", "1.2.4", "1.2.3", "1.2.2", "1.2.1", "1.2.0", "1.1.6", "1.1.5", "1.1.4", "1.1.3", "1.1.2", "1.1.1", "1.1.1.pre", "1.1.0", "1.0.1", "1.0.0", "0.9.1", "0.9.0", "0.4.0", "0.3.0", "0.2.0", "0.1.0"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Rack:: Static header_rules bypass via URL-encoded paths

Published date: 2026-04-02T18:44:49Z
CVE: CVE-2026-34786
Links:

Summary

Rack::Static#applicable_rules evaluates several header_rules types against the raw URL-encoded PATH_INFO, while the underlying file-serving path is decoded before the file is served. As a result, a request for a URL-encoded variant of a static path can serve the same file without the headers that header_rules were intended to apply.

In deployments that rely on Rack::Static to attach security-relevant response headers to static content, this can allow an attacker to bypass those headers by requesting an encoded form of the path.

Details

Rack::Static#applicable_rules matches rule types such as :fonts, Array, and Regexp directly against the incoming PATH_INFO. For example:

when :fonts
  /\.(?:ttf|otf|eot|woff2|woff|svg)\z/.match?(path)
when Array
  /\.(#{rule.join('|')})\z/.match?(path)
when Regexp
  rule.match?(path)

These checks operate on the raw request path. If the request contains encoded characters such as %2E in place of ., the rule may fail to match even though the file path is later decoded and served successfully by the static file server.

For example, both of the following requests may resolve to the same file on disk:

/fonts/test.woff
/fonts/test%2Ewoff

but only the unencoded form may receive the headers configured through header_rules.

This creates a canonicalization mismatch between the path used for header policy decisions and the path ultimately used for file serving.

Impact

Applications that rely on Rack::Static header_rules to apply security-relevant headers to static files may be affected.

In affected deployments, an attacker can request an encoded variant of a static file path and receive the same file without the intended headers. Depending on how header_rules are used, this may bypass protections such as clickjacking defenses, content restrictions, or other response policies applied to static content.

The practical impact depends on the configured rules and the types of files being served. If header_rules are only used for non-security purposes such as caching, the issue may have limited security significance.

Mitigation

  • Update to a patched version of Rack that applies header_rules to a decoded path consistently with static file resolution.
  • Do not rely solely on Rack::Static header_rules for security-critical headers where encoded path variants may reach the application.
  • Prefer setting security headers at the reverse proxy or web server layer so they apply consistently to both encoded and unencoded path forms.
  • Normalize or reject encoded path variants for static content at the edge, where feasible.

Affected versions: ["3.2.5", "3.2.4", "3.2.3", "3.2.2", "3.2.1", "3.2.0", "3.1.20", "3.1.19", "3.1.18", "3.1.17", "3.1.16", "3.1.15", "3.1.14", "3.1.13", "3.1.12", "3.1.11", "3.1.10", "3.1.9", "3.1.8", "3.1.7", "3.1.6", "3.1.5", "3.1.4", "3.1.3", "3.1.2", "3.1.1", "3.1.0", "3.0.18", "3.0.17", "3.0.16", "3.0.15", "3.0.14", "3.0.13", "3.0.12", "3.0.11", "3.0.10", "3.0.9.1", "3.0.9", "3.0.8", "3.0.7", "3.0.6.1", "3.0.6", "3.0.5", "3.0.4.2", "3.0.4.1", "3.0.4", "3.0.3", "3.0.2", "3.0.1", "3.0.0", "3.0.0.rc1", "3.0.0.beta1", "2.2.22", "2.2.21", "2.2.20", "2.2.19", "2.2.18", "2.2.17", "2.2.16", "2.2.15", "2.2.14", "2.2.13", "2.2.12", "2.2.11", "2.2.10", "2.2.9", "2.2.8.1", "2.2.8", "2.2.7", "2.2.6.4", "2.2.6.3", "2.2.6.2", "2.2.6.1", "2.2.6", "2.2.5", "2.2.4", "2.2.3.1", "2.2.3", "2.2.2", "2.2.1", "2.2.0", "2.1.4.4", "2.1.4.3", "2.1.4.2", "2.1.4.1", "2.1.4", "2.1.3", "2.1.2", "2.1.1", "2.1.0", "2.0.9.4", "2.0.9.3", "2.0.9.2", "2.0.9.1", "2.0.9", "2.0.8", "2.0.7", "2.0.6", "2.0.5", "2.0.4", "2.0.3", "2.0.2", "2.0.1", "2.0.0.rc1", "2.0.0.alpha", "1.6.13", "1.6.12", "1.6.11", "1.6.10", "1.6.9", "1.6.8", "1.6.7", "1.6.6", "1.6.5", "1.6.4", "1.6.3", "1.6.2", "1.6.1", "1.6.0", "1.6.0.beta2", "1.6.0.beta", "1.5.5", "1.5.4", "1.5.3", "1.5.2", "1.5.1", "1.5.0", "1.5.0.beta.2", "1.5.0.beta.1", "1.4.7", "1.4.6", "1.4.5", "1.4.4", "1.4.3", "1.4.2", "1.4.1", "1.4.0", "1.3.10", "1.3.9", "1.3.8", "1.3.7", "1.3.6", "1.3.5", "1.3.4", "1.3.3", "1.3.2", "1.3.1", "1.3.0", "1.3.0.beta2", "1.3.0.beta", "1.2.8", "1.2.7", "1.2.6", "1.2.5", "1.2.4", "1.2.3", "1.2.2", "1.2.1", "1.2.0", "1.1.6", "1.1.5", "1.1.4", "1.1.3", "1.1.2", "1.1.1", "1.1.1.pre", "1.1.0", "1.0.1", "1.0.0", "0.9.1", "0.9.0", "0.4.0", "0.3.0", "0.2.0", "0.1.0"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Rack::Sendfile header-based X-Accel-Mapping regex injection enables unauthorized X-Accel-Redirect

Published date: 2026-04-02T20:35:23Z
CVE: CVE-2026-34830
Links:

Summary

Rack::Sendfile#map_accel_path interpolates the value of the X-Accel-Mapping request header directly into a regular expression when rewriting file paths for X-Accel-Redirect. Because the header value is not escaped, an attacker who can supply X-Accel-Mapping to the backend can inject regex metacharacters and control the generated X-Accel-Redirect response header.

In deployments using Rack::Sendfile with x-accel-redirect, this can allow an attacker to cause nginx to serve unintended files from configured internal locations.

Details

Rack::Sendfile#map_accel_path processes header-supplied mappings using logic equivalent to:

mapping.split(',').map(&:strip).each do |m|
  internal, external = m.split('=', 2).map(&:strip)
  new_path = path.sub(/\A#{internal}/i, external)
  return new_path unless path == new_path
end

Here, internal comes from the HTTP_X_ACCEL_MAPPING request header and is inserted directly into a regular expression without escaping. This gives the header value regex semantics rather than treating it as a literal prefix.

As a result, an attacker can supply metacharacters such as .* or capture groups to alter how the path substitution is performed. For example, a mapping such as:

X-Accel-Mapping: .*=/protected/secret.txt

causes the entire source path to match and rewrites the redirect target to a clean attacker-chosen internal path.

This differs from the documented behavior of the header-based mapping path, which is described as a simple substitution. While application-supplied mappings may intentionally support regular expressions, header-supplied mappings should be treated as literal path prefixes.

The issue is only exploitable when untrusted X-Accel-Mapping headers can reach Rack. One realistic case is a reverse proxy configuration that intends to set X-Accel-Mapping itself, but fails to do so on some routes, allowing a client-supplied header to pass through unchanged.

Impact

Applications using Rack::Sendfile with x-accel-redirect may be affected if the backend accepts attacker-controlled X-Accel-Mapping headers.

In affected deployments, an attacker may be able to control the X-Accel-Redirect response header and cause nginx to serve files from internal locations that were not intended to be reachable through the application. This can lead to unauthorized file disclosure.

The practical impact depends on deployment architecture. If the proxy always strips or overwrites X-Accel-Mapping, or if the application uses explicit configured mappings instead of the request header, exploitability may be eliminated.

Mitigation

  • Update to a patched version of Rack that treats header-supplied X-Accel-Mapping values as literal strings rather than regular expressions.
  • Strip or overwrite inbound X-Accel-Mapping headers at the reverse proxy so client-supplied values never reach Rack.
  • Prefer explicit application-configured sendfile mappings instead of relying on request-header mappings.
  • Review proxy sub-locations and inherited header settings to ensure X-Accel-Mapping is consistently set on all backend routes.

Affected versions: ["3.2.5", "3.2.4", "3.2.3", "3.2.2", "3.2.1", "3.2.0", "3.1.20", "3.1.19", "3.1.18", "3.1.17", "3.1.16", "3.1.15", "3.1.14", "3.1.13", "3.1.12", "3.1.11", "3.1.10", "3.1.9", "3.1.8", "3.1.7", "3.1.6", "3.1.5", "3.1.4", "3.1.3", "3.1.2", "3.1.1", "3.1.0", "3.0.18", "3.0.17", "3.0.16", "3.0.15", "3.0.14", "3.0.13", "3.0.12", "3.0.11", "3.0.10", "3.0.9.1", "3.0.9", "3.0.8", "3.0.7", "3.0.6.1", "3.0.6", "3.0.5", "3.0.4.2", "3.0.4.1", "3.0.4", "3.0.3", "3.0.2", "3.0.1", "3.0.0", "3.0.0.rc1", "3.0.0.beta1", "2.2.22", "2.2.21", "2.2.20", "2.2.19", "2.2.18", "2.2.17", "2.2.16", "2.2.15", "2.2.14", "2.2.13", "2.2.12", "2.2.11", "2.2.10", "2.2.9", "2.2.8.1", "2.2.8", "2.2.7", "2.2.6.4", "2.2.6.3", "2.2.6.2", "2.2.6.1", "2.2.6", "2.2.5", "2.2.4", "2.2.3.1", "2.2.3", "2.2.2", "2.2.1", "2.2.0", "2.1.4.4", "2.1.4.3", "2.1.4.2", "2.1.4.1", "2.1.4", "2.1.3", "2.1.2", "2.1.1", "2.1.0", "2.0.9.4", "2.0.9.3", "2.0.9.2", "2.0.9.1", "2.0.9", "2.0.8", "2.0.7", "2.0.6", "2.0.5", "2.0.4", "2.0.3", "2.0.2", "2.0.1", "2.0.0.rc1", "2.0.0.alpha", "1.6.13", "1.6.12", "1.6.11", "1.6.10", "1.6.9", "1.6.8", "1.6.7", "1.6.6", "1.6.5", "1.6.4", "1.6.3", "1.6.2", "1.6.1", "1.6.0", "1.6.0.beta2", "1.6.0.beta", "1.5.5", "1.5.4", "1.5.3", "1.5.2", "1.5.1", "1.5.0", "1.5.0.beta.2", "1.5.0.beta.1", "1.4.7", "1.4.6", "1.4.5", "1.4.4", "1.4.3", "1.4.2", "1.4.1", "1.4.0", "1.3.10", "1.3.9", "1.3.8", "1.3.7", "1.3.6", "1.3.5", "1.3.4", "1.3.3", "1.3.2", "1.3.1", "1.3.0", "1.3.0.beta2", "1.3.0.beta", "1.2.8", "1.2.7", "1.2.6", "1.2.5", "1.2.4", "1.2.3", "1.2.2", "1.2.1", "1.2.0", "1.1.6", "1.1.5", "1.1.4", "1.1.3", "1.1.2", "1.1.1", "1.1.1.pre", "1.1.0", "1.0.1", "1.0.0", "0.9.1", "0.9.0", "0.4.0", "0.3.0", "0.2.0", "0.1.0"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Rack has a Possible Information Disclosure Vulnerability

Published date: 2025-10-10T17:31:31Z
CVE: CVE-2025-61780
Links:

Summary

A possible information disclosure vulnerability existed in Rack::Sendfile when running behind a proxy that supports x-sendfile headers (such as Nginx). Specially crafted headers could cause Rack::Sendfile to miscommunicate with the proxy and trigger unintended internal requests, potentially bypassing proxy-level access restrictions.

Details

When Rack::Sendfile received untrusted x-sendfile-type or x-accel-mapping headers from a client, it would interpret them as proxy configuration directives. This could cause the middleware to send a redirect response to the proxy, prompting it to reissue a new internal request that was not subject to the proxy's access controls.

An attacker could exploit this by: 1. Setting a crafted x-sendfile-type: x-accel-redirect header. 2. Setting a crafted x-accel-mapping header. 3. Requesting a path that qualifies for proxy-based acceleration.

Impact

Attackers could bypass proxy-enforced restrictions and access internal endpoints intended to be protected (such as administrative pages). The vulnerability did not allow arbitrary file reads but could expose sensitive application routes.

This issue only affected systems meeting all of the following conditions:

  • The application used Rack::Sendfile with a proxy that supports x-accel-redirect (e.g., Nginx).
  • The proxy did not always set or remove the x-sendfile-type and x-accel-mapping headers.
  • The application exposed an endpoint that returned a body responding to .to_path.

Mitigation

  • Upgrade to a fixed version of Rack which requires explicit configuration to enable x-accel-redirect:
  use Rack::Sendfile, "x-accel-redirect"
  • Alternatively, configure the proxy to always set or strip the headers (you should be doing this!):
  proxy_set_header x-sendfile-type x-accel-redirect;
  proxy_set_header x-accel-mapping /var/www/=/files/;
  • Or in Rails applications, disable sendfile completely:
  config.action_dispatch.x_sendfile_header = nil

Affected versions: ["3.2.2", "3.2.1", "3.2.0", "3.1.17", "3.1.16", "3.1.15", "3.1.14", "3.1.13", "3.1.12", "3.1.11", "3.1.10", "3.1.9", "3.1.8", "3.1.7", "3.1.6", "3.1.5", "3.1.4", "3.1.3", "3.1.2", "3.1.1", "3.1.0", "3.0.18", "3.0.17", "3.0.16", "3.0.15", "3.0.14", "3.0.13", "3.0.12", "3.0.11", "3.0.10", "3.0.9.1", "3.0.9", "3.0.8", "3.0.7", "3.0.6.1", "3.0.6", "3.0.5", "3.0.4.2", "3.0.4.1", "3.0.4", "3.0.3", "3.0.2", "3.0.1", "3.0.0", "2.2.19", "2.2.18", "2.2.17", "2.2.16", "2.2.15", "2.2.14", "2.2.13", "2.2.12", "2.2.11", "2.2.10", "2.2.9", "2.2.8.1", "2.2.8", "2.2.7", "2.2.6.4", "2.2.6.3", "2.2.6.2", "2.2.6.1", "2.2.6", "2.2.5", "2.2.4", "2.2.3.1", "2.2.3", "2.2.2", "2.2.1", "2.2.0", "2.1.4.4", "2.1.4.3", "2.1.4.2", "2.1.4.1", "2.1.4", "2.1.3", "2.1.2", "2.1.1", "2.1.0", "2.0.9.4", "2.0.9.3", "2.0.9.2", "2.0.9.1", "2.0.9", "2.0.8", "2.0.7", "2.0.6", "2.0.5", "2.0.4", "2.0.3", "2.0.2", "2.0.1", "2.0.0.rc1", "2.0.0.alpha", "1.6.13", "1.6.12", "1.6.11", "1.6.10", "1.6.9", "1.6.8", "1.6.7", "1.6.6", "1.6.5", "1.6.4", "1.6.3", "1.6.2", "1.6.1", "1.6.0", "1.6.0.beta2", "1.6.0.beta", "1.5.5", "1.5.4", "1.5.3", "1.5.2", "1.5.1", "1.5.0", "1.5.0.beta.2", "1.5.0.beta.1", "1.4.7", "1.4.6", "1.4.5", "1.4.4", "1.4.3", "1.4.2", "1.4.1", "1.4.0", "1.3.10", "1.3.9", "1.3.8", "1.3.7", "1.3.6", "1.3.5", "1.3.4", "1.3.3", "1.3.2", "1.3.1", "1.3.0", "1.3.0.beta2", "1.3.0.beta", "1.2.8", "1.2.7", "1.2.6", "1.2.5", "1.2.4", "1.2.3", "1.2.2", "1.2.1", "1.2.0", "1.1.6", "1.1.5", "1.1.4", "1.1.3", "1.1.2", "1.1.1", "1.1.1.pre", "1.1.0", "1.0.1", "1.0.0", "0.9.1", "0.9.0", "0.4.0", "0.3.0", "0.2.0", "0.1.0"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Rack has quadratic complexity in Rack::Utils.select_best_encoding via wildcard Accept-Encoding header

Published date: 2026-04-02T20:32:19Z
CVE: CVE-2026-34230
Links:

Summary

Rack::Utils.select_best_encoding processes Accept-Encoding values with quadratic time complexity when the header contains many wildcard (*) entries. Because this method is used by Rack::Deflater to choose a response encoding, an unauthenticated attacker can send a single request with a crafted Accept-Encoding header and cause disproportionate CPU consumption on the compression middleware path.

This results in a denial of service condition for applications using Rack::Deflater.

Details

Rack::Utils.select_best_encoding expands parsed Accept-Encoding values into a list of candidate encodings. When an entry is *, the method computes the set of concrete encodings by subtracting the encodings already present in the request:

if m == "*"
  (available_encodings - accept_encoding.map(&:first)).each do |m2|
    expanded_accept_encoding << [m2, q, preference]
  end
else
  expanded_accept_encoding << [m, q, preference]
end

Because accept_encoding.map(&:first) is evaluated inside the loop, it is recomputed for each wildcard entry. If the request contains N wildcard entries, this produces repeated scans over the full parsed header and causes quadratic behavior.

After expansion, the method also performs additional work over expanded_accept_encoding, including per-entry deletion, which further increases the cost for large inputs.

Rack::Deflater invokes this method for each request when the middleware is enabled:

Utils.select_best_encoding(ENCODINGS, Utils.parse_encodings(accept_encoding))

As a result, a client can trigger this expensive code path simply by sending a large Accept-Encoding header containing many repeated wildcard values.

For example, a request with an approximately 8 KB Accept-Encoding header containing about 1,000 *;q=0.5 entries can cause roughly 170 ms of CPU time in a single request on the Rack::Deflater path, compared to a negligible baseline for a normal header.

This issue is distinct from CVE-2024-26146. That issue concerned regular expression denial of service during Accept header parsing, whereas this issue arises later during encoding selection after the header has already been parsed.

Impact

Any Rack application using Rack::Deflater may be affected.

An unauthenticated attacker can send requests with crafted Accept-Encoding headers to trigger excessive CPU usage in the encoding selection logic. Repeated requests can consume worker time disproportionately and reduce application availability.

The attack does not require invalid HTTP syntax or large payload bodies. A single header-sized request is sufficient to reach the vulnerable code path.

Mitigation

  • Update to a patched version of Rack in which encoding selection does not repeatedly rescan the parsed header for wildcard entries.
  • Avoid enabling Rack::Deflater on untrusted traffic.
  • Apply request filtering or header size / format restrictions at the reverse proxy or application boundary to limit abusive Accept-Encoding values.

Affected versions: ["3.2.5", "3.2.4", "3.2.3", "3.2.2", "3.2.1", "3.2.0", "3.1.20", "3.1.19", "3.1.18", "3.1.17", "3.1.16", "3.1.15", "3.1.14", "3.1.13", "3.1.12", "3.1.11", "3.1.10", "3.1.9", "3.1.8", "3.1.7", "3.1.6", "3.1.5", "3.1.4", "3.1.3", "3.1.2", "3.1.1", "3.1.0", "3.0.18", "3.0.17", "3.0.16", "3.0.15", "3.0.14", "3.0.13", "3.0.12", "3.0.11", "3.0.10", "3.0.9.1", "3.0.9", "3.0.8", "3.0.7", "3.0.6.1", "3.0.6", "3.0.5", "3.0.4.2", "3.0.4.1", "3.0.4", "3.0.3", "3.0.2", "3.0.1", "3.0.0", "3.0.0.rc1", "3.0.0.beta1", "2.2.22", "2.2.21", "2.2.20", "2.2.19", "2.2.18", "2.2.17", "2.2.16", "2.2.15", "2.2.14", "2.2.13", "2.2.12", "2.2.11", "2.2.10", "2.2.9", "2.2.8.1", "2.2.8", "2.2.7", "2.2.6.4", "2.2.6.3", "2.2.6.2", "2.2.6.1", "2.2.6", "2.2.5", "2.2.4", "2.2.3.1", "2.2.3", "2.2.2", "2.2.1", "2.2.0", "2.1.4.4", "2.1.4.3", "2.1.4.2", "2.1.4.1", "2.1.4", "2.1.3", "2.1.2", "2.1.1", "2.1.0", "2.0.9.4", "2.0.9.3", "2.0.9.2", "2.0.9.1", "2.0.9", "2.0.8", "2.0.7", "2.0.6", "2.0.5", "2.0.4", "2.0.3", "2.0.2", "2.0.1", "2.0.0.rc1", "2.0.0.alpha", "1.6.13", "1.6.12", "1.6.11", "1.6.10", "1.6.9", "1.6.8", "1.6.7", "1.6.6", "1.6.5", "1.6.4", "1.6.3", "1.6.2", "1.6.1", "1.6.0", "1.6.0.beta2", "1.6.0.beta", "1.5.5", "1.5.4", "1.5.3", "1.5.2", "1.5.1", "1.5.0", "1.5.0.beta.2", "1.5.0.beta.1", "1.4.7", "1.4.6", "1.4.5", "1.4.4", "1.4.3", "1.4.2", "1.4.1", "1.4.0", "1.3.10", "1.3.9", "1.3.8", "1.3.7", "1.3.6", "1.3.5", "1.3.4", "1.3.3", "1.3.2", "1.3.1", "1.3.0", "1.3.0.beta2", "1.3.0.beta", "1.2.8", "1.2.7", "1.2.6", "1.2.5", "1.2.4", "1.2.3", "1.2.2", "1.2.1", "1.2.0", "1.1.6", "1.1.5", "1.1.4", "1.1.3", "1.1.2", "1.1.1", "1.1.1.pre", "1.1.0", "1.0.1", "1.0.0", "0.9.1", "0.9.0", "0.4.0", "0.3.0", "0.2.0", "0.1.0"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Rack's greedy multipart boundary parsing can cause parser differentials and WAF bypass.

Published date: 2026-04-02T20:30:40Z
CVE: CVE-2026-26961
Links:

Summary

Rack::Multipart::Parser extracts the boundary parameter from multipart/form-data using a greedy regular expression. When a Content-Type header contains multiple boundary parameters, Rack selects the last one rather than the first.

In deployments where an upstream proxy, WAF, or intermediary interprets the first boundary parameter, this mismatch can allow an attacker to smuggle multipart content past upstream inspection and have Rack parse a different body structure than the intermediary validated.

Details

Rack identifies the multipart boundary using logic equivalent to:

MULTIPART = %r|\Amultipart/.*boundary=\"?([^\";,]+)\"?|ni

Because the expression is greedy, it matches the last boundary= parameter in a header such as:

Content-Type: multipart/form-data; boundary=safe; boundary=malicious

As a result, Rack parses the request body using malicious, while another component may interpret the same header using safe.

This creates an interpretation conflict. If an upstream WAF or proxy inspects multipart parts using the first boundary and Rack later parses the body using the last boundary, a client may be able to place malicious form fields or uploaded content in parts that Rack accepts but the upstream component did not inspect as intended.

This issue is most relevant in layered deployments where security decisions are made before the request reaches Rack.

Impact

Applications that accept multipart/form-data uploads behind an inspecting proxy or WAF may be affected.

In such deployments, an attacker may be able to bypass upstream filtering of uploaded files or form fields by sending a request with multiple boundary parameters and relying on the intermediary and Rack to parse the request differently.

The practical impact depends on deployment architecture. If no upstream component relies on a different multipart interpretation, this behavior may not provide meaningful additional attacker capability.

Mitigation

  • Update to a patched version of Rack that rejects ambiguous multipart Content-Type headers or parses duplicate boundary parameters consistently.
  • Reject requests containing multiple boundary parameters.
  • Normalize or regenerate multipart metadata at the trusted edge before forwarding requests to Rack.
  • Avoid relying on upstream inspection of malformed multipart requests unless duplicate parameter handling is explicitly consistent across components.

Affected versions: ["3.2.5", "3.2.4", "3.2.3", "3.2.2", "3.2.1", "3.2.0", "3.1.20", "3.1.19", "3.1.18", "3.1.17", "3.1.16", "3.1.15", "3.1.14", "3.1.13", "3.1.12", "3.1.11", "3.1.10", "3.1.9", "3.1.8", "3.1.7", "3.1.6", "3.1.5", "3.1.4", "3.1.3", "3.1.2", "3.1.1", "3.1.0", "3.0.18", "3.0.17", "3.0.16", "3.0.15", "3.0.14", "3.0.13", "3.0.12", "3.0.11", "3.0.10", "3.0.9.1", "3.0.9", "3.0.8", "3.0.7", "3.0.6.1", "3.0.6", "3.0.5", "3.0.4.2", "3.0.4.1", "3.0.4", "3.0.3", "3.0.2", "3.0.1", "3.0.0", "3.0.0.rc1", "3.0.0.beta1", "2.2.22", "2.2.21", "2.2.20", "2.2.19", "2.2.18", "2.2.17", "2.2.16", "2.2.15", "2.2.14", "2.2.13", "2.2.12", "2.2.11", "2.2.10", "2.2.9", "2.2.8.1", "2.2.8", "2.2.7", "2.2.6.4", "2.2.6.3", "2.2.6.2", "2.2.6.1", "2.2.6", "2.2.5", "2.2.4", "2.2.3.1", "2.2.3", "2.2.2", "2.2.1", "2.2.0", "2.1.4.4", "2.1.4.3", "2.1.4.2", "2.1.4.1", "2.1.4", "2.1.3", "2.1.2", "2.1.1", "2.1.0", "2.0.9.4", "2.0.9.3", "2.0.9.2", "2.0.9.1", "2.0.9", "2.0.8", "2.0.7", "2.0.6", "2.0.5", "2.0.4", "2.0.3", "2.0.2", "2.0.1", "2.0.0.rc1", "2.0.0.alpha", "1.6.13", "1.6.12", "1.6.11", "1.6.10", "1.6.9", "1.6.8", "1.6.7", "1.6.6", "1.6.5", "1.6.4", "1.6.3", "1.6.2", "1.6.1", "1.6.0", "1.6.0.beta2", "1.6.0.beta", "1.5.5", "1.5.4", "1.5.3", "1.5.2", "1.5.1", "1.5.0", "1.5.0.beta.2", "1.5.0.beta.1", "1.4.7", "1.4.6", "1.4.5", "1.4.4", "1.4.3", "1.4.2", "1.4.1", "1.4.0", "1.3.10", "1.3.9", "1.3.8", "1.3.7", "1.3.6", "1.3.5", "1.3.4", "1.3.3", "1.3.2", "1.3.1", "1.3.0", "1.3.0.beta2", "1.3.0.beta", "1.2.8", "1.2.7", "1.2.6", "1.2.5", "1.2.4", "1.2.3", "1.2.2", "1.2.1", "1.2.0", "1.1.6", "1.1.5", "1.1.4", "1.1.3", "1.1.2", "1.1.1", "1.1.1.pre", "1.1.0", "1.0.1", "1.0.0", "0.9.1", "0.9.0", "0.4.0", "0.3.0", "0.2.0", "0.1.0"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Rack session gets restored after deletion

Published date: 2025-05-08T14:45:18Z
CVE: CVE-2025-32441
Links:

Summary

When using the Rack::Session::Pool middleware, simultaneous rack requests can restore a deleted rack session, which allows the unauthenticated user to occupy that session.

Details

Rack session middleware prepares the session at the beginning of request, then saves is back to the store with possible changes applied by host rack application. This way the session becomes to be a subject of race conditions in general sense over concurrent rack requests.

Impact

When using the Rack::Session::Pool middleware, and provided the attacker can acquire a session cookie (already a major issue), the session may be restored if the attacker can trigger a long running request (within that same session) adjacent to the user logging out, in order to retain illicit access even after a user has attempted to logout.

Mitigation

  • Update to the latest version of rack, or
  • Ensure your application invalidates sessions atomically by marking them as logged out e.g., using a logged_out flag, instead of deleting them, and check this flag on every request to prevent reuse, or
  • Implement a custom session store that tracks session invalidation timestamps and refuses to accept session data if the session was invalidated after the request began.

Related

As this code was moved to rack-session in Rack 3+, see https://github.com/rack/rack-session/security/advisories/GHSA-9j94-67jr-4cqj for the equivalent advisory in rack-session (affecting Rack 3+ only).

Affected versions: ["2.2.13", "2.2.12", "2.2.11", "2.2.10", "2.2.9", "2.2.8.1", "2.2.8", "2.2.7", "2.2.6.4", "2.2.6.3", "2.2.6.2", "2.2.6.1", "2.2.6", "2.2.5", "2.2.4", "2.2.3.1", "2.2.3", "2.2.2", "2.2.1", "2.2.0", "2.1.4.4", "2.1.4.3", "2.1.4.2", "2.1.4.1", "2.1.4", "2.1.3", "2.1.2", "2.1.1", "2.1.0", "2.0.9.4", "2.0.9.3", "2.0.9.2", "2.0.9.1", "2.0.9", "2.0.8", "2.0.7", "2.0.6", "2.0.5", "2.0.4", "2.0.3", "2.0.2", "2.0.1", "2.0.0.rc1", "2.0.0.alpha", "1.6.13", "1.6.12", "1.6.11", "1.6.10", "1.6.9", "1.6.8", "1.6.7", "1.6.6", "1.6.5", "1.6.4", "1.6.3", "1.6.2", "1.6.1", "1.6.0", "1.6.0.beta2", "1.6.0.beta", "1.5.5", "1.5.4", "1.5.3", "1.5.2", "1.5.1", "1.5.0", "1.5.0.beta.2", "1.5.0.beta.1", "1.4.7", "1.4.6", "1.4.5", "1.4.4", "1.4.3", "1.4.2", "1.4.1", "1.4.0", "1.3.10", "1.3.9", "1.3.8", "1.3.7", "1.3.6", "1.3.5", "1.3.4", "1.3.3", "1.3.2", "1.3.1", "1.3.0", "1.3.0.beta2", "1.3.0.beta", "1.2.8", "1.2.7", "1.2.6", "1.2.5", "1.2.4", "1.2.3", "1.2.2", "1.2.1", "1.2.0", "1.1.6", "1.1.5", "1.1.4", "1.1.3", "1.1.2", "1.1.1", "1.1.1.pre", "1.1.0", "1.0.1", "1.0.0", "0.9.1", "0.9.0", "0.4.0", "0.3.0", "0.2.0", "0.1.0"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Rack: Multipart parser buffers large non‑file fields entirely in memory, enabling DoS (memory exhaustion)

Published date: 2025-10-07T17:27:07Z
CVE: CVE-2025-61771
Links:

Summary

Rack::Multipart::Parser stores non-file form fields (parts without a filename) entirely in memory as Ruby String objects. A single large text field in a multipart/form-data request (hundreds of megabytes or more) can consume equivalent process memory, potentially leading to out-of-memory (OOM) conditions and denial of service (DoS).

Details

During multipart parsing, file parts are streamed to temporary files, but non-file parts are buffered into memory:

body = String.new  # non-file → in-RAM buffer
@mime_parts[mime_index].body << content

There is no size limit on these in-memory buffers. As a result, any large text field—while technically valid—will be loaded fully into process memory before being added to params.

Impact

Attackers can send large non-file fields to trigger excessive memory usage. Impact scales with request size and concurrency, potentially leading to worker crashes or severe garbage-collection overhead. All Rack applications processing multipart form submissions are affected.

Mitigation

  • Upgrade: Use a patched version of Rack that enforces a reasonable size cap for non-file fields (e.g., 2 MiB).
  • Workarounds:
    • Restrict maximum request body size at the web-server or proxy layer (e.g., Nginx client_max_body_size).
    • Validate and reject unusually large form fields at the application level.

Affected versions: ["3.2.1", "3.2.0", "3.1.16", "3.1.15", "3.1.14", "3.1.13", "3.1.12", "3.1.11", "3.1.10", "3.1.9", "3.1.8", "3.1.7", "3.1.6", "3.1.5", "3.1.4", "3.1.3", "3.1.2", "3.1.1", "3.1.0", "2.2.18", "2.2.17", "2.2.16", "2.2.15", "2.2.14", "2.2.13", "2.2.12", "2.2.11", "2.2.10", "2.2.9", "2.2.8.1", "2.2.8", "2.2.7", "2.2.6.4", "2.2.6.3", "2.2.6.2", "2.2.6.1", "2.2.6", "2.2.5", "2.2.4", "2.2.3.1", "2.2.3", "2.2.2", "2.2.1", "2.2.0", "2.1.4.4", "2.1.4.3", "2.1.4.2", "2.1.4.1", "2.1.4", "2.1.3", "2.1.2", "2.1.1", "2.1.0", "2.0.9.4", "2.0.9.3", "2.0.9.2", "2.0.9.1", "2.0.9", "2.0.8", "2.0.7", "2.0.6", "2.0.5", "2.0.4", "2.0.3", "2.0.2", "2.0.1", "2.0.0.rc1", "2.0.0.alpha", "1.6.13", "1.6.12", "1.6.11", "1.6.10", "1.6.9", "1.6.8", "1.6.7", "1.6.6", "1.6.5", "1.6.4", "1.6.3", "1.6.2", "1.6.1", "1.6.0", "1.6.0.beta2", "1.6.0.beta", "1.5.5", "1.5.4", "1.5.3", "1.5.2", "1.5.1", "1.5.0", "1.5.0.beta.2", "1.5.0.beta.1", "1.4.7", "1.4.6", "1.4.5", "1.4.4", "1.4.3", "1.4.2", "1.4.1", "1.4.0", "1.3.10", "1.3.9", "1.3.8", "1.3.7", "1.3.6", "1.3.5", "1.3.4", "1.3.3", "1.3.2", "1.3.1", "1.3.0", "1.3.0.beta2", "1.3.0.beta", "1.2.8", "1.2.7", "1.2.6", "1.2.5", "1.2.4", "1.2.3", "1.2.2", "1.2.1", "1.2.0", "1.1.6", "1.1.5", "1.1.4", "1.1.3", "1.1.2", "1.1.1", "1.1.1.pre", "1.1.0", "1.0.1", "1.0.0", "0.9.1", "0.9.0", "0.4.0", "0.3.0", "0.2.0", "0.1.0"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Stored XSS in Rack::Directory via javascript: filenames rendered into anchor href

Published date: 2026-02-17T18:46:35Z
CVE: CVE-2026-25500
Links:

Summary

Rack::Directory generates an HTML directory index where each file entry is rendered as a clickable link. If a file exists on disk whose basename begins with the javascript: scheme (e.g. javascript:alert(1)), the generated index includes an anchor whose href attribute is exactly javascript:alert(1). Clicking this entry executes arbitrary JavaScript in the context of the hosting application.

This results in a client-side XSS condition in directory listings generated by Rack::Directory.

Details

Rack::Directory renders directory entries using an HTML row template similar to:

<a href='%s'>%s</a>

The %s placeholder is populated directly with the file’s basename. If the basename begins with javascript:, the resulting HTML contains an executable JavaScript URL:

<a href='javascript:alert(1)'>javascript:alert(1)</a>

Because the value is inserted directly into the href attribute without scheme validation or normalization, browsers interpret it as a JavaScript URI. When a user clicks the link, the JavaScript executes in the origin of the Rack application.

Impact

If Rack::Directory is used to expose filesystem contents over HTTP, an attacker who can create or upload files within that directory may introduce a malicious filename beginning with javascript:.

When a user visits the directory listing and clicks the entry, arbitrary JavaScript executes in the application's origin. Exploitation requires user interaction (clicking the malicious entry).

Mitigation

  • Update to a patched version of Rack in which Rack::Directory prefixes generated anchors with a relative path indicator (e.g. ./filename).
  • Avoid exposing user-controlled directories via Rack::Directory.
  • Apply a strict Content Security Policy (CSP) to reduce impact of potential client-side execution issues.
  • Where feasible, restrict or sanitize uploaded filenames to disallow dangerous URI scheme prefixes.

HackerOne profile: https://hackerone.com/thesmartshadow

GitHub account owner: Ali Firas (@thesmartshadow)

Affected versions: ["3.2.4", "3.2.3", "3.2.2", "3.2.1", "3.2.0", "3.1.19", "3.1.18", "3.1.17", "3.1.16", "3.1.15", "3.1.14", "3.1.13", "3.1.12", "3.1.11", "3.1.10", "3.1.9", "3.1.8", "3.1.7", "3.1.6", "3.1.5", "3.1.4", "3.1.3", "3.1.2", "3.1.1", "3.1.0", "3.0.18", "3.0.17", "3.0.16", "3.0.15", "3.0.14", "3.0.13", "3.0.12", "3.0.11", "3.0.10", "3.0.9.1", "3.0.9", "3.0.8", "3.0.7", "3.0.6.1", "3.0.6", "3.0.5", "3.0.4.2", "3.0.4.1", "3.0.4", "3.0.3", "3.0.2", "3.0.1", "3.0.0", "3.0.0.rc1", "3.0.0.beta1", "2.2.21", "2.2.20", "2.2.19", "2.2.18", "2.2.17", "2.2.16", "2.2.15", "2.2.14", "2.2.13", "2.2.12", "2.2.11", "2.2.10", "2.2.9", "2.2.8.1", "2.2.8", "2.2.7", "2.2.6.4", "2.2.6.3", "2.2.6.2", "2.2.6.1", "2.2.6", "2.2.5", "2.2.4", "2.2.3.1", "2.2.3", "2.2.2", "2.2.1", "2.2.0", "2.1.4.4", "2.1.4.3", "2.1.4.2", "2.1.4.1", "2.1.4", "2.1.3", "2.1.2", "2.1.1", "2.1.0", "2.0.9.4", "2.0.9.3", "2.0.9.2", "2.0.9.1", "2.0.9", "2.0.8", "2.0.7", "2.0.6", "2.0.5", "2.0.4", "2.0.3", "2.0.2", "2.0.1", "2.0.0.rc1", "2.0.0.alpha", "1.6.13", "1.6.12", "1.6.11", "1.6.10", "1.6.9", "1.6.8", "1.6.7", "1.6.6", "1.6.5", "1.6.4", "1.6.3", "1.6.2", "1.6.1", "1.6.0", "1.6.0.beta2", "1.6.0.beta", "1.5.5", "1.5.4", "1.5.3", "1.5.2", "1.5.1", "1.5.0", "1.5.0.beta.2", "1.5.0.beta.1", "1.4.7", "1.4.6", "1.4.5", "1.4.4", "1.4.3", "1.4.2", "1.4.1", "1.4.0", "1.3.10", "1.3.9", "1.3.8", "1.3.7", "1.3.6", "1.3.5", "1.3.4", "1.3.3", "1.3.2", "1.3.1", "1.3.0", "1.3.0.beta2", "1.3.0.beta", "1.2.8", "1.2.7", "1.2.6", "1.2.5", "1.2.4", "1.2.3", "1.2.2", "1.2.1", "1.2.0", "1.1.6", "1.1.5", "1.1.4", "1.1.3", "1.1.2", "1.1.1", "1.1.1.pre", "1.1.0", "1.0.1", "1.0.0", "0.9.1", "0.9.0", "0.4.0", "0.3.0", "0.2.0", "0.1.0"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Rack's multipart parser buffers unbounded per-part headers, enabling DoS (memory exhaustion)

Published date: 2025-10-07T17:28:06Z
CVE: CVE-2025-61772
Links:

Summary

Rack::Multipart::Parser can accumulate unbounded data when a multipart part’s header block never terminates with the required blank line (CRLFCRLF). The parser keeps appending incoming bytes to memory without a size cap, allowing a remote attacker to exhaust memory and cause a denial of service (DoS).

Details

While reading multipart headers, the parser waits for CRLFCRLF using:

@sbuf.scan_until(/(.*?\r\n)\r\n/m)

If the terminator never appears, it continues appending data (@sbuf.concat(content)) indefinitely. There is no limit on accumulated header bytes, so a single malformed part can consume memory proportional to the request body size.

Impact

Attackers can send incomplete multipart headers to trigger high memory use, leading to process termination (OOM) or severe slowdown. The effect scales with request size limits and concurrency. All applications handling multipart uploads may be affected.

Mitigation

  • Upgrade to a patched Rack version that caps per-part header size (e.g., 64 KiB).
  • Until then, restrict maximum request sizes at the proxy or web server layer (e.g., Nginx client_max_body_size).

Affected versions: ["3.2.1", "3.2.0", "3.1.16", "3.1.15", "3.1.14", "3.1.13", "3.1.12", "3.1.11", "3.1.10", "3.1.9", "3.1.8", "3.1.7", "3.1.6", "3.1.5", "3.1.4", "3.1.3", "3.1.2", "3.1.1", "3.1.0", "2.2.18", "2.2.17", "2.2.16", "2.2.15", "2.2.14", "2.2.13", "2.2.12", "2.2.11", "2.2.10", "2.2.9", "2.2.8.1", "2.2.8", "2.2.7", "2.2.6.4", "2.2.6.3", "2.2.6.2", "2.2.6.1", "2.2.6", "2.2.5", "2.2.4", "2.2.3.1", "2.2.3", "2.2.2", "2.2.1", "2.2.0", "2.1.4.4", "2.1.4.3", "2.1.4.2", "2.1.4.1", "2.1.4", "2.1.3", "2.1.2", "2.1.1", "2.1.0", "2.0.9.4", "2.0.9.3", "2.0.9.2", "2.0.9.1", "2.0.9", "2.0.8", "2.0.7", "2.0.6", "2.0.5", "2.0.4", "2.0.3", "2.0.2", "2.0.1", "2.0.0.rc1", "2.0.0.alpha", "1.6.13", "1.6.12", "1.6.11", "1.6.10", "1.6.9", "1.6.8", "1.6.7", "1.6.6", "1.6.5", "1.6.4", "1.6.3", "1.6.2", "1.6.1", "1.6.0", "1.6.0.beta2", "1.6.0.beta", "1.5.5", "1.5.4", "1.5.3", "1.5.2", "1.5.1", "1.5.0", "1.5.0.beta.2", "1.5.0.beta.1", "1.4.7", "1.4.6", "1.4.5", "1.4.4", "1.4.3", "1.4.2", "1.4.1", "1.4.0", "1.3.10", "1.3.9", "1.3.8", "1.3.7", "1.3.6", "1.3.5", "1.3.4", "1.3.3", "1.3.2", "1.3.1", "1.3.0", "1.3.0.beta2", "1.3.0.beta", "1.2.8", "1.2.7", "1.2.6", "1.2.5", "1.2.4", "1.2.3", "1.2.2", "1.2.1", "1.2.0", "1.1.6", "1.1.5", "1.1.4", "1.1.3", "1.1.2", "1.1.1", "1.1.1.pre", "1.1.0", "1.0.1", "1.0.0", "0.9.1", "0.9.0", "0.4.0", "0.3.0", "0.2.0", "0.1.0"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Possible shell escape sequence injection vulnerability in Rack

Published date: 2022-05-27T16:36:51Z
CVE: CVE-2022-30123
Links:

There is a possible shell escape sequence injection vulnerability in the Lint and CommonLogger components of Rack. This vulnerability has been assigned the CVE identifier CVE-2022-30123.

Versions Affected: All. Not affected: None Fixed Versions: 2.0.9.1, 2.1.4.1, 2.2.3.1

Impact

Carefully crafted requests can cause shell escape sequences to be written to the terminal via Rack's Lint middleware and CommonLogger middleware. These escape sequences can be leveraged to possibly execute commands in the victim's terminal.

Impacted applications will have either of these middleware installed, and vulnerable apps may have something like this:

use Rack::Lint

Or

use Rack::CommonLogger

All users running an affected release should either upgrade or use one of the workarounds immediately.

Workarounds

Remove these middleware from your application

Affected versions: ["2.2.3", "2.2.2", "2.2.1", "2.2.0", "2.1.4", "2.1.3", "2.1.2", "2.1.1", "2.1.0", "2.0.9", "2.0.8", "2.0.7", "2.0.6", "2.0.5", "2.0.4", "2.0.3", "2.0.2", "2.0.1", "2.0.0.rc1", "2.0.0.alpha", "1.6.13", "1.6.12", "1.6.11", "1.6.10", "1.6.9", "1.6.8", "1.6.7", "1.6.6", "1.6.5", "1.6.4", "1.6.3", "1.6.2", "1.6.1", "1.6.0", "1.6.0.beta2", "1.6.0.beta", "1.5.5", "1.5.4", "1.5.3", "1.5.2", "1.5.1", "1.5.0", "1.5.0.beta.2", "1.5.0.beta.1", "1.4.7", "1.4.6", "1.4.5", "1.4.4", "1.4.3", "1.4.2", "1.4.1", "1.4.0", "1.3.10", "1.3.9", "1.3.8", "1.3.7", "1.3.6", "1.3.5", "1.3.4", "1.3.3", "1.3.2", "1.3.1", "1.3.0", "1.3.0.beta2", "1.3.0.beta", "1.2.8", "1.2.7", "1.2.6", "1.2.5", "1.2.4", "1.2.3", "1.2.2", "1.2.1", "1.2.0", "1.1.6", "1.1.5", "1.1.4", "1.1.3", "1.1.2", "1.1.1", "1.1.1.pre", "1.1.0", "1.0.1", "1.0.0", "0.9.1", "0.9.0", "0.4.0", "0.3.0", "0.2.0", "0.1.0"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Rack's multipart byte range processing allows denial of service via excessive overlapping ranges

Published date: 2026-04-02T19:07:28Z
CVE: CVE-2026-34826
Links:

Summary

Rack::Utils.get_byte_ranges parses the HTTP Range header without limiting the number of individual byte ranges. Although the existing fix for CVE-2024-26141 rejects ranges whose total byte coverage exceeds the file size, it does not restrict the count of ranges. An attacker can supply many small overlapping ranges such as 0-0,0-0,0-0,... to trigger disproportionate CPU, memory, I/O, and bandwidth consumption per request.

This results in a denial of service condition in Rack file-serving paths that process multipart byte range responses.

Details

Rack::Utils.get_byte_ranges accepts a comma-separated list of byte ranges and validates them based on their aggregate size, but does not impose a limit on how many individual ranges may be supplied.

As a result, a request such as:

Range: bytes=0-0,0-0,0-0,0-0,...

can contain thousands of overlapping one-byte ranges while still satisfying the total-size check added for CVE-2024-26141.

When such a header is processed by Rack’s file-serving code, each range causes additional work, including multipart response generation, per-range iteration, file seek and read operations, and temporary string allocation for response size calculation and output. This allows a relatively small request header to trigger disproportionately expensive processing and a much larger multipart response.

The issue is distinct from CVE-2024-26141. That fix prevents range sets whose total byte coverage exceeds the file size, but does not prevent a large number of overlapping ranges whose summed size remains within that limit.

Impact

Applications that expose file-serving paths with byte range support may be vulnerable to denial of service.

An unauthenticated attacker can send crafted Range headers containing many small overlapping ranges to consume excessive CPU time, memory, file I/O, and bandwidth. Repeated requests may reduce application availability and increase pressure on workers and garbage collection.

Mitigation

  • Update to a patched version of Rack that limits the number of accepted byte ranges.
  • Reject or normalize multipart byte range requests containing excessive range counts.
  • Consider disabling multipart range support where it is not required.
  • Apply request filtering or header restrictions at the reverse proxy or application boundary to limit abusive Range headers.

Affected versions: ["3.2.5", "3.2.4", "3.2.3", "3.2.2", "3.2.1", "3.2.0", "3.1.20", "3.1.19", "3.1.18", "3.1.17", "3.1.16", "3.1.15", "3.1.14", "3.1.13", "3.1.12", "3.1.11", "3.1.10", "3.1.9", "3.1.8", "3.1.7", "3.1.6", "3.1.5", "3.1.4", "3.1.3", "3.1.2", "3.1.1", "3.1.0", "3.0.18", "3.0.17", "3.0.16", "3.0.15", "3.0.14", "3.0.13", "3.0.12", "3.0.11", "3.0.10", "3.0.9.1", "3.0.9", "3.0.8", "3.0.7", "3.0.6.1", "3.0.6", "3.0.5", "3.0.4.2", "3.0.4.1", "3.0.4", "3.0.3", "3.0.2", "3.0.1", "3.0.0", "3.0.0.rc1", "3.0.0.beta1", "2.2.22", "2.2.21", "2.2.20", "2.2.19", "2.2.18", "2.2.17", "2.2.16", "2.2.15", "2.2.14", "2.2.13", "2.2.12", "2.2.11", "2.2.10", "2.2.9", "2.2.8.1", "2.2.8", "2.2.7", "2.2.6.4", "2.2.6.3", "2.2.6.2", "2.2.6.1", "2.2.6", "2.2.5", "2.2.4", "2.2.3.1", "2.2.3", "2.2.2", "2.2.1", "2.2.0", "2.1.4.4", "2.1.4.3", "2.1.4.2", "2.1.4.1", "2.1.4", "2.1.3", "2.1.2", "2.1.1", "2.1.0", "2.0.9.4", "2.0.9.3", "2.0.9.2", "2.0.9.1", "2.0.9", "2.0.8", "2.0.7", "2.0.6", "2.0.5", "2.0.4", "2.0.3", "2.0.2", "2.0.1", "2.0.0.rc1", "2.0.0.alpha", "1.6.13", "1.6.12", "1.6.11", "1.6.10", "1.6.9", "1.6.8", "1.6.7", "1.6.6", "1.6.5", "1.6.4", "1.6.3", "1.6.2", "1.6.1", "1.6.0", "1.6.0.beta2", "1.6.0.beta", "1.5.5", "1.5.4", "1.5.3", "1.5.2", "1.5.1", "1.5.0", "1.5.0.beta.2", "1.5.0.beta.1", "1.4.7", "1.4.6", "1.4.5", "1.4.4", "1.4.3", "1.4.2", "1.4.1", "1.4.0", "1.3.10", "1.3.9", "1.3.8", "1.3.7", "1.3.6", "1.3.5", "1.3.4", "1.3.3", "1.3.2", "1.3.1", "1.3.0", "1.3.0.beta2", "1.3.0.beta", "1.2.8", "1.2.7", "1.2.6", "1.2.5", "1.2.4", "1.2.3", "1.2.2", "1.2.1", "1.2.0", "1.1.6", "1.1.5", "1.1.4", "1.1.3", "1.1.2", "1.1.1", "1.1.1.pre", "1.1.0", "1.0.1", "1.0.0", "0.9.1", "0.9.0", "0.4.0", "0.3.0", "0.2.0", "0.1.0"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Rack has possible DoS Vulnerability with Range Header

Published date: 2024-02-28T22:57:12Z
CVE: CVE-2024-26141
Links:

Possible DoS Vulnerability with Range Header in Rack

There is a possible DoS vulnerability relating to the Range request header in Rack. This vulnerability has been assigned the CVE identifier CVE-2024-26141.

Versions Affected: >= 1.3.0. Not affected: < 1.3.0 Fixed Versions: 3.0.9.1, 2.2.8.1

Impact

Carefully crafted Range headers can cause a server to respond with an unexpectedly large response. Responding with such large responses could lead to a denial of service issue.

Vulnerable applications will use the Rack::File middleware or the Rack::Utils.byte_ranges methods (this includes Rails applications).

Releases

The fixed releases are available at the normal locations.

Workarounds

There are no feasible workarounds for this issue.

Patches

To aid users who aren't able to upgrade immediately we have provided patches for the two supported release series. They are in git-am format and consist of a single changeset.

  • 3-0-range.patch - Patch for 3.0 series
  • 2-2-range.patch - Patch for 2.2 series

Credits

Thank you ooooooo_q for the report and patch

Affected versions: ["2.2.8", "2.2.7", "2.2.6.4", "2.2.6.3", "2.2.6.2", "2.2.6.1", "2.2.6", "2.2.5", "2.2.4", "2.2.3.1", "2.2.3", "2.2.2", "2.2.1", "2.2.0", "2.1.4.4", "2.1.4.3", "2.1.4.2", "2.1.4.1", "2.1.4", "2.1.3", "2.1.2", "2.1.1", "2.1.0", "2.0.9.4", "2.0.9.3", "2.0.9.2", "2.0.9.1", "2.0.9", "2.0.8", "2.0.7", "2.0.6", "2.0.5", "2.0.4", "2.0.3", "2.0.2", "2.0.1", "2.0.0.rc1", "2.0.0.alpha", "1.6.13", "1.6.12", "1.6.11", "1.6.10", "1.6.9", "1.6.8", "1.6.7", "1.6.6", "1.6.5", "1.6.4", "1.6.3", "1.6.2", "1.6.1", "1.6.0", "1.6.0.beta2", "1.6.0.beta", "1.5.5", "1.5.4", "1.5.3", "1.5.2", "1.5.1", "1.5.0", "1.5.0.beta.2", "1.5.0.beta.1", "1.4.7", "1.4.6", "1.4.5", "1.4.4", "1.4.3", "1.4.2", "1.4.1", "1.4.0", "1.3.10", "1.3.9", "1.3.8", "1.3.7", "1.3.6", "1.3.5", "1.3.4", "1.3.3", "1.3.2", "1.3.1", "1.3.0", "3.0.9", "3.0.8", "3.0.7", "3.0.6.1", "3.0.6", "3.0.5", "3.0.4.2", "3.0.4.1", "3.0.4", "3.0.3", "3.0.2", "3.0.1", "3.0.0"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Potential Denial of Service Vulnerability in Rack

Published date: 2015-06-16
CVE: 2015-3225
Links:

Carefully crafted requests can cause a SystemStackError and potentially cause a denial of service attack.

All users running an affected release should upgrade.

Affected versions: ["1.3.4", "1.1.0", "0.4.0", "1.3.10", "1.3.3", "1.2.5", "1.2.0", "1.1.6", "1.6.1", "1.3.5", "1.3.2", "1.3.0", "1.2.6", "1.2.3", "1.2.1", "1.1.4", "1.1.3", "0.1.0", "1.3.9", "1.3.0.beta2", "1.1.2", "1.0.1", "1.6.0.beta", "1.3.7", "1.3.0.beta", "1.2.7", "1.1.1", "0.9.1", "1.3.1", "1.1.5", "0.9.0", "1.6.0", "1.1.1.pre", "1.0.0", "0.2.0", "1.6.0.beta2", "1.3.8", "1.3.6", "1.2.8", "1.2.4", "1.2.2", "0.3.0"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Directory traversal in Rack::Directory app bundled with Rack

Published date: 2020-05-12
CVE: 2020-8161
CVSS V3: 8.6
Links:

There was a possible directory traversal vulnerability in the Rack::Directory app that is bundled with Rack.

Versions Affected: rack < 2.2.0 Not affected: Applications that do not use Rack::Directory. Fixed Versions: 2.1.3, >= 2.2.0

Impact

If certain directories exist in a director that is managed by Rack::Directory, an attacker could, using this vulnerability, read the contents of files on the server that were outside of the root specified in the Rack::Directory initializer.

Workarounds

Until such time as the patch is applied or their Rack version is upgraded, we recommend that developers do not use Rack::Directory in their applications.

Affected versions: ["2.0.3", "1.6.7", "1.4.6", "1.3.4", "1.1.0", "0.4.0", "2.0.8", "2.0.5", "2.0.1", "1.4.4", "1.4.1", "1.3.10", "1.3.3", "1.2.5", "1.2.0", "1.1.6", "2.0.4", "1.6.11", "1.6.5", "1.6.1", "1.5.3", "1.5.1", "1.5.0.beta.2", "1.3.5", "1.3.2", "1.3.0", "1.2.6", "1.2.3", "1.2.1", "1.1.4", "1.1.3", "0.1.0", "1.6.13", "1.6.12", "1.4.7", "1.4.5", "1.3.9", "1.3.0.beta2", "1.1.2", "1.0.1", "2.0.9", "2.0.2", "1.6.0.beta", "1.5.5", "1.5.0.beta.1", "1.4.3", "1.3.7", "1.3.0.beta", "1.2.7", "1.1.1", "0.9.1", "2.0.0.rc1", "1.6.8", "1.6.3", "1.5.0", "1.3.1", "1.1.5", "0.9.0", "2.0.7", "2.0.6", "1.6.6", "1.6.4", "1.6.0", "1.4.2", "1.1.1.pre", "1.0.0", "0.2.0", "2.0.0.alpha", "1.6.10", "1.6.9", "1.6.2", "1.6.0.beta2", "1.5.4", "1.5.2", "1.4.0", "1.3.8", "1.3.6", "1.2.8", "1.2.4", "1.2.2", "0.3.0", "2.0.9.1", "2.0.9.2", "2.0.9.3", "2.0.9.4"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Percent-encoded cookies can be used to overwrite existing prefixed cookie names

Published date: 2020-06-15
CVE: 2020-8184
CVSS V3: 7.5
Links:

It is possible to forge a secure or host-only cookie prefix in Rack using an arbitrary cookie write by using URL encoding (percent-encoding) on the name of the cookie. This could result in an application that is dependent on this prefix to determine if a cookie is safe to process being manipulated into processing an insecure or cross-origin request. This vulnerability has been assigned the CVE identifier CVE-2020-8184.

Versions Affected: rack < 2.2.3, rack < 2.1.4 Not affected: Applications which do not rely on _Host- and _Secure- prefixes to determine if a cookie is safe to process Fixed Versions: rack >= 2.2.3, rack >= 2.1.4

Impact

An attacker may be able to trick a vulnerable application into processing an insecure (non-SSL) or cross-origin request if they can gain the ability to write arbitrary cookies that are sent to the application.

Workarounds

If your application is impacted but you cannot upgrade to the released versions or apply the provided patch, this issue can be temporarily addressed by adding the following workaround:

module Rack
  module Utils
    module_function def parse_cookies_header(header)
      return {} unless header
      header.split(/[;] */n).each_with_object({}) do |cookie, cookies|
        next if cookie.empty?
        key, value = cookie.split('=', 2)
        cookies[key] = (unescape(value) rescue value) unless cookies.key?(key)
      end
    end
  end
end

Affected versions: ["2.2.0", "2.0.3", "1.6.7", "1.4.6", "1.3.4", "1.1.0", "0.4.0", "2.0.8", "2.0.5", "2.0.1", "1.4.4", "1.4.1", "1.3.10", "1.3.3", "1.2.5", "1.2.0", "1.1.6", "2.2.2", "2.0.4", "1.6.11", "1.6.5", "1.6.1", "1.5.3", "1.5.1", "1.5.0.beta.2", "1.3.5", "1.3.2", "1.3.0", "1.2.6", "1.2.3", "1.2.1", "1.1.4", "1.1.3", "0.1.0", "1.6.13", "1.6.12", "1.4.7", "1.4.5", "1.3.9", "1.3.0.beta2", "1.1.2", "1.0.1", "2.2.1", "2.0.9", "2.0.2", "1.6.0.beta", "1.5.5", "1.5.0.beta.1", "1.4.3", "1.3.7", "1.3.0.beta", "1.2.7", "1.1.1", "0.9.1", "2.0.0.rc1", "1.6.8", "1.6.3", "1.5.0", "1.3.1", "1.1.5", "0.9.0", "2.0.7", "2.0.6", "1.6.6", "1.6.4", "1.6.0", "1.4.2", "1.1.1.pre", "1.0.0", "0.2.0", "2.0.0.alpha", "1.6.10", "1.6.9", "1.6.2", "1.6.0.beta2", "1.5.4", "1.5.2", "1.4.0", "1.3.8", "1.3.6", "1.2.8", "1.2.4", "1.2.2", "0.3.0", "2.0.9.1", "2.0.9.2", "2.0.9.3", "2.0.9.4"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Denial of Service Vulnerability in Rack Multipart Parsing

Published date: 2022-06-27
CVE: 2022-30122
CVSS V3: 7.5
Links:

There is a possible denial of service vulnerability in the multipart parsing component of Rack. This vulnerability has been assigned the CVE identifier CVE-2022-30122.

Versions Affected: >= 1.2 Not affected: < 1.2 Fixed Versions: 2.0.9.1, 2.1.4.1, 2.2.3.1

Impact

Carefully crafted multipart POST requests can cause Rack's multipart parser to take much longer than expected, leading to a possible denial of service vulnerability.

Impacted code will use Rack's multipart parser to parse multipart posts. This includes directly using the multipart parser like this:

params = Rack::Multipart.parse_multipart(env)

But it also includes reading POST data from a Rack request object like this:

p request.POST # read POST data
p request.params # reads both query params and POST data

All users running an affected release should either upgrade or use one of the workarounds immediately.

Workarounds

There are no feasible workarounds for this issue.

Affected versions: ["2.2.0", "2.0.3", "1.6.7", "1.4.6", "1.3.4", "2.1.2", "2.0.8", "2.0.5", "2.0.1", "1.4.4", "1.4.1", "1.3.10", "1.3.3", "1.2.5", "1.2.0", "2.2.2", "2.1.1", "2.0.4", "1.6.11", "1.6.5", "1.6.1", "1.5.3", "1.5.1", "1.5.0.beta.2", "1.3.5", "1.3.2", "1.3.0", "1.2.6", "1.2.3", "1.2.1", "1.6.13", "1.6.12", "1.4.7", "1.4.5", "1.3.9", "1.3.0.beta2", "2.2.1", "2.0.9", "2.0.2", "1.6.0.beta", "1.5.5", "1.5.0.beta.1", "1.4.3", "1.3.7", "1.3.0.beta", "1.2.7", "2.1.4", "2.1.3", "2.0.0.rc1", "1.6.8", "1.6.3", "1.5.0", "1.3.1", "2.2.3", "2.0.7", "2.0.6", "1.6.6", "1.6.4", "1.6.0", "1.4.2", "2.1.0", "2.0.0.alpha", "1.6.10", "1.6.9", "1.6.2", "1.6.0.beta2", "1.5.4", "1.5.2", "1.4.0", "1.3.8", "1.3.6", "1.2.8", "1.2.4", "1.2.2"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Possible shell escape sequence injection vulnerability in Rack

Published date: 2022-06-27
CVE: 2022-30123
CVSS V3: 10.0
Links:

There is a possible shell escape sequence injection vulnerability in the Lint and CommonLogger components of Rack. This vulnerability has been assigned the CVE identifier CVE-2022-30123.

Versions Affected: All. Not affected: None Fixed Versions: 2.0.9.1, 2.1.4.1, 2.2.3.1

Impact

Carefully crafted requests can cause shell escape sequences to be written to the terminal via Rack's Lint middleware and CommonLogger middleware. These escape sequences can be leveraged to possibly execute commands in the victim's terminal.

Impacted applications will have either of these middleware installed, and vulnerable apps may have something like this:

use Rack::Lint

Or

use Rack::CommonLogger

All users running an affected release should either upgrade or use one of the workarounds immediately.

Workarounds

Remove these middleware from your application

Affected versions: ["2.2.0", "2.0.3", "1.6.7", "1.4.6", "1.3.4", "1.1.0", "0.4.0", "2.1.2", "2.0.8", "2.0.5", "2.0.1", "1.4.4", "1.4.1", "1.3.10", "1.3.3", "1.2.5", "1.2.0", "1.1.6", "2.2.2", "2.1.1", "2.0.4", "1.6.11", "1.6.5", "1.6.1", "1.5.3", "1.5.1", "1.5.0.beta.2", "1.3.5", "1.3.2", "1.3.0", "1.2.6", "1.2.3", "1.2.1", "1.1.4", "1.1.3", "0.1.0", "1.6.13", "1.6.12", "1.4.7", "1.4.5", "1.3.9", "1.3.0.beta2", "1.1.2", "1.0.1", "2.2.1", "2.0.9", "2.0.2", "1.6.0.beta", "1.5.5", "1.5.0.beta.1", "1.4.3", "1.3.7", "1.3.0.beta", "1.2.7", "1.1.1", "0.9.1", "2.1.4", "2.1.3", "2.0.0.rc1", "1.6.8", "1.6.3", "1.5.0", "1.3.1", "1.1.5", "0.9.0", "2.2.3", "2.0.7", "2.0.6", "1.6.6", "1.6.4", "1.6.0", "1.4.2", "1.1.1.pre", "1.0.0", "0.2.0", "2.1.0", "2.0.0.alpha", "1.6.10", "1.6.9", "1.6.2", "1.6.0.beta2", "1.5.4", "1.5.2", "1.4.0", "1.3.8", "1.3.6", "1.2.8", "1.2.4", "1.2.2", "0.3.0"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Denial of service via header parsing in Rack

Published date: 2023-01-18
CVE: 2022-44570
CVSS V3: 7.5
Links:

There is a possible denial of service vulnerability in the Range header parsing component of Rack. This vulnerability has been assigned the CVE identifier CVE-2022-44570.

Versions Affected: >= 1.5.0 Not affected: None. Fixed Versions: 2.0.9.2, 2.1.4.2, 2.2.6.2, 3.0.4.1

Impact

Carefully crafted input can cause the Range header parsing component in Rack to take an unexpected amount of time, possibly resulting in a denial of service attack vector. Any applications that deal with Range requests (such as streaming applications, or applications that serve files) may be impacted.

Workarounds

There are no feasible workarounds for this issue.

Affected versions: ["2.2.0", "2.0.3", "1.6.7", "1.4.6", "1.3.4", "1.1.0", "0.4.0", "2.1.2", "2.0.8", "2.0.5", "2.0.1", "1.4.4", "1.4.1", "1.3.10", "1.3.3", "1.2.5", "1.2.0", "1.1.6", "2.2.2", "2.1.1", "2.0.4", "1.6.11", "1.6.5", "1.6.1", "1.5.3", "1.5.1", "1.5.0.beta.2", "1.3.5", "1.3.2", "1.3.0", "1.2.6", "1.2.3", "1.2.1", "1.1.4", "1.1.3", "0.1.0", "1.6.13", "1.6.12", "1.4.7", "1.4.5", "1.3.9", "1.3.0.beta2", "1.1.2", "1.0.1", "2.2.1", "2.0.9", "2.0.2", "1.6.0.beta", "1.5.5", "1.5.0.beta.1", "1.4.3", "1.3.7", "1.3.0.beta", "1.2.7", "1.1.1", "0.9.1", "2.1.4", "2.1.3", "2.0.0.rc1", "1.6.8", "1.6.3", "1.5.0", "1.3.1", "1.1.5", "0.9.0", "2.2.3", "2.0.7", "2.0.6", "1.6.6", "1.6.4", "1.6.0", "1.4.2", "1.1.1.pre", "1.0.0", "0.2.0", "2.1.0", "2.0.0.alpha", "1.6.10", "1.6.9", "1.6.2", "1.6.0.beta2", "1.5.4", "1.5.2", "1.4.0", "1.3.8", "1.3.6", "1.2.8", "1.2.4", "1.2.2", "0.3.0", "2.2.3.1", "2.1.4.1", "2.0.9.1", "2.2.4", "3.0.0.beta1", "3.0.0.rc1", "3.0.0", "3.0.1", "3.0.2", "2.2.5", "3.0.3", "2.2.6", "3.0.4", "2.2.6.1"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Denial of Service Vulnerability in Rack Content-Disposition parsing

Published date: 2023-01-18
CVE: 2022-44571
Links:

There is a denial of service vulnerability in the Content-Disposition parsing component of Rack. This vulnerability has been assigned the CVE identifier CVE-2022-44571.

Versions Affected: >= 2.0.0 Not affected: None. Fixed Versions: 2.0.9.2, 2.1.4.2, 2.2.6.1, 3.0.4.1

Impact

Carefully crafted input can cause Content-Disposition header parsing in Rack to take an unexpected amount of time, possibly resulting in a denial of service attack vector. This header is used typically used in multipart parsing. Any applications that parse multipart posts using Rack (virtually all Rails applications) are impacted.

Workarounds

There are no feasible workarounds for this issue.

Affected versions: ["2.2.0", "2.0.3", "1.6.7", "1.4.6", "1.3.4", "1.1.0", "0.4.0", "2.1.2", "2.0.8", "2.0.5", "2.0.1", "1.4.4", "1.4.1", "1.3.10", "1.3.3", "1.2.5", "1.2.0", "1.1.6", "2.2.2", "2.1.1", "2.0.4", "1.6.11", "1.6.5", "1.6.1", "1.5.3", "1.5.1", "1.5.0.beta.2", "1.3.5", "1.3.2", "1.3.0", "1.2.6", "1.2.3", "1.2.1", "1.1.4", "1.1.3", "0.1.0", "1.6.13", "1.6.12", "1.4.7", "1.4.5", "1.3.9", "1.3.0.beta2", "1.1.2", "1.0.1", "2.2.1", "2.0.9", "2.0.2", "1.6.0.beta", "1.5.5", "1.5.0.beta.1", "1.4.3", "1.3.7", "1.3.0.beta", "1.2.7", "1.1.1", "0.9.1", "2.1.4", "2.1.3", "2.0.0.rc1", "1.6.8", "1.6.3", "1.5.0", "1.3.1", "1.1.5", "0.9.0", "2.2.3", "2.0.7", "2.0.6", "1.6.6", "1.6.4", "1.6.0", "1.4.2", "1.1.1.pre", "1.0.0", "0.2.0", "2.1.0", "2.0.0.alpha", "1.6.10", "1.6.9", "1.6.2", "1.6.0.beta2", "1.5.4", "1.5.2", "1.4.0", "1.3.8", "1.3.6", "1.2.8", "1.2.4", "1.2.2", "0.3.0", "2.2.3.1", "2.1.4.1", "2.0.9.1", "2.2.4", "3.0.0.beta1", "3.0.0.rc1", "3.0.0", "3.0.1", "3.0.2", "2.2.5", "3.0.3", "2.2.6", "3.0.4"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Denial of service via multipart parsing in Rack

Published date: 2023-01-18
CVE: 2022-44572
Links:

There is a denial of service vulnerability in the multipart parsing component of Rack. This vulnerability has been assigned the CVE identifier CVE-2022-44572.

Versions Affected: >= 2.0.0 Not affected: None. Fixed Versions: 2.0.9.2, 2.1.4.2, 2.2.6.1, 3.0.4.1

Impact

Carefully crafted input can cause RFC2183 multipart boundary parsing in Rack to take an unexpected amount of time, possibly resulting in a denial of service attack vector. Any applications that parse multipart posts using Rack (virtually all Rails applications) are impacted.

Workarounds

There are no feasible workarounds for this issue.

Affected versions: ["2.2.0", "2.0.3", "1.6.7", "1.4.6", "1.3.4", "1.1.0", "0.4.0", "2.1.2", "2.0.8", "2.0.5", "2.0.1", "1.4.4", "1.4.1", "1.3.10", "1.3.3", "1.2.5", "1.2.0", "1.1.6", "2.2.2", "2.1.1", "2.0.4", "1.6.11", "1.6.5", "1.6.1", "1.5.3", "1.5.1", "1.5.0.beta.2", "1.3.5", "1.3.2", "1.3.0", "1.2.6", "1.2.3", "1.2.1", "1.1.4", "1.1.3", "0.1.0", "1.6.13", "1.6.12", "1.4.7", "1.4.5", "1.3.9", "1.3.0.beta2", "1.1.2", "1.0.1", "2.2.1", "2.0.9", "2.0.2", "1.6.0.beta", "1.5.5", "1.5.0.beta.1", "1.4.3", "1.3.7", "1.3.0.beta", "1.2.7", "1.1.1", "0.9.1", "2.1.4", "2.1.3", "2.0.0.rc1", "1.6.8", "1.6.3", "1.5.0", "1.3.1", "1.1.5", "0.9.0", "2.2.3", "2.0.7", "2.0.6", "1.6.6", "1.6.4", "1.6.0", "1.4.2", "1.1.1.pre", "1.0.0", "0.2.0", "2.1.0", "2.0.0.alpha", "1.6.10", "1.6.9", "1.6.2", "1.6.0.beta2", "1.5.4", "1.5.2", "1.4.0", "1.3.8", "1.3.6", "1.2.8", "1.2.4", "1.2.2", "0.3.0", "2.2.3.1", "2.1.4.1", "2.0.9.1", "2.2.4", "3.0.0.beta1", "3.0.0.rc1", "3.0.0", "3.0.1", "3.0.2", "2.2.5", "3.0.3", "2.2.6", "3.0.4"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Possible DoS Vulnerability in Multipart MIME parsing

Published date: 2023-03-03
CVE: 2023-27530
CVSS V3: 7.5
Links:

There is a possible DoS vulnerability in the Multipart MIME parsing code in Rack. This vulnerability has been assigned the CVE identifier CVE-2023-27530.

Versions Affected: All. Not affected: None Fixed Versions: 3.0.4.2, 2.2.6.3, 2.1.4.3, 2.0.9.3

Impact

The Multipart MIME parsing code in Rack limits the number of file parts, but does not limit the total number of parts that can be uploaded. Carefully crafted requests can abuse this and cause multipart parsing to take longer than expected.

All users running an affected release should either upgrade or use one of the workarounds immediately.

Workarounds

A proxy can be configured to limit the POST body size which will mitigate this issue.

Affected versions: ["2.2.0", "2.0.3", "1.6.7", "1.4.6", "1.3.4", "1.1.0", "0.4.0", "2.1.2", "2.0.8", "2.0.5", "2.0.1", "1.4.4", "1.4.1", "1.3.10", "1.3.3", "1.2.5", "1.2.0", "1.1.6", "2.2.2", "2.1.1", "2.0.4", "1.6.11", "1.6.5", "1.6.1", "1.5.3", "1.5.1", "1.5.0.beta.2", "1.3.5", "1.3.2", "1.3.0", "1.2.6", "1.2.3", "1.2.1", "1.1.4", "1.1.3", "0.1.0", "1.6.13", "1.6.12", "1.4.7", "1.4.5", "1.3.9", "1.3.0.beta2", "1.1.2", "1.0.1", "2.2.1", "2.0.9", "2.0.2", "1.6.0.beta", "1.5.5", "1.5.0.beta.1", "1.4.3", "1.3.7", "1.3.0.beta", "1.2.7", "1.1.1", "0.9.1", "2.1.4", "2.1.3", "2.0.0.rc1", "1.6.8", "1.6.3", "1.5.0", "1.3.1", "1.1.5", "0.9.0", "2.2.3", "2.0.7", "2.0.6", "1.6.6", "1.6.4", "1.6.0", "1.4.2", "1.1.1.pre", "1.0.0", "0.2.0", "2.1.0", "2.0.0.alpha", "1.6.10", "1.6.9", "1.6.2", "1.6.0.beta2", "1.5.4", "1.5.2", "1.4.0", "1.3.8", "1.3.6", "1.2.8", "1.2.4", "1.2.2", "0.3.0", "2.2.3.1", "2.1.4.1", "2.0.9.1", "2.2.4", "3.0.0.beta1", "3.0.0.rc1", "3.0.0", "3.0.1", "3.0.2", "2.2.5", "3.0.3", "2.2.6", "3.0.4", "2.1.4.2", "2.0.9.2", "2.2.6.2", "2.2.6.1", "3.0.4.1"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Possible Denial of Service Vulnerability in Rack’s header parsing

Published date: 2023-03-13
CVE: 2023-27539
Links:

There is a denial of service vulnerability in the header parsing component of Rack. This vulnerability has been assigned the CVE identifier CVE-2023-27539.

Versions Affected: >= 2.0.0 Not affected: None. Fixed Versions: 2.2.6.4, 3.0.6.1

Impact

Carefully crafted input can cause header parsing in Rack to take an unexpected amount of time, possibly resulting in a denial of service attack vector. Any applications that parse headers using Rack (virtually all Rails applications) are impacted.

Workarounds

Setting Regexp.timeout in Ruby 3.2 is a possible workaround.

Affected versions: ["2.2.0", "2.0.3", "1.6.7", "1.4.6", "1.3.4", "1.1.0", "0.4.0", "2.1.2", "2.0.8", "2.0.5", "2.0.1", "1.4.4", "1.4.1", "1.3.10", "1.3.3", "1.2.5", "1.2.0", "1.1.6", "2.2.2", "2.1.1", "2.0.4", "1.6.11", "1.6.5", "1.6.1", "1.5.3", "1.5.1", "1.5.0.beta.2", "1.3.5", "1.3.2", "1.3.0", "1.2.6", "1.2.3", "1.2.1", "1.1.4", "1.1.3", "0.1.0", "1.6.13", "1.6.12", "1.4.7", "1.4.5", "1.3.9", "1.3.0.beta2", "1.1.2", "1.0.1", "2.2.1", "2.0.9", "2.0.2", "1.6.0.beta", "1.5.5", "1.5.0.beta.1", "1.4.3", "1.3.7", "1.3.0.beta", "1.2.7", "1.1.1", "0.9.1", "2.1.4", "2.1.3", "2.0.0.rc1", "1.6.8", "1.6.3", "1.5.0", "1.3.1", "1.1.5", "0.9.0", "2.2.3", "2.0.7", "2.0.6", "1.6.6", "1.6.4", "1.6.0", "1.4.2", "1.1.1.pre", "1.0.0", "0.2.0", "2.1.0", "2.0.0.alpha", "1.6.10", "1.6.9", "1.6.2", "1.6.0.beta2", "1.5.4", "1.5.2", "1.4.0", "1.3.8", "1.3.6", "1.2.8", "1.2.4", "1.2.2", "0.3.0", "2.2.3.1", "2.1.4.1", "2.0.9.1", "2.2.4", "3.0.0.beta1", "3.0.0.rc1", "3.0.0", "3.0.1", "3.0.2", "2.2.5", "3.0.3", "2.2.6", "3.0.4", "2.1.4.2", "2.0.9.2", "2.2.6.2", "2.2.6.1", "3.0.4.1", "2.2.6.3", "2.1.4.3", "3.0.4.2", "2.0.9.3", "3.0.5", "3.0.6", "2.1.4.4", "2.0.9.4"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Denial of Service Vulnerability in Rack Content-Type Parsing

Published date: 2024-02-21
CVE: 2024-25126
CVSS V3: 5.3
Links:

There is a possible denial of service vulnerability in the content type parsing component of Rack. This vulnerability has been assigned the CVE identifier CVE-2024-25126.

Versions Affected: >= 0.4 Not affected: < 0.4 Fixed Versions: 3.0.9.1, 2.2.8.1

Impact

Carefully crafted content type headers can cause Rack’s media type parser to take much longer than expected, leading to a possible denial of service vulnerability.

Impacted code will use Rack’s media type parser to parse content type headers. This code will look like below:

request.media_type

## OR
request.media_type_params

## OR
Rack::MediaType.type(content_type)

Some frameworks (including Rails) call this code internally, so upgrading is recommended!

All users running an affected release should either upgrade or use one of the workarounds immediately.

Releases

The fixed releases are available at the normal locations.

Workarounds

There are no feasible workarounds for this issue.

Affected versions: ["2.2.0", "2.0.3", "1.6.7", "1.4.6", "1.3.4", "1.1.0", "0.4.0", "2.1.2", "2.0.8", "2.0.5", "2.0.1", "1.4.4", "1.4.1", "1.3.10", "1.3.3", "1.2.5", "1.2.0", "1.1.6", "2.2.2", "2.1.1", "2.0.4", "1.6.11", "1.6.5", "1.6.1", "1.5.3", "1.5.1", "1.5.0.beta.2", "1.3.5", "1.3.2", "1.3.0", "1.2.6", "1.2.3", "1.2.1", "1.1.4", "1.1.3", "1.6.13", "1.6.12", "1.4.7", "1.4.5", "1.3.9", "1.3.0.beta2", "1.1.2", "1.0.1", "2.2.1", "2.0.9", "2.0.2", "1.6.0.beta", "1.5.5", "1.5.0.beta.1", "1.4.3", "1.3.7", "1.3.0.beta", "1.2.7", "1.1.1", "0.9.1", "2.1.4", "2.1.3", "2.0.0.rc1", "1.6.8", "1.6.3", "1.5.0", "1.3.1", "1.1.5", "0.9.0", "2.2.3", "2.0.7", "2.0.6", "1.6.6", "1.6.4", "1.6.0", "1.4.2", "1.1.1.pre", "1.0.0", "2.1.0", "2.0.0.alpha", "1.6.10", "1.6.9", "1.6.2", "1.6.0.beta2", "1.5.4", "1.5.2", "1.4.0", "1.3.8", "1.3.6", "1.2.8", "1.2.4", "1.2.2", "2.2.3.1", "2.1.4.1", "2.0.9.1", "2.2.4", "3.0.0.beta1", "3.0.0.rc1", "3.0.0", "3.0.1", "3.0.2", "2.2.5", "3.0.3", "2.2.6", "3.0.4", "2.1.4.2", "2.0.9.2", "2.2.6.2", "2.2.6.1", "3.0.4.1", "2.2.6.3", "2.1.4.3", "3.0.4.2", "2.0.9.3", "3.0.5", "3.0.6.1", "2.2.6.4", "3.0.6", "3.0.7", "2.2.7", "3.0.8", "2.2.8", "3.0.9", "2.1.4.4", "2.0.9.4"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Possible DoS Vulnerability with Range Header in Rack

Published date: 2024-02-21
CVE: 2024-26141
Links:

There is a possible DoS vulnerability relating to the Range request header in Rack. This vulnerability has been assigned the CVE identifier CVE-2024-26141.

Versions Affected: >= 1.3.0. Not affected: < 1.3.0 Fixed Versions: 3.0.9.1, 2.2.8.1

Impact

Carefully crafted Range headers can cause a server to respond with an unexpectedly large response. Responding with such large responses could lead to a denial of service issue.

Vulnerable applications will use the Rack::File middleware or the Rack::Utils.byte_ranges methods (this includes Rails applications).

Releases

The fixed releases are available at the normal locations.

Workarounds

There are no feasible workarounds for this issue.

Affected versions: ["2.2.0", "2.0.3", "1.6.7", "1.4.6", "1.3.4", "2.1.2", "2.0.8", "2.0.5", "2.0.1", "1.4.4", "1.4.1", "1.3.10", "1.3.3", "2.2.2", "2.1.1", "2.0.4", "1.6.11", "1.6.5", "1.6.1", "1.5.3", "1.5.1", "1.5.0.beta.2", "1.3.5", "1.3.2", "1.3.0", "1.6.13", "1.6.12", "1.4.7", "1.4.5", "1.3.9", "2.2.1", "2.0.9", "2.0.2", "1.6.0.beta", "1.5.5", "1.5.0.beta.1", "1.4.3", "1.3.7", "2.1.4", "2.1.3", "2.0.0.rc1", "1.6.8", "1.6.3", "1.5.0", "1.3.1", "2.2.3", "2.0.7", "2.0.6", "1.6.6", "1.6.4", "1.6.0", "1.4.2", "2.1.0", "2.0.0.alpha", "1.6.10", "1.6.9", "1.6.2", "1.6.0.beta2", "1.5.4", "1.5.2", "1.4.0", "1.3.8", "1.3.6", "2.2.3.1", "2.1.4.1", "2.0.9.1", "2.2.4", "3.0.0.beta1", "3.0.0.rc1", "3.0.0", "3.0.1", "3.0.2", "2.2.5", "3.0.3", "2.2.6", "3.0.4", "2.1.4.2", "2.0.9.2", "2.2.6.2", "2.2.6.1", "3.0.4.1", "2.2.6.3", "2.1.4.3", "3.0.4.2", "2.0.9.3", "3.0.5", "3.0.6.1", "2.2.6.4", "3.0.6", "3.0.7", "2.2.7", "3.0.8", "2.2.8", "3.0.9", "2.1.4.4", "2.0.9.4"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Possible Denial of Service Vulnerability in Rack Header Parsing

Published date: 2024-02-21
CVE: 2024-26146
Links:

There is a possible denial of service vulnerability in the header parsing routines in Rack. This vulnerability has been assigned the CVE identifier CVE-2024-26146.

Versions Affected: All. Not affected: None Fixed Versions: 2.0.9.4, 2.1.4.4, 2.2.8.1, 3.0.9.1

Impact

Carefully crafted headers can cause header parsing in Rack to take longer than expected resulting in a possible denial of service issue. Accept and Forwarded headers are impacted.

Ruby 3.2 has mitigations for this problem, so Rack applications using Ruby 3.2 or newer are unaffected.

Releases

The fixed releases are available at the normal locations.

Workarounds

There are no feasible workarounds for this issue.

Affected versions: ["2.2.0", "2.0.3", "1.6.7", "1.4.6", "1.3.4", "1.1.0", "0.4.0", "2.1.2", "2.0.8", "2.0.5", "2.0.1", "1.4.4", "1.4.1", "1.3.10", "1.3.3", "1.2.5", "1.2.0", "1.1.6", "2.2.2", "2.1.1", "2.0.4", "1.6.11", "1.6.5", "1.6.1", "1.5.3", "1.5.1", "1.5.0.beta.2", "1.3.5", "1.3.2", "1.3.0", "1.2.6", "1.2.3", "1.2.1", "1.1.4", "1.1.3", "0.1.0", "1.6.13", "1.6.12", "1.4.7", "1.4.5", "1.3.9", "1.3.0.beta2", "1.1.2", "1.0.1", "2.2.1", "2.0.9", "2.0.2", "1.6.0.beta", "1.5.5", "1.5.0.beta.1", "1.4.3", "1.3.7", "1.3.0.beta", "1.2.7", "1.1.1", "0.9.1", "2.1.4", "2.1.3", "2.0.0.rc1", "1.6.8", "1.6.3", "1.5.0", "1.3.1", "1.1.5", "0.9.0", "2.2.3", "2.0.7", "2.0.6", "1.6.6", "1.6.4", "1.6.0", "1.4.2", "1.1.1.pre", "1.0.0", "0.2.0", "2.1.0", "2.0.0.alpha", "1.6.10", "1.6.9", "1.6.2", "1.6.0.beta2", "1.5.4", "1.5.2", "1.4.0", "1.3.8", "1.3.6", "1.2.8", "1.2.4", "1.2.2", "0.3.0", "2.2.3.1", "2.1.4.1", "2.0.9.1", "2.2.4", "3.0.0.beta1", "3.0.0.rc1", "3.0.0", "3.0.1", "3.0.2", "2.2.5", "3.0.3", "2.2.6", "3.0.4", "2.1.4.2", "2.0.9.2", "2.2.6.2", "2.2.6.1", "3.0.4.1", "2.2.6.3", "2.1.4.3", "3.0.4.2", "2.0.9.3", "3.0.5", "3.0.6.1", "2.2.6.4", "3.0.6", "3.0.7", "2.2.7", "3.0.8", "2.2.8", "3.0.9"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Possible Log Injection in Rack::CommonLogger

Published date: 2025-02-12
CVE: 2025-25184
CVSS V3: 6.5
Links:

Summary

Rack::CommonLogger can be exploited by crafting input that includes newline characters to manipulate log entries. The supplied proof-of-concept demonstrates injecting malicious content into logs.

Details

When a user provides the authorization credentials via Rack::Auth::Basic, if success, the username will be put in env['REMOTE_USER'] and later be used by Rack::CommonLogger for logging purposes.

The issue occurs when a server intentionally or unintentionally allows a user creation with the username contain CRLF and white space characters, or the server just want to log every login attempts. If an attacker enters a username with CRLF character, the logger will log the malicious username with CRLF characters into the logfile.

Impact

Attackers can break log formats or insert fraudulent entries, potentially obscuring real activity or injecting malicious data into log files.

Mitigation

  • Update to the latest version of Rack.

Affected versions: ["2.0.3", "1.6.7", "1.4.6", "1.3.4", "1.1.0", "0.4.0", "2.1.2", "2.0.8", "2.0.5", "2.0.1", "1.4.4", "1.4.1", "1.3.10", "1.3.3", "1.2.5", "1.2.0", "1.1.6", "2.1.1", "2.0.4", "1.6.11", "1.6.5", "1.6.1", "1.5.3", "1.5.1", "1.5.0.beta.2", "1.3.5", "1.3.2", "1.3.0", "1.2.6", "1.2.3", "1.2.1", "1.1.4", "1.1.3", "0.1.0", "1.6.13", "1.6.12", "1.4.7", "1.4.5", "1.3.9", "1.3.0.beta2", "1.1.2", "1.0.1", "2.0.9", "2.0.2", "1.6.0.beta", "1.5.5", "1.5.0.beta.1", "1.4.3", "1.3.7", "1.3.0.beta", "1.2.7", "1.1.1", "0.9.1", "2.1.4", "2.1.3", "2.0.0.rc1", "1.6.8", "1.6.3", "1.5.0", "1.3.1", "1.1.5", "0.9.0", "2.0.7", "2.0.6", "1.6.6", "1.6.4", "1.6.0", "1.4.2", "1.1.1.pre", "1.0.0", "0.2.0", "2.1.0", "2.0.0.alpha", "1.6.10", "1.6.9", "1.6.2", "1.6.0.beta2", "1.5.4", "1.5.2", "1.4.0", "1.3.8", "1.3.6", "1.2.8", "1.2.4", "1.2.2", "0.3.0", "2.1.4.1", "2.0.9.1", "2.1.4.2", "2.0.9.2", "2.1.4.3", "2.0.9.3", "2.1.4.4", "2.0.9.4", "3.1.2", "3.1.0", "3.1.1", "3.1.3", "3.1.4", "3.1.6", "3.1.5", "3.1.7", "3.1.8", "3.1.9"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Escape Sequence Injection vulnerability in Rack lead to Possible Log Injection

Published date: 2025-03-04
CVE: 2025-27111
Links:

Summary

Rack::Sendfile can be exploited by crafting input that includes newline characters to manipulate log entries.

Details

The Rack::Sendfile middleware logs unsanitized header values from the X-Sendfile-Type header. An attacker can exploit this by injecting escape sequences (such as newline characters) into the header, resulting in log injection.

Impact

This vulnerability can distort log files, obscure attack traces, and complicate security auditing.

Mitigation

  • Update to the latest version of Rack, or
  • Remove usage of Rack::Sendfile.

Affected versions: ["2.0.3", "1.6.7", "1.4.6", "1.3.4", "1.1.0", "0.4.0", "2.1.2", "2.0.8", "2.0.5", "2.0.1", "1.4.4", "1.4.1", "1.3.10", "1.3.3", "1.2.5", "1.2.0", "1.1.6", "2.1.1", "2.0.4", "1.6.11", "1.6.5", "1.6.1", "1.5.3", "1.5.1", "1.5.0.beta.2", "1.3.5", "1.3.2", "1.3.0", "1.2.6", "1.2.3", "1.2.1", "1.1.4", "1.1.3", "0.1.0", "1.6.13", "1.6.12", "1.4.7", "1.4.5", "1.3.9", "1.3.0.beta2", "1.1.2", "1.0.1", "2.0.9", "2.0.2", "1.6.0.beta", "1.5.5", "1.5.0.beta.1", "1.4.3", "1.3.7", "1.3.0.beta", "1.2.7", "1.1.1", "0.9.1", "2.1.4", "2.1.3", "2.0.0.rc1", "1.6.8", "1.6.3", "1.5.0", "1.3.1", "1.1.5", "0.9.0", "2.0.7", "2.0.6", "1.6.6", "1.6.4", "1.6.0", "1.4.2", "1.1.1.pre", "1.0.0", "0.2.0", "2.1.0", "2.0.0.alpha", "1.6.10", "1.6.9", "1.6.2", "1.6.0.beta2", "1.5.4", "1.5.2", "1.4.0", "1.3.8", "1.3.6", "1.2.8", "1.2.4", "1.2.2", "0.3.0", "2.1.4.1", "2.0.9.1", "2.1.4.2", "2.0.9.2", "2.1.4.3", "2.0.9.3", "2.1.4.4", "2.0.9.4", "3.1.2", "3.1.0", "3.1.1", "3.1.3", "3.1.4", "3.1.6", "3.1.5", "3.1.7", "3.1.8", "3.1.9", "3.1.10"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Local File Inclusion in Rack::Static

Published date: 2025-03-10
CVE: 2025-27610
CVSS V3: 7.5
Links:

Summary

Rack::Static can serve files under the specified root: even if urls: are provided, which may expose other files under the specified root: unexpectedly.

Details

The vulnerability occurs because Rack::Static does not properly sanitize user-supplied paths before serving files. Specifically, encoded path traversal sequences are not correctly validated, allowing attackers to access files outside the designated static file directory.

Impact

By exploiting this vulnerability, an attacker can gain access to all files under the specified root: directory, provided they are able to determine then path of the file.

Mitigation

  • Update to the latest version of Rack, or
  • Remove usage of Rack::Static, or
  • Ensure that root: points at a directory path which only contains files which should be accessed publicly.

It is likely that a CDN or similar static file server would also mitigate the issue.

Affected versions: ["2.0.3", "1.6.7", "1.4.6", "1.3.4", "1.1.0", "0.4.0", "2.1.2", "2.0.8", "2.0.5", "2.0.1", "1.4.4", "1.4.1", "1.3.10", "1.3.3", "1.2.5", "1.2.0", "1.1.6", "2.1.1", "2.0.4", "1.6.11", "1.6.5", "1.6.1", "1.5.3", "1.5.1", "1.5.0.beta.2", "1.3.5", "1.3.2", "1.3.0", "1.2.6", "1.2.3", "1.2.1", "1.1.4", "1.1.3", "0.1.0", "1.6.13", "1.6.12", "1.4.7", "1.4.5", "1.3.9", "1.3.0.beta2", "1.1.2", "1.0.1", "2.0.9", "2.0.2", "1.6.0.beta", "1.5.5", "1.5.0.beta.1", "1.4.3", "1.3.7", "1.3.0.beta", "1.2.7", "1.1.1", "0.9.1", "2.1.4", "2.1.3", "2.0.0.rc1", "1.6.8", "1.6.3", "1.5.0", "1.3.1", "1.1.5", "0.9.0", "2.0.7", "2.0.6", "1.6.6", "1.6.4", "1.6.0", "1.4.2", "1.1.1.pre", "1.0.0", "0.2.0", "2.1.0", "2.0.0.alpha", "1.6.10", "1.6.9", "1.6.2", "1.6.0.beta2", "1.5.4", "1.5.2", "1.4.0", "1.3.8", "1.3.6", "1.2.8", "1.2.4", "1.2.2", "0.3.0", "2.1.4.1", "2.0.9.1", "2.1.4.2", "2.0.9.2", "2.1.4.3", "2.0.9.3", "2.1.4.4", "2.0.9.4", "3.1.2", "3.1.0", "3.1.1", "3.1.3", "3.1.4", "3.1.6", "3.1.5", "3.1.7", "3.1.8", "3.1.9", "3.1.10", "3.1.11"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Rack session gets restored after deletion

Published date: 2025-05-08
CVE: 2025-32441
CVSS V3: 4.2
Links:

Summary

When using the Rack::Session::Pool middleware, simultaneous rack requests can restore a deleted rack session, which allows the unauthenticated user to occupy that session.

Details

Rack session middleware prepares the session at the beginning of request, then saves is back to the store with possible changes applied by host rack application. This way the session becomes to be a subject of race conditions in general sense over concurrent rack requests.

Impact

When using the Rack::Session::Pool middleware, and provided the attacker can acquire a session cookie (already a major issue), the session may be restored if the attacker can trigger a long running request (within that same session) adjacent to the user logging out, in order to retain illicit access even after a user has attempted to logout.

Mitigation

  • Update to the latest version of rack, or
  • Ensure your application invalidates sessions atomically by marking them as logged out e.g., using a logged_out flag, instead of deleting them, and check this flag on every request to prevent reuse, or
  • Implement a custom session store that tracks session invalidation timestamps and refuses to accept session data if the session was invalidated after the request began.

Related

As this code was moved to rack-session in Rack 3+, see https://github.com/rack/rack-session/security/advisories/GHSA-9j94-67jr-4cqj for the equivalent advisory in rack-session (affecting Rack 3+ only).

Affected versions: ["2.2.0", "2.0.3", "1.6.7", "1.4.6", "1.3.4", "1.1.0", "0.4.0", "2.1.2", "2.0.8", "2.0.5", "2.0.1", "1.4.4", "1.4.1", "1.3.10", "1.3.3", "1.2.5", "1.2.0", "1.1.6", "2.2.2", "2.1.1", "2.0.4", "1.6.11", "1.6.5", "1.6.1", "1.5.3", "1.5.1", "1.5.0.beta.2", "1.3.5", "1.3.2", "1.3.0", "1.2.6", "1.2.3", "1.2.1", "1.1.4", "1.1.3", "0.1.0", "1.6.13", "1.6.12", "1.4.7", "1.4.5", "1.3.9", "1.3.0.beta2", "1.1.2", "1.0.1", "2.2.1", "2.0.9", "2.0.2", "1.6.0.beta", "1.5.5", "1.5.0.beta.1", "1.4.3", "1.3.7", "1.3.0.beta", "1.2.7", "1.1.1", "0.9.1", "2.1.4", "2.1.3", "2.0.0.rc1", "1.6.8", "1.6.3", "1.5.0", "1.3.1", "1.1.5", "0.9.0", "2.2.3", "2.0.7", "2.0.6", "1.6.6", "1.6.4", "1.6.0", "1.4.2", "1.1.1.pre", "1.0.0", "0.2.0", "2.1.0", "2.0.0.alpha", "1.6.10", "1.6.9", "1.6.2", "1.6.0.beta2", "1.5.4", "1.5.2", "1.4.0", "1.3.8", "1.3.6", "1.2.8", "1.2.4", "1.2.2", "0.3.0", "2.2.3.1", "2.1.4.1", "2.0.9.1", "2.2.4", "2.2.5", "2.2.6", "2.1.4.2", "2.0.9.2", "2.2.6.2", "2.2.6.1", "2.2.6.3", "2.1.4.3", "2.0.9.3", "2.2.6.4", "2.2.7", "2.2.8", "2.2.8.1", "2.1.4.4", "2.0.9.4", "2.2.9", "2.2.10", "2.2.11", "2.2.12", "2.2.13"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Rack has an Unbounded-Parameter DoS in Rack::QueryParser

Published date: 2025-05-08
CVE: 2025-46727
CVSS V3: 7.5
Links:

Summary

Rack::QueryParser parses query strings and application/x-www-form-urlencoded bodies into Ruby data structures without imposing any limit on the number of parameters, allowing attackers to send requests with extremely large numbers of parameters.

Details

The vulnerability arises because Rack::QueryParser iterates over each &-separated key-value pair and adds it to a Hash without enforcing an upper bound on the total number of parameters. This allows an attacker to send a single request containing hundreds of thousands (or more) of parameters, which consumes excessive memory and CPU during parsing.

Impact

An attacker can trigger denial of service by sending specifically crafted HTTP requests, which can cause memory exhaustion or pin CPU resources, stalling or crashing the Rack server. This results in full service disruption until the affected worker is restarted.

Mitigation

  • Update to a version of Rack that limits the number of parameters parsed, or
  • Use middleware to enforce a maximum query string size or parameter count, or
  • Employ a reverse proxy (such as Nginx) to limit request sizes and reject oversized query strings or bodies.

Limiting request body sizes and query string lengths at the web server or CDN level is an effective mitigation.

Affected versions: ["2.0.3", "1.6.7", "1.4.6", "1.3.4", "1.1.0", "0.4.0", "2.1.2", "2.0.8", "2.0.5", "2.0.1", "1.4.4", "1.4.1", "1.3.10", "1.3.3", "1.2.5", "1.2.0", "1.1.6", "2.1.1", "2.0.4", "1.6.11", "1.6.5", "1.6.1", "1.5.3", "1.5.1", "1.5.0.beta.2", "1.3.5", "1.3.2", "1.3.0", "1.2.6", "1.2.3", "1.2.1", "1.1.4", "1.1.3", "0.1.0", "1.6.13", "1.6.12", "1.4.7", "1.4.5", "1.3.9", "1.3.0.beta2", "1.1.2", "1.0.1", "2.0.9", "2.0.2", "1.6.0.beta", "1.5.5", "1.5.0.beta.1", "1.4.3", "1.3.7", "1.3.0.beta", "1.2.7", "1.1.1", "0.9.1", "2.1.4", "2.1.3", "2.0.0.rc1", "1.6.8", "1.6.3", "1.5.0", "1.3.1", "1.1.5", "0.9.0", "2.0.7", "2.0.6", "1.6.6", "1.6.4", "1.6.0", "1.4.2", "1.1.1.pre", "1.0.0", "0.2.0", "2.1.0", "2.0.0.alpha", "1.6.10", "1.6.9", "1.6.2", "1.6.0.beta2", "1.5.4", "1.5.2", "1.4.0", "1.3.8", "1.3.6", "1.2.8", "1.2.4", "1.2.2", "0.3.0", "2.1.4.1", "2.0.9.1", "2.1.4.2", "2.0.9.2", "2.1.4.3", "2.0.9.3", "2.1.4.4", "2.0.9.4", "3.1.2", "3.1.0", "3.1.1", "3.1.3", "3.1.4", "3.1.6", "3.1.5", "3.1.7", "3.1.8", "3.1.9", "3.1.10", "3.1.11", "3.1.12", "3.1.13"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Rack has an unsafe default in Rack::QueryParser allows params_limit bypass via semicolon-separated parameters

Published date: 2025-09-25
CVE: 2025-59830
CVSS V3: 7.5
Links:

Summary

Rack::QueryParser in version < 2.2.18 enforces its params_limit only for parameters separated by &, while still splitting on both & and ;. As a result, attackers could use ; separators to bypass the parameter count limit and submit more parameters than intended.

Details

The issue arises because Rack::QueryParser#check_query_string counts only & characters when determining the number of parameters, but the default separator regex DEFAULT_SEP = /[&;] */n splits on both & and ;. This mismatch means that queries using ; separators were not included in the parameter count, allowing params_limit to be bypassed.

Other safeguards (bytesize_limit and key_space_limit) still applied, but did not prevent this particular bypass.

Impact

Applications or middleware that directly invoke Rack::QueryParser with its default configuration (no explicit delimiter) could be exposed to increased CPU and memory consumption. This can be abused as a limited denial-of-service vector.

Rack::Request, the primary entry point for typical Rack applications, uses QueryParser in a safe way and does not appear vulnerable by default. As such, the severity is considered low, with the impact limited to edge cases where QueryParser is used directly.

Mitigation

  • Upgrade to a patched version of Rack where both & and ; are counted consistently toward params_limit.
  • If upgrading is not immediately possible, configure QueryParser with an explicit delimiter (e.g., &) to avoid the mismatch.
  • As a general precaution, enforce query string and request size limits at the web server or proxy layer (e.g., Nginx, Apache, or a CDN) to mitigate excessive parsing overhead.

Affected versions: ["2.2.0", "2.0.3", "1.6.7", "1.4.6", "1.3.4", "1.1.0", "0.4.0", "2.1.2", "2.0.8", "2.0.5", "2.0.1", "1.4.4", "1.4.1", "1.3.10", "1.3.3", "1.2.5", "1.2.0", "1.1.6", "2.2.2", "2.1.1", "2.0.4", "1.6.11", "1.6.5", "1.6.1", "1.5.3", "1.5.1", "1.5.0.beta.2", "1.3.5", "1.3.2", "1.3.0", "1.2.6", "1.2.3", "1.2.1", "1.1.4", "1.1.3", "0.1.0", "1.6.13", "1.6.12", "1.4.7", "1.4.5", "1.3.9", "1.3.0.beta2", "1.1.2", "1.0.1", "2.2.1", "2.0.9", "2.0.2", "1.6.0.beta", "1.5.5", "1.5.0.beta.1", "1.4.3", "1.3.7", "1.3.0.beta", "1.2.7", "1.1.1", "0.9.1", "2.1.4", "2.1.3", "2.0.0.rc1", "1.6.8", "1.6.3", "1.5.0", "1.3.1", "1.1.5", "0.9.0", "2.2.3", "2.0.7", "2.0.6", "1.6.6", "1.6.4", "1.6.0", "1.4.2", "1.1.1.pre", "1.0.0", "0.2.0", "2.1.0", "2.0.0.alpha", "1.6.10", "1.6.9", "1.6.2", "1.6.0.beta2", "1.5.4", "1.5.2", "1.4.0", "1.3.8", "1.3.6", "1.2.8", "1.2.4", "1.2.2", "0.3.0", "2.2.3.1", "2.1.4.1", "2.0.9.1", "2.2.4", "2.2.5", "2.2.6", "2.1.4.2", "2.0.9.2", "2.2.6.2", "2.2.6.1", "2.2.6.3", "2.1.4.3", "2.0.9.3", "2.2.6.4", "2.2.7", "2.2.8", "2.2.8.1", "2.1.4.4", "2.0.9.4", "2.2.9", "2.2.10", "2.2.11", "2.2.12", "2.2.13", "2.2.14", "2.2.15", "2.2.16", "2.2.17"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Rack's unbounded multipart preamble buffering enables DoS (memory exhaustion)

Published date: 2025-10-07
CVE: 2025-61770
CVSS V3: 7.5
Links:

Summary

Rack::Multipart::Parser buffers the entire multipart preamble (bytes before the first boundary) in memory without any size limit. A client can send a large preamble followed by a valid boundary, causing significant memory use and potential process termination due to out-of-memory (OOM) conditions.

Details

While searching for the first boundary, the parser appends incoming data into a shared buffer (@sbuf.concat(content)) and scans for the boundary pattern:

@sbuf.scan_until(@body_regex)

If the boundary is not yet found, the parser continues buffering data indefinitely. There is no trimming or size cap on the preamble, allowing attackers to send arbitrary amounts of data before the first boundary.

Impact

Remote attackers can trigger large transient memory spikes by including a long preamble in multipart/form-data requests. The impact scales with allowed request sizes and concurrency, potentially causing worker crashes or severe slowdown due to garbage collection.

Mitigation

  • Upgrade: Use a patched version of Rack that enforces a preamble size limit (e.g., 16 KiB) or discards preamble data entirely per RFC 2046 § 5.1.1.

  • Workarounds:

    • Limit total request body size at the proxy or web server level.
    • Monitor memory and set per-process limits to prevent OOM conditions.

Affected versions: ["2.0.3", "1.6.7", "1.4.6", "1.3.4", "1.1.0", "0.4.0", "2.1.2", "2.0.8", "2.0.5", "2.0.1", "1.4.4", "1.4.1", "1.3.10", "1.3.3", "1.2.5", "1.2.0", "1.1.6", "2.1.1", "2.0.4", "1.6.11", "1.6.5", "1.6.1", "1.5.3", "1.5.1", "1.5.0.beta.2", "1.3.5", "1.3.2", "1.3.0", "1.2.6", "1.2.3", "1.2.1", "1.1.4", "1.1.3", "0.1.0", "1.6.13", "1.6.12", "1.4.7", "1.4.5", "1.3.9", "1.3.0.beta2", "1.1.2", "1.0.1", "2.0.9", "2.0.2", "1.6.0.beta", "1.5.5", "1.5.0.beta.1", "1.4.3", "1.3.7", "1.3.0.beta", "1.2.7", "1.1.1", "0.9.1", "2.1.4", "2.1.3", "2.0.0.rc1", "1.6.8", "1.6.3", "1.5.0", "1.3.1", "1.1.5", "0.9.0", "2.0.7", "2.0.6", "1.6.6", "1.6.4", "1.6.0", "1.4.2", "1.1.1.pre", "1.0.0", "0.2.0", "2.1.0", "2.0.0.alpha", "1.6.10", "1.6.9", "1.6.2", "1.6.0.beta2", "1.5.4", "1.5.2", "1.4.0", "1.3.8", "1.3.6", "1.2.8", "1.2.4", "1.2.2", "0.3.0", "2.1.4.1", "2.0.9.1", "3.0.0.beta1", "3.0.0.rc1", "3.0.0", "3.0.1", "3.0.2", "3.0.3", "3.0.4", "2.1.4.2", "2.0.9.2", "3.0.4.1", "2.1.4.3", "3.0.4.2", "2.0.9.3", "3.0.5", "3.0.6.1", "3.0.6", "3.0.7", "3.0.8", "3.0.9", "2.1.4.4", "3.0.9.1", "2.0.9.4", "3.0.10", "3.0.11", "3.0.12", "3.0.13", "3.0.14", "3.0.15", "3.0.16", "3.0.17", "3.0.18", "3.2.0", "3.2.1"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Multipart parser buffers large non‑file fields entirely in memory, enabling DoS (memory exhaustion)

Published date: 2025-10-07
CVE: 2025-61771
CVSS V3: 7.5
Links:

Summary

Rack::Multipart::Parser stores non-file form fields (parts without a filename) entirely in memory as Ruby String objects. A single large text field in a multipart/form-data request (hundreds of megabytes or more) can consume equivalent process memory, potentially leading to out-of-memory (OOM) conditions and denial of service (DoS).

Details

During multipart parsing, file parts are streamed to temporary files, but non-file parts are buffered into memory:

body = String.new  # non-file → in-RAM buffer
@mime_parts[mime_index].body << content

There is no size limit on these in-memory buffers. As a result, any large text field—while technically valid—will be loaded fully into process memory before being added to params.

Impact

Attackers can send large non-file fields to trigger excessive memory usage. Impact scales with request size and concurrency, potentially leading to worker crashes or severe garbage-collection overhead. All Rack applications processing multipart form submissions are affected.

Mitigation

  • Upgrade: Use a patched version of Rack that enforces a reasonable size cap for non-file fields (e.g., 2 MiB).

  • Workarounds:

    • Restrict maximum request body size at the web-server or proxy layer (e.g., Nginx client_max_body_size).
    • Validate and reject unusually large form fields at the application level.

Affected versions: ["2.0.3", "1.6.7", "1.4.6", "1.3.4", "1.1.0", "0.4.0", "2.1.2", "2.0.8", "2.0.5", "2.0.1", "1.4.4", "1.4.1", "1.3.10", "1.3.3", "1.2.5", "1.2.0", "1.1.6", "2.1.1", "2.0.4", "1.6.11", "1.6.5", "1.6.1", "1.5.3", "1.5.1", "1.5.0.beta.2", "1.3.5", "1.3.2", "1.3.0", "1.2.6", "1.2.3", "1.2.1", "1.1.4", "1.1.3", "0.1.0", "1.6.13", "1.6.12", "1.4.7", "1.4.5", "1.3.9", "1.3.0.beta2", "1.1.2", "1.0.1", "2.0.9", "2.0.2", "1.6.0.beta", "1.5.5", "1.5.0.beta.1", "1.4.3", "1.3.7", "1.3.0.beta", "1.2.7", "1.1.1", "0.9.1", "2.1.4", "2.1.3", "2.0.0.rc1", "1.6.8", "1.6.3", "1.5.0", "1.3.1", "1.1.5", "0.9.0", "2.0.7", "2.0.6", "1.6.6", "1.6.4", "1.6.0", "1.4.2", "1.1.1.pre", "1.0.0", "0.2.0", "2.1.0", "2.0.0.alpha", "1.6.10", "1.6.9", "1.6.2", "1.6.0.beta2", "1.5.4", "1.5.2", "1.4.0", "1.3.8", "1.3.6", "1.2.8", "1.2.4", "1.2.2", "0.3.0", "2.1.4.1", "2.0.9.1", "3.0.0.beta1", "3.0.0.rc1", "3.0.0", "3.0.1", "3.0.2", "3.0.3", "3.0.4", "2.1.4.2", "2.0.9.2", "3.0.4.1", "2.1.4.3", "3.0.4.2", "2.0.9.3", "3.0.5", "3.0.6.1", "3.0.6", "3.0.7", "3.0.8", "3.0.9", "2.1.4.4", "3.0.9.1", "2.0.9.4", "3.0.10", "3.0.11", "3.0.12", "3.0.13", "3.0.14", "3.0.15", "3.0.16", "3.0.17", "3.0.18", "3.2.0", "3.2.1"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Rack's multipart parser buffers unbounded per-part headers, enabling DoS (memory exhaustion)

Published date: 2025-10-07
CVE: 2025-61772
CVSS V3: 7.5
Links:

Summary

Rack::Multipart::Parser can accumulate unbounded data when a multipart part’s header block never terminates with the required blank line (CRLFCRLF). The parser keeps appending incoming bytes to memory without a size cap, allowing a remote attacker to exhaust memory and cause a denial of service (DoS).

Details

While reading multipart headers, the parser waits for CRLFCRLF using:

@sbuf.scan_until(/(.*?\r
)\r
/m)

If the terminator never appears, it continues appending data (@sbuf.concat(content)) indefinitely. There is no limit on accumulated header bytes, so a single malformed part can consume memory proportional to the request body size.

Impact

Attackers can send incomplete multipart headers to trigger high memory use, leading to process termination (OOM) or severe slowdown. The effect scales with request size limits and concurrency. All applications handling multipart uploads may be affected.

Mitigation

  • Upgrade to a patched Rack version that caps per-part header size (e.g., 64 KiB).

  • Until then, restrict maximum request sizes at the proxy or web server layer (e.g., Nginx client_max_body_size).

Affected versions: ["2.0.3", "1.6.7", "1.4.6", "1.3.4", "1.1.0", "0.4.0", "2.1.2", "2.0.8", "2.0.5", "2.0.1", "1.4.4", "1.4.1", "1.3.10", "1.3.3", "1.2.5", "1.2.0", "1.1.6", "2.1.1", "2.0.4", "1.6.11", "1.6.5", "1.6.1", "1.5.3", "1.5.1", "1.5.0.beta.2", "1.3.5", "1.3.2", "1.3.0", "1.2.6", "1.2.3", "1.2.1", "1.1.4", "1.1.3", "0.1.0", "1.6.13", "1.6.12", "1.4.7", "1.4.5", "1.3.9", "1.3.0.beta2", "1.1.2", "1.0.1", "2.0.9", "2.0.2", "1.6.0.beta", "1.5.5", "1.5.0.beta.1", "1.4.3", "1.3.7", "1.3.0.beta", "1.2.7", "1.1.1", "0.9.1", "2.1.4", "2.1.3", "2.0.0.rc1", "1.6.8", "1.6.3", "1.5.0", "1.3.1", "1.1.5", "0.9.0", "2.0.7", "2.0.6", "1.6.6", "1.6.4", "1.6.0", "1.4.2", "1.1.1.pre", "1.0.0", "0.2.0", "2.1.0", "2.0.0.alpha", "1.6.10", "1.6.9", "1.6.2", "1.6.0.beta2", "1.5.4", "1.5.2", "1.4.0", "1.3.8", "1.3.6", "1.2.8", "1.2.4", "1.2.2", "0.3.0", "2.1.4.1", "2.0.9.1", "3.0.0.beta1", "3.0.0.rc1", "3.0.0", "3.0.1", "3.0.2", "3.0.3", "3.0.4", "2.1.4.2", "2.0.9.2", "3.0.4.1", "2.1.4.3", "3.0.4.2", "2.0.9.3", "3.0.5", "3.0.6.1", "3.0.6", "3.0.7", "3.0.8", "3.0.9", "2.1.4.4", "3.0.9.1", "2.0.9.4", "3.0.10", "3.0.11", "3.0.12", "3.0.13", "3.0.14", "3.0.15", "3.0.16", "3.0.17", "3.0.18", "3.2.0", "3.2.1"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Rack has a Possible Information Disclosure Vulnerability

Published date: 2025-10-10
CVE: 2025-61780
CVSS V3: 5.8
Links:

Summary

A possible information disclosure vulnerability existed in Rack::Sendfile when running behind a proxy that supports x-sendfile headers (such as Nginx). Specially crafted headers could cause Rack::Sendfile to miscommunicate with the proxy and trigger unintended internal requests, potentially bypassing proxy-level access restrictions.

Details

When Rack::Sendfile received untrusted x-sendfile-type or x-accel-mapping headers from a client, it would interpret them as proxy configuration directives. This could cause the middleware to send a redirect response to the proxy, prompting it to reissue a new internal request that was not subject to the proxy's access controls.

An attacker could exploit this by: 1. Setting a crafted x-sendfile-type: x-accel-redirect header. 2. Setting a crafted x-accel-mapping header. 3. Requesting a path that qualifies for proxy-based acceleration.

Impact

Attackers could bypass proxy-enforced restrictions and access internal endpoints intended to be protected (such as administrative pages). The vulnerability did not allow arbitrary file reads but could expose sensitive application routes.

This issue only affected systems meeting all of the following conditions:

  • The application used Rack::Sendfile with a proxy that supports x-accel-redirect (e.g., Nginx).
  • The proxy did not always set or remove the x-sendfile-type and x-accel-mapping headers.
  • The application exposed an endpoint that returned a body responding to .to_path.

Mitigation

  • Upgrade to a fixed version of Rack which requires explicit configuration to enable x-accel-redirect:
  use Rack::Sendfile, "x-accel-redirect"
  • Alternatively, configure the proxy to always set or strip the headers (you should be doing this!):
  proxy_set_header x-sendfile-type x-accel-redirect;
  proxy_set_header x-accel-mapping /var/www/=/files/;
  • Or in Rails applications, disable sendfile completely:
  config.action_dispatch.x_sendfile_header = nil

Affected versions: ["2.0.3", "1.6.7", "1.4.6", "1.3.4", "1.1.0", "0.4.0", "2.1.2", "2.0.8", "2.0.5", "2.0.1", "1.4.4", "1.4.1", "1.3.10", "1.3.3", "1.2.5", "1.2.0", "1.1.6", "2.1.1", "2.0.4", "1.6.11", "1.6.5", "1.6.1", "1.5.3", "1.5.1", "1.5.0.beta.2", "1.3.5", "1.3.2", "1.3.0", "1.2.6", "1.2.3", "1.2.1", "1.1.4", "1.1.3", "0.1.0", "1.6.13", "1.6.12", "1.4.7", "1.4.5", "1.3.9", "1.3.0.beta2", "1.1.2", "1.0.1", "2.0.9", "2.0.2", "1.6.0.beta", "1.5.5", "1.5.0.beta.1", "1.4.3", "1.3.7", "1.3.0.beta", "1.2.7", "1.1.1", "0.9.1", "2.1.4", "2.1.3", "2.0.0.rc1", "1.6.8", "1.6.3", "1.5.0", "1.3.1", "1.1.5", "0.9.0", "2.0.7", "2.0.6", "1.6.6", "1.6.4", "1.6.0", "1.4.2", "1.1.1.pre", "1.0.0", "0.2.0", "2.1.0", "2.0.0.alpha", "1.6.10", "1.6.9", "1.6.2", "1.6.0.beta2", "1.5.4", "1.5.2", "1.4.0", "1.3.8", "1.3.6", "1.2.8", "1.2.4", "1.2.2", "0.3.0", "2.1.4.1", "2.0.9.1", "3.0.0.beta1", "3.0.0.rc1", "3.0.0", "3.0.1", "3.0.2", "3.0.3", "3.0.4", "2.1.4.2", "2.0.9.2", "3.0.4.1", "2.1.4.3", "3.0.4.2", "2.0.9.3", "3.0.5", "3.0.6.1", "3.0.6", "3.0.7", "3.0.8", "3.0.9", "2.1.4.4", "3.0.9.1", "2.0.9.4", "3.0.10", "3.0.11", "3.0.12", "3.0.13", "3.0.14", "3.0.15", "3.0.16", "3.0.17", "3.0.18", "3.2.0", "3.2.1", "3.2.2"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Rack is vulnerable to a memory-exhaustion DoS through unbounded URL-encoded body parsing

Published date: 2025-10-10
CVE: 2025-61919
CVSS V3: 7.5
Links:

Summary

Rack::Request#POST reads the entire request body into memory for Content-Type: application/x-www-form-urlencoded, calling rack.input.read(nil) without enforcing a length or cap. Large request bodies can therefore be buffered completely into process memory before parsing, leading to denial of service (DoS) through memory exhaustion.

Details

When handling non-multipart form submissions, Rack’s request parser performs:

form_vars = get_header(RACK_INPUT).read

Since read is called with no argument, the entire request body is loaded into a Ruby String. This occurs before query parameter parsing or enforcement of any params_limit. As a result, Rack applications without an upstream body-size limit can experience unbounded memory allocation proportional to request size.

Impact

Attackers can send large application/x-www-form-urlencoded bodies to consume process memory, causing slowdowns or termination by the operating system (OOM). The effect scales linearly with request size and concurrency. Even with parsing limits configured, the issue occurs before those limits are enforced.

Mitigation

  • Update to a patched version of Rack that enforces form parameter limits using query_parser.bytesize_limit, preventing unbounded reads of application/x-www-form-urlencoded bodies.
  • Enforce strict maximum body size at the proxy or web server layer (e.g., Nginx client_max_body_size, Apache LimitRequestBody).

Affected versions: ["2.0.3", "1.6.7", "1.4.6", "1.3.4", "1.1.0", "0.4.0", "2.1.2", "2.0.8", "2.0.5", "2.0.1", "1.4.4", "1.4.1", "1.3.10", "1.3.3", "1.2.5", "1.2.0", "1.1.6", "2.1.1", "2.0.4", "1.6.11", "1.6.5", "1.6.1", "1.5.3", "1.5.1", "1.5.0.beta.2", "1.3.5", "1.3.2", "1.3.0", "1.2.6", "1.2.3", "1.2.1", "1.1.4", "1.1.3", "0.1.0", "1.6.13", "1.6.12", "1.4.7", "1.4.5", "1.3.9", "1.3.0.beta2", "1.1.2", "1.0.1", "2.0.9", "2.0.2", "1.6.0.beta", "1.5.5", "1.5.0.beta.1", "1.4.3", "1.3.7", "1.3.0.beta", "1.2.7", "1.1.1", "0.9.1", "2.1.4", "2.1.3", "2.0.0.rc1", "1.6.8", "1.6.3", "1.5.0", "1.3.1", "1.1.5", "0.9.0", "2.0.7", "2.0.6", "1.6.6", "1.6.4", "1.6.0", "1.4.2", "1.1.1.pre", "1.0.0", "0.2.0", "2.1.0", "2.0.0.alpha", "1.6.10", "1.6.9", "1.6.2", "1.6.0.beta2", "1.5.4", "1.5.2", "1.4.0", "1.3.8", "1.3.6", "1.2.8", "1.2.4", "1.2.2", "0.3.0", "2.1.4.1", "2.0.9.1", "3.0.0.beta1", "3.0.0.rc1", "3.0.0", "3.0.1", "3.0.2", "3.0.3", "3.0.4", "2.1.4.2", "2.0.9.2", "3.0.4.1", "2.1.4.3", "3.0.4.2", "2.0.9.3", "3.0.5", "3.0.6.1", "3.0.6", "3.0.7", "3.0.8", "3.0.9", "2.1.4.4", "3.0.9.1", "2.0.9.4", "3.0.10", "3.0.11", "3.0.12", "3.0.13", "3.0.14", "3.0.15", "3.0.16", "3.0.17", "3.0.18", "3.2.0", "3.2.1", "3.2.2"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Rack has a Directory Traversal via Rack:Directory

Published date: 2026-02-17
CVE: 2026-22860
CVSS V3: 7.5
Links:

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.\n* Don't name directories with the same prefix as one which is exposed via Rack::Directory."

Affected versions: ["2.0.3", "1.6.7", "1.4.6", "1.3.4", "1.1.0", "0.4.0", "2.1.2", "2.0.8", "2.0.5", "2.0.1", "1.4.4", "1.4.1", "1.3.10", "1.3.3", "1.2.5", "1.2.0", "1.1.6", "2.1.1", "2.0.4", "1.6.11", "1.6.5", "1.6.1", "1.5.3", "1.5.1", "1.5.0.beta.2", "1.3.5", "1.3.2", "1.3.0", "1.2.6", "1.2.3", "1.2.1", "1.1.4", "1.1.3", "0.1.0", "1.6.13", "1.6.12", "1.4.7", "1.4.5", "1.3.9", "1.3.0.beta2", "1.1.2", "1.0.1", "2.0.9", "2.0.2", "1.6.0.beta", "1.5.5", "1.5.0.beta.1", "1.4.3", "1.3.7", "1.3.0.beta", "1.2.7", "1.1.1", "0.9.1", "2.1.4", "2.1.3", "2.0.0.rc1", "1.6.8", "1.6.3", "1.5.0", "1.3.1", "1.1.5", "0.9.0", "2.0.7", "2.0.6", "1.6.6", "1.6.4", "1.6.0", "1.4.2", "1.1.1.pre", "1.0.0", "0.2.0", "2.1.0", "2.0.0.alpha", "1.6.10", "1.6.9", "1.6.2", "1.6.0.beta2", "1.5.4", "1.5.2", "1.4.0", "1.3.8", "1.3.6", "1.2.8", "1.2.4", "1.2.2", "0.3.0", "2.1.4.1", "2.0.9.1", "3.0.0.beta1", "3.0.0.rc1", "3.0.0", "3.0.1", "3.0.2", "3.0.3", "3.0.4", "2.1.4.2", "2.0.9.2", "3.0.4.1", "2.1.4.3", "3.0.4.2", "2.0.9.3", "3.0.5", "3.0.6.1", "3.0.6", "3.0.7", "3.0.8", "3.0.9", "2.1.4.4", "3.0.9.1", "2.0.9.4", "3.0.10", "3.0.11", "3.0.12", "3.0.13", "3.0.14", "3.0.15", "3.0.16", "3.0.17", "3.0.18", "3.2.0", "3.2.1", "3.2.2", "3.2.3", "3.2.4"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

Stored XSS in Rack::Directory via javascript: filenames rendered into anchor href

Published date: 2026-02-17
CVE: 2026-25500
CVSS V3: 5.4
Links:

Summary

Rack::Directory generates an HTML directory index where each file entry is rendered as a clickable link. If a file exists on disk whose basename begins with the javascript: scheme (e.g. javascript:alert(1)), the generated index includes an anchor whose href attribute is exactly javascript:alert(1). Clicking this entry executes arbitrary JavaScript in the context of the hosting application.

This results in a client-side XSS condition in directory listings generated by Rack::Directory.

Details

Rack::Directory renders directory entries using an HTML row template similar to:

<a href='%s'>%s</a>

The %s placeholder is populated directly with the file’s basename. If the basename begins with javascript:, the resulting HTML contains an executable JavaScript URL:

<a href='javascript:alert(1)'>javascript:alert(1)</a>

Because the value is inserted directly into the href attribute without scheme validation or normalization, browsers interpret it as a JavaScript URI. When a user clicks the link, the JavaScript executes in the origin of the Rack application.

Impact

If Rack::Directory is used to expose filesystem contents over HTTP, an attacker who can create or upload files within that directory may introduce a malicious filename beginning with javascript:.

When a user visits the directory listing and clicks the entry, arbitrary JavaScript executes in the application's origin. Exploitation requires user interaction (clicking the malicious entry).

Mitigation

  • Update to a patched version of Rack in which Rack::Directory prefixes generated anchors with a relative path indicator (e.g. ./filename).
  • Avoid exposing user-controlled directories via Rack::Directory.
  • Apply a strict Content Security Policy (CSP) to reduce impact of potential client-side execution issues.
  • Where feasible, restrict or sanitize uploaded filenames to disallow dangerous URI scheme prefixes.

Affected versions: ["2.0.3", "1.6.7", "1.4.6", "1.3.4", "1.1.0", "0.4.0", "2.1.2", "2.0.8", "2.0.5", "2.0.1", "1.4.4", "1.4.1", "1.3.10", "1.3.3", "1.2.5", "1.2.0", "1.1.6", "2.1.1", "2.0.4", "1.6.11", "1.6.5", "1.6.1", "1.5.3", "1.5.1", "1.5.0.beta.2", "1.3.5", "1.3.2", "1.3.0", "1.2.6", "1.2.3", "1.2.1", "1.1.4", "1.1.3", "0.1.0", "1.6.13", "1.6.12", "1.4.7", "1.4.5", "1.3.9", "1.3.0.beta2", "1.1.2", "1.0.1", "2.0.9", "2.0.2", "1.6.0.beta", "1.5.5", "1.5.0.beta.1", "1.4.3", "1.3.7", "1.3.0.beta", "1.2.7", "1.1.1", "0.9.1", "2.1.4", "2.1.3", "2.0.0.rc1", "1.6.8", "1.6.3", "1.5.0", "1.3.1", "1.1.5", "0.9.0", "2.0.7", "2.0.6", "1.6.6", "1.6.4", "1.6.0", "1.4.2", "1.1.1.pre", "1.0.0", "0.2.0", "2.1.0", "2.0.0.alpha", "1.6.10", "1.6.9", "1.6.2", "1.6.0.beta2", "1.5.4", "1.5.2", "1.4.0", "1.3.8", "1.3.6", "1.2.8", "1.2.4", "1.2.2", "0.3.0", "2.1.4.1", "2.0.9.1", "3.0.0.beta1", "3.0.0.rc1", "3.0.0", "3.0.1", "3.0.2", "3.0.3", "3.0.4", "2.1.4.2", "2.0.9.2", "3.0.4.1", "2.1.4.3", "3.0.4.2", "2.0.9.3", "3.0.5", "3.0.6.1", "3.0.6", "3.0.7", "3.0.8", "3.0.9", "2.1.4.4", "3.0.9.1", "2.0.9.4", "3.0.10", "3.0.11", "3.0.12", "3.0.13", "3.0.14", "3.0.15", "3.0.16", "3.0.17", "3.0.18", "3.2.0", "3.2.1", "3.2.2", "3.2.3", "3.2.4"]
Secure versions: [2.2.23, 3.1.21, 3.2.6]
Recommendation: Update to version 3.2.6.

178 Other Versions

Version License Security Released
3.0.1 MIT 43 2022-11-18 - 20:59 over 3 years
3.0.0 MIT 43 2022-09-06 - 16:28 over 3 years
3.0.0.rc1 MIT 29 2022-09-04 - 23:52 over 3 years
3.0.0.beta1 MIT 29 2022-08-08 - 20:34 over 3 years
2.2.23 MIT 2026-04-01 - 06:34 28 days
2.2.22 MIT 9 2026-02-16 - 03:40 2 months
2.2.21 MIT 11 2025-11-02 - 12:19 6 months
2.2.20 MIT 11 2025-10-10 - 00:36 7 months
2.2.19 MIT 13 2025-10-07 - 01:51 7 months
2.2.18 MIT 16 2025-09-25 - 09:02 7 months
2.2.17 MIT 18 2025-06-03 - 01:57 11 months
2.2.16 MIT 18 2025-05-22 - 05:33 11 months
2.2.15 MIT 18 2025-05-18 - 02:38 12 months
2.2.14 MIT 18 2025-05-06 - 21:33 12 months
2.2.13 MIT 21 2025-03-10 - 21:19 about 1 year
2.2.12 MIT 22 2025-03-04 - 05:45 about 1 year
2.2.11 MIT 23 2025-02-12 - 03:54 about 1 year
2.2.10 MIT 24 2024-10-14 - 01:47 over 1 year
2.2.9 MIT 24 2024-03-21 - 01:19 about 2 years
2.2.8.1 MIT 24 2024-02-21 - 19:23 about 2 years
2.2.8 MIT 30 2023-07-31 - 02:43 over 2 years
2.2.7 MIT 30 2023-04-24 - 23:22 about 3 years
2.2.6.4 MIT 30 2023-03-13 - 18:10 about 3 years
2.2.6.3 MIT 32 2023-03-02 - 22:57 about 3 years
2.2.6.2 MIT 34 2023-01-17 - 21:22 over 3 years
2.2.6.1 MIT 36 2023-01-17 - 20:48 over 3 years
2.2.6 MIT 40 2023-01-16 - 21:05 over 3 years
2.2.5 MIT 40 2022-12-26 - 20:19 over 3 years
2.2.4 MIT 40 2022-06-30 - 22:22 almost 4 years
2.2.3.1 MIT 40 2022-05-27 - 15:31 almost 4 years
2.2.3 MIT 44 2020-06-15 - 22:25 almost 6 years
2.2.2 MIT 46 2020-02-10 - 22:25 about 6 years
2.2.1 MIT 46 2020-02-09 - 06:20 about 6 years
2.2.0 MIT 46 2020-02-08 - 18:26 about 6 years
2.1.4.4 MIT 41 2024-02-21 - 19:21 about 2 years
2.1.4.3 MIT 43 2023-03-02 - 22:57 about 3 years
2.1.4.2 MIT 45 2023-01-17 - 20:48 over 3 years
2.1.4.1 MIT 51 2022-05-27 - 15:31 almost 4 years
2.1.4 MIT 55 2020-06-15 - 22:24 almost 6 years
2.1.3 MIT 56 2020-05-12 - 21:44 almost 6 years
2.1.2 MIT 57 2020-01-27 - 22:42 over 6 years
2.1.1 MIT 57 2020-01-11 - 22:18 over 6 years
2.1.0 MIT 57 2020-01-10 - 17:49 over 6 years
2.0.9.4 MIT 45 2024-02-21 - 19:20 about 2 years
2.0.9.3 MIT 47 2023-03-02 - 22:57 about 3 years
2.0.9.2 MIT 49 2023-01-17 - 20:48 over 3 years
2.0.9.1 MIT 55 2022-05-27 - 15:31 almost 4 years
2.0.9 MIT 59 2020-02-08 - 18:21 about 6 years
2.0.8 MIT 59 2019-12-18 - 18:08 over 6 years
2.0.7 MIT 61 2019-04-02 - 16:54 about 7 years