Skip to content

Commit d2c7448

Browse files
committed
add taint step through flatten libraries
1 parent 77f4d56 commit d2c7448

File tree

4 files changed

+26
-1
lines changed

4 files changed

+26
-1
lines changed

javascript/change-notes/2021-07-15-array-libs.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,8 @@ lgtm,codescanning
88
[array-ify](https://npmjs.com/package/array-ify),
99
[array-union](https://npmjs.com/package/array-union),
1010
[array-uniq](https://npmjs.com/package/array-uniq),
11-
[uniq](https://npmjs.com/package/uniq)
11+
[uniq](https://npmjs.com/package/uniq),
12+
[array-flatten](https://npmjs.com/package/array-flatten),
13+
[arr-flatten](https://npmjs.com/package/arr-flatten),
14+
[flatten](https://npmjs.com/package/flatten),
15+
[array.prototype.flat](https://npmjs.com/package/array.prototype.flat)

javascript/ql/src/semmle/javascript/Arrays.qll

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,4 +389,21 @@ private module ArrayLibraries {
389389
)
390390
}
391391
}
392+
393+
/**
394+
* A taint step through a call to `Array.prototype.flat` or a polyfill implementing array flattening.
395+
*/
396+
private class ArrayFlatStep extends TaintTracking::SharedTaintStep {
397+
override predicate step(DataFlow::Node pred, DataFlow::Node succ) {
398+
exists(DataFlow::CallNode call | succ = call |
399+
call.(DataFlow::MethodCallNode).getMethodName() = "flat" and
400+
pred = call.getReceiver()
401+
or
402+
call =
403+
API::moduleImport(["array-flatten", "arr-flatten", "flatten", "array.prototype.flat"])
404+
.getACall() and
405+
pred = call.getAnArgument()
406+
)
407+
}
408+
}
392409
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ typeInferenceMismatch
1515
| arrays.js:2:15:2:22 | source() | arrays.js:5:10:5:20 | arrify(foo) |
1616
| arrays.js:2:15:2:22 | source() | arrays.js:8:10:8:22 | arrayIfy(foo) |
1717
| arrays.js:2:15:2:22 | source() | arrays.js:11:10:11:28 | union(["bla"], foo) |
18+
| arrays.js:2:15:2:22 | source() | arrays.js:14:10:14:18 | flat(foo) |
1819
| booleanOps.js:2:11:2:18 | source() | booleanOps.js:4:8:4:8 | x |
1920
| booleanOps.js:2:11:2:18 | source() | booleanOps.js:13:10:13:10 | x |
2021
| booleanOps.js:2:11:2:18 | source() | booleanOps.js:19:10:19:10 | x |

javascript/ql/test/library-tests/TaintTracking/arrays.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,7 @@ function test() {
99

1010
const union = require("array-union");
1111
sink(union(["bla"], foo)); // NOT OK
12+
13+
const flat = require("arr-flatten");
14+
sink(flat(foo)); // NOT OK
1215
}

0 commit comments

Comments
 (0)