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!
Summary
ruby module Rack class MediaType SPLITPATTERN = %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:
ruby request["Content-Type"] = (" " 50000) + "a,"
Impact
It's a very easy to craft ReDoS. Like all ReDoS the impact is debatable.