Skip to content

Commit 4d6ce90

Browse files
committed
Avoid backtracking in filtered_query_string
Thanks scyoon for the patch CVE-2024-41128
1 parent 4712a2b commit 4d6ce90

File tree

2 files changed

+18
-6
lines changed

2 files changed

+18
-6
lines changed

actionpack/lib/action_dispatch/http/filter_parameters.rb

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,17 @@ def parameter_filter_for(filters) # :doc:
6868
ActiveSupport::ParameterFilter.new(filters)
6969
end
7070

71-
KV_RE = "[^&;=]+"
72-
PAIR_RE = %r{(#{KV_RE})=(#{KV_RE})}
7371
def filtered_query_string # :doc:
74-
query_string.gsub(PAIR_RE) do |_|
75-
parameter_filter.filter($1 => $2).first.join("=")
72+
parts = query_string.split(/([&;])/)
73+
filtered_parts = parts.map do |part|
74+
if part.include?("=")
75+
key, value = part.split("=", 2)
76+
parameter_filter.filter(key => value).first.join("=")
77+
else
78+
part
79+
end
7680
end
81+
filtered_parts.join("")
7782
end
7883
end
7984
end

actionpack/lib/action_dispatch/http/filter_redirect.rb

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,16 @@ def location_filter_match?
3737
def parameter_filtered_location
3838
uri = URI.parse(location)
3939
unless uri.query.nil? || uri.query.empty?
40-
uri.query.gsub!(FilterParameters::PAIR_RE) do
41-
request.parameter_filter.filter($1 => $2).first.join("=")
40+
parts = uri.query.split(/([&;])/)
41+
filtered_parts = parts.map do |part|
42+
if part.include?("=")
43+
key, value = part.split("=", 2)
44+
request.parameter_filter.filter(key => value).first.join("=")
45+
else
46+
part
47+
end
4248
end
49+
uri.query = filtered_parts.join("")
4350
end
4451
uri.to_s
4552
rescue URI::Error

0 commit comments

Comments
 (0)