Skip to content

Commit f1cee70

Browse files
committed
add class-field flowstep to js/shell-command-constructed-from-input
1 parent 5a9e098 commit f1cee70

File tree

3 files changed

+35
-1
lines changed

3 files changed

+35
-1
lines changed

javascript/ql/src/semmle/javascript/security/dataflow/UnsafeShellCommandConstruction.qll

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,5 +41,15 @@ module UnsafeShellCommandConstruction {
4141
mid.getPathSummary().hasReturn() = false
4242
)
4343
}
44+
45+
override predicate isAdditionalTaintStep(DataFlow::Node pred, DataFlow::Node succ) {
46+
// flow-step from a property written in the constructor to a use in an instance method.
47+
// "simulates" client usage of a class, and regains some flow-steps lost by `hasFlowPath` above.
48+
exists(DataFlow::ClassNode clz, string name |
49+
pred =
50+
DataFlow::thisNode(clz.getConstructor().getFunction()).getAPropertyWrite(name).getRhs() and
51+
succ = DataFlow::thisNode(clz.getInstanceMethod(_).getFunction()).getAPropertyRead(name)
52+
)
53+
}
4454
}
4555
}

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,12 @@ nodes
195195
| lib/lib.js:343:29:343:34 | unsafe |
196196
| lib/lib.js:345:22:345:27 | unsafe |
197197
| lib/lib.js:345:22:345:27 | unsafe |
198+
| lib/lib.js:354:20:354:23 | opts |
199+
| lib/lib.js:354:20:354:23 | opts |
200+
| lib/lib.js:355:20:355:23 | opts |
201+
| lib/lib.js:355:20:355:34 | opts.learn_args |
202+
| lib/lib.js:360:28:360:42 | this.learn_args |
203+
| lib/lib.js:360:28:360:42 | this.learn_args |
198204
edges
199205
| lib/lib2.js:3:28:3:31 | name | lib/lib2.js:4:22:4:25 | name |
200206
| lib/lib2.js:3:28:3:31 | name | lib/lib2.js:4:22:4:25 | name |
@@ -425,6 +431,11 @@ edges
425431
| lib/lib.js:343:29:343:34 | unsafe | lib/lib.js:345:22:345:27 | unsafe |
426432
| lib/lib.js:343:29:343:34 | unsafe | lib/lib.js:345:22:345:27 | unsafe |
427433
| lib/lib.js:343:29:343:34 | unsafe | lib/lib.js:345:22:345:27 | unsafe |
434+
| lib/lib.js:354:20:354:23 | opts | lib/lib.js:355:20:355:23 | opts |
435+
| lib/lib.js:354:20:354:23 | opts | lib/lib.js:355:20:355:23 | opts |
436+
| lib/lib.js:355:20:355:23 | opts | lib/lib.js:355:20:355:34 | opts.learn_args |
437+
| lib/lib.js:355:20:355:34 | opts.learn_args | lib/lib.js:360:28:360:42 | this.learn_args |
438+
| lib/lib.js:355:20:355:34 | opts.learn_args | lib/lib.js:360:28:360:42 | this.learn_args |
428439
#select
429440
| lib/lib2.js:4:10:4:25 | "rm -rf " + name | lib/lib2.js:3:28:3:31 | name | lib/lib2.js:4:22:4:25 | name | $@ based on library input is later used in $@. | lib/lib2.js:4:10:4:25 | "rm -rf " + name | String concatenation | lib/lib2.js:4:2:4:26 | cp.exec ... + name) | shell command |
430441
| lib/lib2.js:8:10:8:25 | "rm -rf " + name | lib/lib2.js:7:32:7:35 | name | lib/lib2.js:8:22:8:25 | name | $@ based on library input is later used in $@. | lib/lib2.js:8:10:8:25 | "rm -rf " + name | String concatenation | lib/lib2.js:8:2:8:26 | cp.exec ... + name) | shell command |
@@ -481,3 +492,4 @@ edges
481492
| lib/lib.js:325:12:325:51 | "MyWind ... " + arg | lib/lib.js:324:40:324:42 | arg | lib/lib.js:325:49:325:51 | arg | $@ based on library input is later used in $@. | lib/lib.js:325:12:325:51 | "MyWind ... " + arg | String concatenation | lib/lib.js:326:2:326:13 | cp.exec(cmd) | shell command |
482493
| lib/lib.js:340:10:340:26 | "rm -rf " + id(n) | lib/lib.js:339:39:339:39 | n | lib/lib.js:340:22:340:26 | id(n) | $@ based on library input is later used in $@. | lib/lib.js:340:10:340:26 | "rm -rf " + id(n) | String concatenation | lib/lib.js:340:2:340:27 | cp.exec ... id(n)) | shell command |
483494
| lib/lib.js:345:10:345:27 | "rm -rf " + unsafe | lib/lib.js:343:29:343:34 | unsafe | lib/lib.js:345:22:345:27 | unsafe | $@ based on library input is later used in $@. | lib/lib.js:345:10:345:27 | "rm -rf " + unsafe | String concatenation | lib/lib.js:345:2:345:28 | cp.exec ... unsafe) | shell command |
495+
| lib/lib.js:360:17:360:56 | "learn ... + model | lib/lib.js:354:20:354:23 | opts | lib/lib.js:360:28:360:42 | this.learn_args | $@ based on library input is later used in $@. | lib/lib.js:360:17:360:56 | "learn ... + model | String concatenation | lib/lib.js:361:3:361:18 | cp.exec(command) | shell command |

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -349,4 +349,16 @@ Object.defineProperty(module.exports, "boundProblem", {
349349
get: function () {
350350
return boundProblem.bind(this, "safe");
351351
}
352-
});
352+
});
353+
354+
function MyTrainer(opts) {
355+
this.learn_args = opts.learn_args
356+
}
357+
358+
MyTrainer.prototype = {
359+
train: function() {
360+
var command = "learn " + this.learn_args + " " + model; // NOT OK
361+
cp.exec(command);
362+
}
363+
};
364+
module.exports.MyTrainer = MyTrainer;

0 commit comments

Comments
 (0)