Skip to content

Commit 1b58870

Browse files
author
Max Schaefer
authored
Merge pull request #988 from asger-semmle/spread-taint-step
JS: add taint step through object/array spread operators
2 parents c945b77 + 29d2d62 commit 1b58870

File tree

3 files changed

+19
-0
lines changed

3 files changed

+19
-0
lines changed

javascript/ql/src/semmle/javascript/dataflow/TaintTracking.qll

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,12 @@ module TaintTracking {
185185
or
186186
// awaiting a tainted expression gives a tainted result
187187
e.(AwaitExpr).getOperand() = f
188+
or
189+
// spreading a tainted object into an object literal gives a tainted object
190+
e.(ObjectExpr).getAProperty().(SpreadProperty).getInit().(SpreadElement).getOperand() = f
191+
or
192+
// spreading a tainted value into an array literal gives a tainted array
193+
e.(ArrayExpr).getAnElement().(SpreadElement).getOperand() = f
188194
)
189195
or
190196
// reading from a tainted object yields a tainted result

javascript/ql/test/library-tests/TaintTracking/BasicTaintTracking.expected

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@
3030
| sanitizer-guards.js:13:14:13:21 | source() | sanitizer-guards.js:15:10:15:15 | this.x |
3131
| sanitizer-guards.js:13:14:13:21 | source() | sanitizer-guards.js:21:14:21:19 | this.x |
3232
| sanitizer-guards.js:13:14:13:21 | source() | sanitizer-guards.js:26:9:26:14 | this.x |
33+
| spread.js:2:15:2:22 | source() | spread.js:4:8:4:19 | { ...taint } |
34+
| spread.js:2:15:2:22 | source() | spread.js:5:8:5:43 | { f: 'h ... orld' } |
35+
| spread.js:2:15:2:22 | source() | spread.js:7:8:7:19 | [ ...taint ] |
36+
| spread.js:2:15:2:22 | source() | spread.js:8:8:8:28 | [ 1, 2, ... nt, 3 ] |
3337
| thisAssignments.js:4:17:4:24 | source() | thisAssignments.js:5:10:5:18 | obj.field |
3438
| thisAssignments.js:7:19:7:26 | source() | thisAssignments.js:8:10:8:20 | this.field2 |
3539
| tst.js:2:13:2:20 | source() | tst.js:4:10:4:10 | x |
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
function test() {
2+
let taint = source();
3+
4+
sink({ ...taint }); // NOT OK
5+
sink({ f: 'hello', ...taint, g: 'world' }); // NOT OK
6+
7+
sink([ ...taint ]); // NOT OK
8+
sink([ 1, 2, ...taint, 3 ]); // NOT OK
9+
}

0 commit comments

Comments
 (0)