Skip to content

Commit 93ab8c2

Browse files
committed
Fix unsafe query generation risk.
Redo of CVE-2012-2660, CVE-2012-2694 and CVE-2013-0155 CVE-2016-6317
1 parent f05af91 commit 93ab8c2

File tree

2 files changed

+45
-1
lines changed

2 files changed

+45
-1
lines changed

actionpack/test/dispatch/request/json_params_parsing_test.rb

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,50 @@ def teardown
8484
end
8585
end
8686

87+
test "prevent null query" do
88+
# Make sure we have data to find
89+
klass = Class.new(ActiveRecord::Base) do
90+
def self.name; 'Foo'; end
91+
establish_connection adapter: "sqlite3", database: ":memory:"
92+
connection.create_table "foos" do |t|
93+
t.string :title
94+
t.timestamps null: false
95+
end
96+
end
97+
klass.create
98+
assert klass.first
99+
100+
app = ActionDispatch::ParamsParser.new ->(env) {
101+
request = ActionDispatch::Request.new env
102+
params = ActionController::Parameters.new request.parameters
103+
if params[:t]
104+
klass.find_by_title(params[:t])
105+
else
106+
nil
107+
end
108+
}
109+
110+
assert_nil app.call(make_env({ 't' => nil }))
111+
assert_nil app.call(make_env({ 't' => [nil] }))
112+
113+
[[[nil]], [[[nil]]]].each do |data|
114+
assert_deprecated do
115+
assert_nil app.call(make_env({ 't' => data }))
116+
end
117+
end
118+
end
119+
87120
private
121+
def make_env json
122+
data = JSON.dump json
123+
content_length = data.length
124+
{
125+
'CONTENT_LENGTH' => content_length,
126+
'CONTENT_TYPE' => 'application/json',
127+
'rack.input' => StringIO.new(data)
128+
}
129+
end
130+
88131
def assert_parses(expected, actual, headers = {})
89132
with_test_routing do
90133
post "/parse", actual, headers

activerecord/lib/active_record/relation/predicate_builder/array_handler.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ def call(attribute, value)
1414
it for 'IN' conditions.
1515
MSG
1616

17-
values = values.flatten
17+
flat_values = values.flatten
18+
values = flat_values unless flat_values.include?(nil)
1819
end
1920

2021
return attribute.in([]) if values.empty? && nils.empty?

0 commit comments

Comments
 (0)