Skip to content

Commit 025cd34

Browse files
committed
Ruby: Taint flow through ActionController params
We were not recognising "require" as returning a Parameters instance.
1 parent 2d95b6a commit 025cd34

File tree

3 files changed

+35
-3
lines changed

3 files changed

+35
-3
lines changed

ruby/ql/lib/codeql/ruby/frameworks/ActionController.qll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -632,9 +632,9 @@ private module ParamsSummaries {
632632
// dig doesn't always return a Parameters instance, but it will if the
633633
// given key refers to a nested hash parameter.
634634
"dig", "each", "each_key", "each_pair", "each_value", "except", "keep_if", "merge",
635-
"merge!", "permit", "reject", "reject!", "reverse_merge", "reverse_merge!", "select",
636-
"select!", "slice", "slice!", "transform_keys", "transform_keys!", "transform_values",
637-
"transform_values!", "with_defaults", "with_defaults!"
635+
"merge!", "permit", "reject", "reject!", "require", "reverse_merge", "reverse_merge!",
636+
"select", "select!", "slice", "slice!", "transform_keys", "transform_keys!",
637+
"transform_values", "transform_values!", "with_defaults", "with_defaults!"
638638
]
639639
}
640640

ruby/ql/test/query-tests/security/cwe-089/ActiveRecordInjection.rb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,3 +155,21 @@ def unsafe_action
155155
users = User.annotate("this is an unsafe annotation:#{params[:comment]}").find_by(user_name: name)
156156
end
157157
end
158+
159+
# A regression test
160+
161+
class Regression < ActiveRecord::Base
162+
end
163+
164+
class RegressionController < ActionController::Base
165+
def index
166+
my_params = permitted_params
167+
query = "SELECT * FROM users WHERE id = #{my_params[:user_id]}"
168+
result = Regression.find_by_sql(query)
169+
end
170+
171+
172+
def permitted_params
173+
params.require(:my_key).permit(:id, :user_id, :my_type)
174+
end
175+
end

ruby/ql/test/query-tests/security/cwe-089/SqlInjection.expected

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ edges
3535
| ActiveRecordInjection.rb:141:21:141:44 | ...[...] : | ActiveRecordInjection.rb:20:22:20:30 | condition : |
3636
| ActiveRecordInjection.rb:155:59:155:64 | call to params : | ActiveRecordInjection.rb:155:59:155:74 | ...[...] : |
3737
| ActiveRecordInjection.rb:155:59:155:74 | ...[...] : | ActiveRecordInjection.rb:155:27:155:76 | "this is an unsafe annotation:..." |
38+
| ActiveRecordInjection.rb:166:17:166:32 | call to permitted_params : | ActiveRecordInjection.rb:167:47:167:55 | my_params : |
39+
| ActiveRecordInjection.rb:167:47:167:55 | my_params : | ActiveRecordInjection.rb:167:47:167:65 | ...[...] : |
40+
| ActiveRecordInjection.rb:167:47:167:65 | ...[...] : | ActiveRecordInjection.rb:168:37:168:41 | query |
41+
| ActiveRecordInjection.rb:173:5:173:10 | call to params : | ActiveRecordInjection.rb:173:5:173:27 | call to require : |
42+
| ActiveRecordInjection.rb:173:5:173:27 | call to require : | ActiveRecordInjection.rb:173:5:173:59 | call to permit : |
43+
| ActiveRecordInjection.rb:173:5:173:59 | call to permit : | ActiveRecordInjection.rb:166:17:166:32 | call to permitted_params : |
3844
| ArelInjection.rb:4:12:4:17 | call to params : | ArelInjection.rb:4:12:4:29 | ...[...] : |
3945
| ArelInjection.rb:4:12:4:29 | ...[...] : | ArelInjection.rb:6:20:6:61 | "SELECT * FROM users WHERE nam..." |
4046
nodes
@@ -93,6 +99,13 @@ nodes
9399
| ActiveRecordInjection.rb:155:27:155:76 | "this is an unsafe annotation:..." | semmle.label | "this is an unsafe annotation:..." |
94100
| ActiveRecordInjection.rb:155:59:155:64 | call to params : | semmle.label | call to params : |
95101
| ActiveRecordInjection.rb:155:59:155:74 | ...[...] : | semmle.label | ...[...] : |
102+
| ActiveRecordInjection.rb:166:17:166:32 | call to permitted_params : | semmle.label | call to permitted_params : |
103+
| ActiveRecordInjection.rb:167:47:167:55 | my_params : | semmle.label | my_params : |
104+
| ActiveRecordInjection.rb:167:47:167:65 | ...[...] : | semmle.label | ...[...] : |
105+
| ActiveRecordInjection.rb:168:37:168:41 | query | semmle.label | query |
106+
| ActiveRecordInjection.rb:173:5:173:10 | call to params : | semmle.label | call to params : |
107+
| ActiveRecordInjection.rb:173:5:173:27 | call to require : | semmle.label | call to require : |
108+
| ActiveRecordInjection.rb:173:5:173:59 | call to permit : | semmle.label | call to permit : |
96109
| ArelInjection.rb:4:12:4:17 | call to params : | semmle.label | call to params : |
97110
| ArelInjection.rb:4:12:4:29 | ...[...] : | semmle.label | ...[...] : |
98111
| ArelInjection.rb:6:20:6:61 | "SELECT * FROM users WHERE nam..." | semmle.label | "SELECT * FROM users WHERE nam..." |
@@ -118,4 +131,5 @@ subpaths
118131
| ActiveRecordInjection.rb:96:23:96:47 | ...[...] | ActiveRecordInjection.rb:96:23:96:28 | call to params : | ActiveRecordInjection.rb:96:23:96:47 | ...[...] | This SQL query depends on a $@. | ActiveRecordInjection.rb:96:23:96:28 | call to params | user-provided value |
119132
| ActiveRecordInjection.rb:108:20:108:32 | ... + ... | ActiveRecordInjection.rb:102:10:102:15 | call to params : | ActiveRecordInjection.rb:108:20:108:32 | ... + ... | This SQL query depends on a $@. | ActiveRecordInjection.rb:102:10:102:15 | call to params | user-provided value |
120133
| ActiveRecordInjection.rb:155:27:155:76 | "this is an unsafe annotation:..." | ActiveRecordInjection.rb:155:59:155:64 | call to params : | ActiveRecordInjection.rb:155:27:155:76 | "this is an unsafe annotation:..." | This SQL query depends on a $@. | ActiveRecordInjection.rb:155:59:155:64 | call to params | user-provided value |
134+
| ActiveRecordInjection.rb:168:37:168:41 | query | ActiveRecordInjection.rb:173:5:173:10 | call to params : | ActiveRecordInjection.rb:168:37:168:41 | query | This SQL query depends on a $@. | ActiveRecordInjection.rb:173:5:173:10 | call to params | user-provided value |
121135
| ArelInjection.rb:6:20:6:61 | "SELECT * FROM users WHERE nam..." | ArelInjection.rb:4:12:4:17 | call to params : | ArelInjection.rb:6:20:6:61 | "SELECT * FROM users WHERE nam..." | This SQL query depends on a $@. | ArelInjection.rb:4:12:4:17 | call to params | user-provided value |

0 commit comments

Comments
 (0)