Skip to content

Commit 2b2d691

Browse files
committed
don't treated a property from a tainted object as tainted when there exists a dominating write
1 parent 5e4acfb commit 2b2d691

File tree

3 files changed

+3
-10
lines changed

3 files changed

+3
-10
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,8 @@ module TaintTracking {
260260
not any(PromiseAllCreation call).getArrayNode() = succ
261261
or
262262
// reading from a tainted object yields a tainted result
263-
succ.(DataFlow::PropRead).getBase() = pred
263+
succ.(DataFlow::PropRead).getBase() = pred and
264+
not AccessPath::DominatingPaths::hasDominatingWrite(succ)
264265
or
265266
// iterating over a tainted iterator taints the loop variable
266267
exists(ForOfStmt fos |

javascript/ql/test/query-tests/Security/CWE-078/UnsafeShellCommandConstruction.expected

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -161,9 +161,6 @@ nodes
161161
| lib/lib.js:268:22:268:24 | obj |
162162
| lib/lib.js:268:22:268:32 | obj.version |
163163
| lib/lib.js:268:22:268:32 | obj.version |
164-
| lib/lib.js:272:22:272:24 | obj |
165-
| lib/lib.js:272:22:272:32 | obj.version |
166-
| lib/lib.js:272:22:272:32 | obj.version |
167164
| lib/lib.js:276:8:276:11 | opts |
168165
| lib/lib.js:276:8:276:11 | opts |
169166
| lib/lib.js:277:23:277:26 | opts |
@@ -373,12 +370,8 @@ edges
373370
| lib/lib.js:257:35:257:38 | name | lib/lib.js:261:30:261:33 | name |
374371
| lib/lib.js:267:46:267:48 | obj | lib/lib.js:268:22:268:24 | obj |
375372
| lib/lib.js:267:46:267:48 | obj | lib/lib.js:268:22:268:24 | obj |
376-
| lib/lib.js:267:46:267:48 | obj | lib/lib.js:272:22:272:24 | obj |
377-
| lib/lib.js:267:46:267:48 | obj | lib/lib.js:272:22:272:24 | obj |
378373
| lib/lib.js:268:22:268:24 | obj | lib/lib.js:268:22:268:32 | obj.version |
379374
| lib/lib.js:268:22:268:24 | obj | lib/lib.js:268:22:268:32 | obj.version |
380-
| lib/lib.js:272:22:272:24 | obj | lib/lib.js:272:22:272:32 | obj.version |
381-
| lib/lib.js:272:22:272:24 | obj | lib/lib.js:272:22:272:32 | obj.version |
382375
| lib/lib.js:276:8:276:11 | opts | lib/lib.js:277:23:277:26 | opts |
383376
| lib/lib.js:276:8:276:11 | opts | lib/lib.js:277:23:277:26 | opts |
384377
| lib/lib.js:277:23:277:26 | opts | lib/lib.js:277:23:277:30 | opts.bla |
@@ -444,7 +437,6 @@ edges
444437
| lib/lib.js:258:10:258:25 | "rm -rf " + name | lib/lib.js:257:35:257:38 | name | lib/lib.js:258:22:258:25 | name | $@ based on libary input is later used in $@. | lib/lib.js:258:10:258:25 | "rm -rf " + name | String concatenation | lib/lib.js:258:2:258:26 | cp.exec ... + name) | shell command |
445438
| lib/lib.js:261:11:261:33 | "rm -rf ... + name | lib/lib.js:257:35:257:38 | name | lib/lib.js:261:30:261:33 | name | $@ based on libary input is later used in $@. | lib/lib.js:261:11:261:33 | "rm -rf ... + name | String concatenation | lib/lib.js:261:3:261:34 | cp.exec ... + name) | shell command |
446439
| lib/lib.js:268:10:268:32 | "rm -rf ... version | lib/lib.js:267:46:267:48 | obj | lib/lib.js:268:22:268:32 | obj.version | $@ based on libary input is later used in $@. | lib/lib.js:268:10:268:32 | "rm -rf ... version | String concatenation | lib/lib.js:268:2:268:33 | cp.exec ... ersion) | shell command |
447-
| lib/lib.js:272:10:272:32 | "rm -rf ... version | lib/lib.js:267:46:267:48 | obj | lib/lib.js:272:22:272:32 | obj.version | $@ based on libary input is later used in $@. | lib/lib.js:272:10:272:32 | "rm -rf ... version | String concatenation | lib/lib.js:272:2:272:33 | cp.exec ... ersion) | shell command |
448440
| lib/lib.js:277:11:277:30 | "rm -rf " + opts.bla | lib/lib.js:276:8:276:11 | opts | lib/lib.js:277:23:277:30 | opts.bla | $@ based on libary input is later used in $@. | lib/lib.js:277:11:277:30 | "rm -rf " + opts.bla | String concatenation | lib/lib.js:277:3:277:31 | cp.exec ... ts.bla) | shell command |
449441
| lib/lib.js:308:11:308:26 | "rm -rf " + name | lib/lib.js:307:39:307:42 | name | lib/lib.js:308:23:308:26 | name | $@ based on libary input is later used in $@. | lib/lib.js:308:11:308:26 | "rm -rf " + name | String concatenation | lib/lib.js:308:3:308:27 | cp.exec ... + name) | shell command |
450442
| lib/lib.js:315:10:315:25 | "rm -rf " + name | lib/lib.js:314:40:314:43 | name | lib/lib.js:315:22:315:25 | name | $@ based on libary input is later used in $@. | lib/lib.js:315:10:315:25 | "rm -rf " + name | String concatenation | lib/lib.js:315:2:315:26 | cp.exec ... + name) | shell command |

javascript/ql/test/query-tests/Security/CWE-078/lib/lib.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ module.exports.sanitizerProperty = function (obj) {
269269

270270
obj.version = "";
271271

272-
cp.exec("rm -rf " + obj.version); // OK - but FP
272+
cp.exec("rm -rf " + obj.version); // OK
273273
}
274274

275275
module.exports.Foo = class Foo {

0 commit comments

Comments
 (0)