VYPR
Moderate severityNVD Advisory· Published Feb 28, 2024· Updated Feb 13, 2025

Rack ReDos in content type parsing (2nd degree polynomial)

CVE-2024-25126

Description

Rack is a modular Ruby web server interface. 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 (ReDos 2nd degree polynomial). This vulnerability is patched in 3.0.9.1 and 2.2.8.1.

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
rackRubyGems
>= 3.0.0, < 3.0.9.13.0.9.1
rackRubyGems
>= 0.4, < 2.2.8.12.2.8.1

Affected products

1

Patches

2
d9c163a443b8

Avoid 2nd degree polynomial regexp in MediaType

https://github.com/rack/rackJean BoussierDec 6, 2023via ghsa
1 file changed · +9 4
  • lib/rack/media_type.rb+9 4 modified
    @@ -4,7 +4,7 @@ module Rack
       # Rack::MediaType parse media type and parameters out of content_type string
     
       class MediaType
    -    SPLIT_PATTERN = %r{\s*[;,]\s*}
    +    SPLIT_PATTERN = /[;,]/
     
         class << self
           # The media type (type/subtype) portion of the CONTENT_TYPE header
    @@ -15,7 +15,11 @@ class << self
           # http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7
           def type(content_type)
             return nil unless content_type
    -        content_type.split(SPLIT_PATTERN, 2).first.tap &:downcase!
    +        if type = content_type.split(SPLIT_PATTERN, 2).first
    +          type.rstrip!
    +          type.downcase!
    +          type
    +        end
           end
     
           # The media type parameters provided in CONTENT_TYPE as a Hash, or
    @@ -27,9 +31,10 @@ def params(content_type)
             return {} if content_type.nil?
     
             content_type.split(SPLIT_PATTERN)[1..-1].each_with_object({}) do |s, hsh|
    +          s.strip!
               k, v = s.split('=', 2)
    -
    -          hsh[k.tap(&:downcase!)] = strip_doublequotes(v)
    +          k.downcase!
    +          hsh[k] = strip_doublequotes(v)
             end
           end
     
    
6efb2ceea003

Avoid 2nd degree polynomial regexp in MediaType

https://github.com/rack/rackJean BoussierDec 6, 2023via ghsa
1 file changed · +9 4
  • lib/rack/media_type.rb+9 4 modified
    @@ -4,7 +4,7 @@ module Rack
       # Rack::MediaType parse media type and parameters out of content_type string
     
       class MediaType
    -    SPLIT_PATTERN = %r{\s*[;,]\s*}
    +    SPLIT_PATTERN = /[;,]/
     
         class << self
           # The media type (type/subtype) portion of the CONTENT_TYPE header
    @@ -15,7 +15,11 @@ class << self
           # http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7
           def type(content_type)
             return nil unless content_type
    -        content_type.split(SPLIT_PATTERN, 2).first.tap(&:downcase!)
    +        if type = content_type.split(SPLIT_PATTERN, 2).first
    +          type.rstrip!
    +          type.downcase!
    +          type
    +        end
           end
     
           # The media type parameters provided in CONTENT_TYPE as a Hash, or
    @@ -27,9 +31,10 @@ def params(content_type)
             return {} if content_type.nil?
     
             content_type.split(SPLIT_PATTERN)[1..-1].each_with_object({}) do |s, hsh|
    +          s.strip!
               k, v = s.split('=', 2)
    -
    -          hsh[k.tap(&:downcase!)] = strip_doublequotes(v)
    +          k.downcase!
    +          hsh[k] = strip_doublequotes(v)
             end
           end
     
    

Vulnerability mechanics

Synthesis attempt was rejected by the grounding validator. Re-run pending.

References

10

News mentions

0

No linked articles in our index yet.