Skip to content

Commit 142393b

Browse files
committed
Ruby: Handle unknown content in splat flow
1 parent 4239268 commit 142393b

File tree

3 files changed

+22
-3
lines changed

3 files changed

+22
-3
lines changed

ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -812,7 +812,11 @@ private module ParameterNodes {
812812
ParameterNode getAParameter(ContentSet c) {
813813
exists(int n |
814814
isParameterNode(result, callable, (any(ParameterPosition p | p.isPositional(n)))) and
815-
c = getPositionalContent(n)
815+
(
816+
c = getPositionalContent(n)
817+
or
818+
c.isSingleton(TUnknownElementContent())
819+
)
816820
)
817821
}
818822

ruby/ql/test/library-tests/dataflow/params/params-flow.expected

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,11 @@ edges
9898
| params_flow.rb:108:44:108:44 | c | params_flow.rb:111:10:111:10 | c |
9999
| params_flow.rb:114:33:114:41 | call to taint | params_flow.rb:108:37:108:37 | a |
100100
| params_flow.rb:114:58:114:66 | call to taint | params_flow.rb:108:44:108:44 | c |
101+
| params_flow.rb:117:1:117:1 | [post] x [element] | params_flow.rb:118:13:118:13 | x [element] |
102+
| params_flow.rb:117:19:117:27 | call to taint | params_flow.rb:117:1:117:1 | [post] x [element] |
103+
| params_flow.rb:118:12:118:13 | * ... [element] | params_flow.rb:9:16:9:17 | p1 |
104+
| params_flow.rb:118:12:118:13 | * ... [element] | params_flow.rb:9:20:9:21 | p2 |
105+
| params_flow.rb:118:13:118:13 | x [element] | params_flow.rb:118:12:118:13 | * ... [element] |
101106
nodes
102107
| params_flow.rb:9:16:9:17 | p1 | semmle.label | p1 |
103108
| params_flow.rb:9:20:9:21 | p2 | semmle.label | p2 |
@@ -217,13 +222,19 @@ nodes
217222
| params_flow.rb:111:10:111:10 | c | semmle.label | c |
218223
| params_flow.rb:114:33:114:41 | call to taint | semmle.label | call to taint |
219224
| params_flow.rb:114:58:114:66 | call to taint | semmle.label | call to taint |
225+
| params_flow.rb:117:1:117:1 | [post] x [element] | semmle.label | [post] x [element] |
226+
| params_flow.rb:117:19:117:27 | call to taint | semmle.label | call to taint |
227+
| params_flow.rb:118:12:118:13 | * ... [element] | semmle.label | * ... [element] |
228+
| params_flow.rb:118:13:118:13 | x [element] | semmle.label | x [element] |
220229
subpaths
221230
#select
222231
| params_flow.rb:10:10:10:11 | p1 | params_flow.rb:14:12:14:19 | call to taint | params_flow.rb:10:10:10:11 | p1 | $@ | params_flow.rb:14:12:14:19 | call to taint | call to taint |
223232
| params_flow.rb:10:10:10:11 | p1 | params_flow.rb:44:12:44:20 | call to taint | params_flow.rb:10:10:10:11 | p1 | $@ | params_flow.rb:44:12:44:20 | call to taint | call to taint |
224233
| params_flow.rb:10:10:10:11 | p1 | params_flow.rb:46:9:46:17 | call to taint | params_flow.rb:10:10:10:11 | p1 | $@ | params_flow.rb:46:9:46:17 | call to taint | call to taint |
234+
| params_flow.rb:10:10:10:11 | p1 | params_flow.rb:117:19:117:27 | call to taint | params_flow.rb:10:10:10:11 | p1 | $@ | params_flow.rb:117:19:117:27 | call to taint | call to taint |
225235
| params_flow.rb:11:10:11:11 | p2 | params_flow.rb:14:22:14:29 | call to taint | params_flow.rb:11:10:11:11 | p2 | $@ | params_flow.rb:14:22:14:29 | call to taint | call to taint |
226236
| params_flow.rb:11:10:11:11 | p2 | params_flow.rb:46:20:46:28 | call to taint | params_flow.rb:11:10:11:11 | p2 | $@ | params_flow.rb:46:20:46:28 | call to taint | call to taint |
237+
| params_flow.rb:11:10:11:11 | p2 | params_flow.rb:117:19:117:27 | call to taint | params_flow.rb:11:10:11:11 | p2 | $@ | params_flow.rb:117:19:117:27 | call to taint | call to taint |
227238
| params_flow.rb:17:10:17:11 | p1 | params_flow.rb:21:13:21:20 | call to taint | params_flow.rb:17:10:17:11 | p1 | $@ | params_flow.rb:21:13:21:20 | call to taint | call to taint |
228239
| params_flow.rb:17:10:17:11 | p1 | params_flow.rb:22:27:22:34 | call to taint | params_flow.rb:17:10:17:11 | p1 | $@ | params_flow.rb:22:27:22:34 | call to taint | call to taint |
229240
| params_flow.rb:17:10:17:11 | p1 | params_flow.rb:23:33:23:40 | call to taint | params_flow.rb:17:10:17:11 | p1 | $@ | params_flow.rb:23:33:23:40 | call to taint | call to taint |

ruby/ql/test/library-tests/dataflow/params/params_flow.rb

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ def sink x
77
end
88

99
def positional(p1, p2)
10-
sink p1 # $ hasValueFlow=1 $ hasValueFlow=16 $ hasValueFlow=18
11-
sink p2 # $ hasValueFlow=2 $ hasValueFlow=19 $ MISSING: hasValueFlow=17
10+
sink p1 # $ hasValueFlow=1 $ hasValueFlow=16 $ hasValueFlow=18 $ hasValueFlow=61
11+
sink p2 # $ hasValueFlow=2 $ hasValueFlow=19 $ hasValueFlow=61 $ MISSING: hasValueFlow=17
1212
end
1313

1414
positional(taint(1), taint(2))
@@ -112,3 +112,7 @@ def splat_followed_by_keyword_param(a, *b, c:)
112112
end
113113

114114
splat_followed_by_keyword_param(taint(58), taint(59), c: taint(60))
115+
116+
x = []
117+
x[some_index()] = taint(61)
118+
positional(*x)

0 commit comments

Comments
 (0)