Skip to content

Commit a227cd7

Browse files
committed
Fixing ReDoS in header parsing
Thanks svalkanov [CVE-2024-26146]
1 parent 0b3f997 commit a227cd7

File tree

1 file changed

+6
-5
lines changed

1 file changed

+6
-5
lines changed

lib/rack/utils.rb

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,8 @@ def build_nested_query(value, prefix = nil)
143143
end
144144

145145
def q_values(q_value_header)
146-
q_value_header.to_s.split(/\s*,\s*/).map do |part|
147-
value, parameters = part.split(/\s*;\s*/, 2)
146+
q_value_header.to_s.split(',').map do |part|
147+
value, parameters = part.split(';', 2).map(&:strip)
148148
quality = 1.0
149149
if parameters && (md = /\Aq=([\d.]+)/.match(parameters))
150150
quality = md[1].to_f
@@ -157,9 +157,10 @@ def forwarded_values(forwarded_header)
157157
return nil unless forwarded_header
158158
forwarded_header = forwarded_header.to_s.gsub("\n", ";")
159159

160-
forwarded_header.split(/\s*;\s*/).each_with_object({}) do |field, values|
161-
field.split(/\s*,\s*/).each do |pair|
162-
return nil unless pair =~ /\A\s*(by|for|host|proto)\s*=\s*"?([^"]+)"?\s*\Z/i
160+
forwarded_header.split(';').each_with_object({}) do |field, values|
161+
field.split(',').each do |pair|
162+
pair = pair.split('=').map(&:strip).join('=')
163+
return nil unless pair =~ /\A(by|for|host|proto)="?([^"]+)"?\Z/i
163164
(values[$1.downcase.to_sym] ||= []) << $2
164165
end
165166
end

0 commit comments

Comments
 (0)