Skip to content

Commit ee77404

Browse files
committed
Ruby: Add ActiveJob::Serializers.deserialize as a code execution sink
1 parent 4a39e4a commit ee77404

File tree

3 files changed

+34
-0
lines changed

3 files changed

+34
-0
lines changed

ruby/ql/lib/codeql/ruby/Frameworks.qll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
private import codeql.ruby.frameworks.Core
66
private import codeql.ruby.frameworks.ActionCable
77
private import codeql.ruby.frameworks.ActionController
8+
private import codeql.ruby.frameworks.ActiveJob
89
private import codeql.ruby.frameworks.ActiveRecord
910
private import codeql.ruby.frameworks.ActiveResource
1011
private import codeql.ruby.frameworks.ActiveStorage
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/**
2+
* Modeling for `ActiveJob`, a framweork for declaring and enqueueing jobs that
3+
* ships with Rails.
4+
* https://rubygems.org/gems/activejob
5+
*/
6+
7+
private import codeql.ruby.ApiGraphs
8+
private import codeql.ruby.Concepts
9+
private import codeql.ruby.DataFlow
10+
11+
/** Modeling for `ActiveJob`. */
12+
module ActiveJob {
13+
/**
14+
* `ActiveJob::Serializers`
15+
*/
16+
module Serializers {
17+
/**
18+
* A call to `ActiveJob::Serializers.deserialize`, which interprets part of
19+
* its argument as a Ruby constant.
20+
*/
21+
class DeserializeCall extends DataFlow::CallNode, CodeExecution::Range {
22+
DeserializeCall() {
23+
this =
24+
API::getTopLevelMember("ActiveJob").getMember("Serializers").getAMethodCall("deserialize")
25+
}
26+
27+
override DataFlow::Node getCode() { result = this.getArgument(0) }
28+
}
29+
}
30+
}

ruby/ql/test/query-tests/security/cwe-094/CodeInjection.expected

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ edges
66
| CodeInjection.rb:5:12:5:24 | ...[...] : | CodeInjection.rb:29:15:29:18 | code |
77
| CodeInjection.rb:5:12:5:24 | ...[...] : | CodeInjection.rb:32:19:32:22 | code |
88
| CodeInjection.rb:5:12:5:24 | ...[...] : | CodeInjection.rb:38:24:38:27 | code : |
9+
| CodeInjection.rb:5:12:5:24 | ...[...] : | CodeInjection.rb:41:40:41:43 | code |
910
| CodeInjection.rb:38:24:38:27 | code : | CodeInjection.rb:38:10:38:28 | call to escape |
1011
nodes
1112
| CodeInjection.rb:5:12:5:17 | call to params : | semmle.label | call to params : |
@@ -18,6 +19,7 @@ nodes
1819
| CodeInjection.rb:32:19:32:22 | code | semmle.label | code |
1920
| CodeInjection.rb:38:10:38:28 | call to escape | semmle.label | call to escape |
2021
| CodeInjection.rb:38:24:38:27 | code : | semmle.label | code : |
22+
| CodeInjection.rb:41:40:41:43 | code | semmle.label | code |
2123
subpaths
2224
#select
2325
| CodeInjection.rb:8:10:8:13 | code | CodeInjection.rb:5:12:5:17 | call to params : | CodeInjection.rb:8:10:8:13 | code | This code execution depends on a $@. | CodeInjection.rb:5:12:5:17 | call to params | user-provided value |
@@ -27,3 +29,4 @@ subpaths
2729
| CodeInjection.rb:29:15:29:18 | code | CodeInjection.rb:5:12:5:17 | call to params : | CodeInjection.rb:29:15:29:18 | code | This code execution depends on a $@. | CodeInjection.rb:5:12:5:17 | call to params | user-provided value |
2830
| CodeInjection.rb:32:19:32:22 | code | CodeInjection.rb:5:12:5:17 | call to params : | CodeInjection.rb:32:19:32:22 | code | This code execution depends on a $@. | CodeInjection.rb:5:12:5:17 | call to params | user-provided value |
2931
| CodeInjection.rb:38:10:38:28 | call to escape | CodeInjection.rb:5:12:5:17 | call to params : | CodeInjection.rb:38:10:38:28 | call to escape | This code execution depends on a $@. | CodeInjection.rb:5:12:5:17 | call to params | user-provided value |
32+
| CodeInjection.rb:41:40:41:43 | code | CodeInjection.rb:5:12:5:17 | call to params : | CodeInjection.rb:41:40:41:43 | code | This code execution depends on a $@. | CodeInjection.rb:5:12:5:17 | call to params | user-provided value |

0 commit comments

Comments
 (0)