Skip to content

Commit dbd33d1

Browse files
Model Argument[1] of ActiveRecord from
1 parent 2896bfb commit dbd33d1

File tree

4 files changed

+86
-68
lines changed

4 files changed

+86
-68
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
category: minorAnalysis
3+
---
4+
* The second argument, `subquery_name`, of the `ActiveRecord::QueryMethods::from` method, is now recognized as an sql injection sink.

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -175,14 +175,14 @@ private predicate sqlFragmentArgumentInner(DataFlow::CallNode call, DataFlow::No
175175
call =
176176
activeRecordQueryBuilderCall([
177177
"delete_all", "delete_by", "destroy_all", "destroy_by", "exists?", "find_by", "find_by!",
178-
"find_or_create_by", "find_or_create_by!", "find_or_initialize_by", "find_by_sql", "from",
179-
"having", "lock", "not", "where", "rewhere"
178+
"find_or_create_by", "find_or_create_by!", "find_or_initialize_by", "find_by_sql", "having",
179+
"lock", "not", "where", "rewhere"
180180
]) and
181181
sink = call.getArgument(0)
182182
or
183183
call =
184184
activeRecordQueryBuilderCall([
185-
"group", "joins", "order", "reorder", "pluck", "select", "reselect"
185+
"from", "group", "joins", "order", "reorder", "pluck", "select", "reselect"
186186
]) and
187187
sink = call.getArgument(_)
188188
or

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,12 @@ def some_request_handler
114114
User.joins(:a, params[:column])
115115

116116
User.count_by_sql(params[:custom_sql_query])
117+
118+
# BAD: executes `SELECT users.* FROM #{params[:tab]}`
119+
# where `params[:tab]` is unsanitized
120+
User.all.from(params[:tab])
121+
# BAD: executes `SELECT "users".* FROM (SELECT "users".* FROM "users") #{params[:sq]}
122+
User.all.from(User.all, params[:sq])
117123
end
118124
end
119125

0 commit comments

Comments
 (0)