Skip to content

Commit 653ebf7

Browse files
authored
add command parsing model for "dashdash"
1 parent 269de49 commit 653ebf7

File tree

3 files changed

+49
-1
lines changed

3 files changed

+49
-1
lines changed

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,13 @@ module IndirectCommandInjection {
6666
or
6767
// `require('meow')(help, {...spec})` => `{a: ..., b: ....}`
6868
this = DataFlow::moduleImport("meow").getACall()
69+
or
70+
// https://www.npmjs.com/package/dashdash
71+
this =
72+
[
73+
API::moduleImport("dashdash"),
74+
API::moduleImport("dashdash").getMember("createParser").getReturn()
75+
].getMember("parse").getACall()
6976
}
7077
}
7178

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

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,20 @@ nodes
173173
| command-line-parameter-command-injection.js:116:22:116:24 | cli |
174174
| command-line-parameter-command-injection.js:116:22:116:30 | cli.input |
175175
| command-line-parameter-command-injection.js:116:22:116:33 | cli.input[0] |
176+
| command-line-parameter-command-injection.js:122:6:122:46 | opts |
177+
| command-line-parameter-command-injection.js:122:13:122:46 | dashdas ... tions}) |
178+
| command-line-parameter-command-injection.js:122:13:122:46 | dashdas ... tions}) |
179+
| command-line-parameter-command-injection.js:124:10:124:29 | "cmd.sh " + opts.foo |
180+
| command-line-parameter-command-injection.js:124:10:124:29 | "cmd.sh " + opts.foo |
181+
| command-line-parameter-command-injection.js:124:22:124:25 | opts |
182+
| command-line-parameter-command-injection.js:124:22:124:29 | opts.foo |
183+
| command-line-parameter-command-injection.js:127:6:127:38 | opts |
184+
| command-line-parameter-command-injection.js:127:13:127:38 | parser. ... s.argv) |
185+
| command-line-parameter-command-injection.js:127:13:127:38 | parser. ... s.argv) |
186+
| command-line-parameter-command-injection.js:129:10:129:29 | "cmd.sh " + opts.foo |
187+
| command-line-parameter-command-injection.js:129:10:129:29 | "cmd.sh " + opts.foo |
188+
| command-line-parameter-command-injection.js:129:22:129:25 | opts |
189+
| command-line-parameter-command-injection.js:129:22:129:29 | opts.foo |
176190
edges
177191
| command-line-parameter-command-injection.js:4:10:4:21 | process.argv | command-line-parameter-command-injection.js:4:10:4:21 | process.argv |
178192
| command-line-parameter-command-injection.js:8:22:8:33 | process.argv | command-line-parameter-command-injection.js:8:22:8:36 | process.argv[2] |
@@ -325,6 +339,18 @@ edges
325339
| command-line-parameter-command-injection.js:116:22:116:30 | cli.input | command-line-parameter-command-injection.js:116:22:116:33 | cli.input[0] |
326340
| command-line-parameter-command-injection.js:116:22:116:33 | cli.input[0] | command-line-parameter-command-injection.js:116:10:116:33 | "cmd.sh ... nput[0] |
327341
| command-line-parameter-command-injection.js:116:22:116:33 | cli.input[0] | command-line-parameter-command-injection.js:116:10:116:33 | "cmd.sh ... nput[0] |
342+
| command-line-parameter-command-injection.js:122:6:122:46 | opts | command-line-parameter-command-injection.js:124:22:124:25 | opts |
343+
| command-line-parameter-command-injection.js:122:13:122:46 | dashdas ... tions}) | command-line-parameter-command-injection.js:122:6:122:46 | opts |
344+
| command-line-parameter-command-injection.js:122:13:122:46 | dashdas ... tions}) | command-line-parameter-command-injection.js:122:6:122:46 | opts |
345+
| command-line-parameter-command-injection.js:124:22:124:25 | opts | command-line-parameter-command-injection.js:124:22:124:29 | opts.foo |
346+
| command-line-parameter-command-injection.js:124:22:124:29 | opts.foo | command-line-parameter-command-injection.js:124:10:124:29 | "cmd.sh " + opts.foo |
347+
| command-line-parameter-command-injection.js:124:22:124:29 | opts.foo | command-line-parameter-command-injection.js:124:10:124:29 | "cmd.sh " + opts.foo |
348+
| command-line-parameter-command-injection.js:127:6:127:38 | opts | command-line-parameter-command-injection.js:129:22:129:25 | opts |
349+
| command-line-parameter-command-injection.js:127:13:127:38 | parser. ... s.argv) | command-line-parameter-command-injection.js:127:6:127:38 | opts |
350+
| command-line-parameter-command-injection.js:127:13:127:38 | parser. ... s.argv) | command-line-parameter-command-injection.js:127:6:127:38 | opts |
351+
| command-line-parameter-command-injection.js:129:22:129:25 | opts | command-line-parameter-command-injection.js:129:22:129:29 | opts.foo |
352+
| command-line-parameter-command-injection.js:129:22:129:29 | opts.foo | command-line-parameter-command-injection.js:129:10:129:29 | "cmd.sh " + opts.foo |
353+
| command-line-parameter-command-injection.js:129:22:129:29 | opts.foo | command-line-parameter-command-injection.js:129:10:129:29 | "cmd.sh " + opts.foo |
328354
#select
329355
| command-line-parameter-command-injection.js:4:10:4:21 | process.argv | command-line-parameter-command-injection.js:4:10:4:21 | process.argv | command-line-parameter-command-injection.js:4:10:4:21 | process.argv | This command depends on an unsanitized $@. | command-line-parameter-command-injection.js:4:10:4:21 | process.argv | command-line argument |
330356
| command-line-parameter-command-injection.js:8:10:8:36 | "cmd.sh ... argv[2] | command-line-parameter-command-injection.js:8:22:8:33 | process.argv | command-line-parameter-command-injection.js:8:10:8:36 | "cmd.sh ... argv[2] | This command depends on an unsanitized $@. | command-line-parameter-command-injection.js:8:22:8:33 | process.argv | command-line argument |
@@ -354,3 +380,5 @@ edges
354380
| command-line-parameter-command-injection.js:102:10:102:44 | "cmd.sh ... s().foo | command-line-parameter-command-injection.js:102:22:102:40 | parser.parse_args() | command-line-parameter-command-injection.js:102:10:102:44 | "cmd.sh ... s().foo | This command depends on an unsanitized $@. | command-line-parameter-command-injection.js:102:22:102:40 | parser.parse_args() | command-line argument |
355381
| command-line-parameter-command-injection.js:108:10:108:32 | "cmd.sh ... ons.foo | command-line-parameter-command-injection.js:107:18:107:51 | command ... itions) | command-line-parameter-command-injection.js:108:10:108:32 | "cmd.sh ... ons.foo | This command depends on an unsanitized $@. | command-line-parameter-command-injection.js:107:18:107:51 | command ... itions) | command-line argument |
356382
| command-line-parameter-command-injection.js:116:10:116:33 | "cmd.sh ... nput[0] | command-line-parameter-command-injection.js:114:14:114:52 | meow(`h ... lags}}) | command-line-parameter-command-injection.js:116:10:116:33 | "cmd.sh ... nput[0] | This command depends on an unsanitized $@. | command-line-parameter-command-injection.js:114:14:114:52 | meow(`h ... lags}}) | command-line argument |
383+
| command-line-parameter-command-injection.js:124:10:124:29 | "cmd.sh " + opts.foo | command-line-parameter-command-injection.js:122:13:122:46 | dashdas ... tions}) | command-line-parameter-command-injection.js:124:10:124:29 | "cmd.sh " + opts.foo | This command depends on an unsanitized $@. | command-line-parameter-command-injection.js:122:13:122:46 | dashdas ... tions}) | command-line argument |
384+
| command-line-parameter-command-injection.js:129:10:129:29 | "cmd.sh " + opts.foo | command-line-parameter-command-injection.js:127:13:127:38 | parser. ... s.argv) | command-line-parameter-command-injection.js:129:10:129:29 | "cmd.sh " + opts.foo | This command depends on an unsanitized $@. | command-line-parameter-command-injection.js:127:13:127:38 | parser. ... s.argv) | command-line argument |

javascript/ql/test/query-tests/Security/CWE-078/command-line-parameter-command-injection.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,4 +114,17 @@ cp.exec("cmd.sh " + require("optimist").argv.foo); // NOT OK
114114
const cli = meow(`helpstring`, {flags: {...flags}});
115115

116116
cp.exec("cmd.sh " + cli.input[0]); // NOT OK
117-
});
117+
});
118+
119+
(function () {
120+
var dashdash = require('dashdash');
121+
122+
var opts = dashdash.parse({options: options});
123+
124+
cp.exec("cmd.sh " + opts.foo); // NOT OK
125+
126+
var parser = dashdash.createParser({options: options});
127+
var opts = parser.parse();
128+
129+
cp.exec("cmd.sh " + opts.foo); // NOT OK
130+
})

0 commit comments

Comments
 (0)