Skip to content

Commit f33cd8b

Browse files
authored
add command parsing model for argparse
1 parent 45067ee commit f33cd8b

File tree

3 files changed

+28
-0
lines changed

3 files changed

+28
-0
lines changed

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,14 @@ module IndirectCommandInjection {
5252
or
5353
// `require("arg")({...spec})` => `{_: [], a: ..., b: ...}`
5454
this = DataFlow::moduleImport("arg").getACall()
55+
or
56+
// https://www.npmjs.com/package/argparse
57+
this =
58+
API::moduleImport("argparse")
59+
.getMember("ArgumentParser")
60+
.getInstance()
61+
.getMember("parse_args")
62+
.getACall()
5563
}
5664
}
5765

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,11 @@ nodes
153153
| command-line-parameter-command-injection.js:92:10:92:30 | "cmd.sh ... ags.foo |
154154
| command-line-parameter-command-injection.js:92:22:92:26 | flags |
155155
| command-line-parameter-command-injection.js:92:22:92:30 | flags.foo |
156+
| command-line-parameter-command-injection.js:102:10:102:44 | "cmd.sh ... s().foo |
157+
| command-line-parameter-command-injection.js:102:10:102:44 | "cmd.sh ... s().foo |
158+
| command-line-parameter-command-injection.js:102:22:102:40 | parser.parse_args() |
159+
| command-line-parameter-command-injection.js:102:22:102:40 | parser.parse_args() |
160+
| command-line-parameter-command-injection.js:102:22:102:44 | parser. ... s().foo |
156161
edges
157162
| command-line-parameter-command-injection.js:4:10:4:21 | process.argv | command-line-parameter-command-injection.js:4:10:4:21 | process.argv |
158163
| 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] |
@@ -288,6 +293,10 @@ edges
288293
| command-line-parameter-command-injection.js:92:22:92:26 | flags | command-line-parameter-command-injection.js:92:22:92:30 | flags.foo |
289294
| command-line-parameter-command-injection.js:92:22:92:30 | flags.foo | command-line-parameter-command-injection.js:92:10:92:30 | "cmd.sh ... ags.foo |
290295
| command-line-parameter-command-injection.js:92:22:92:30 | flags.foo | command-line-parameter-command-injection.js:92:10:92:30 | "cmd.sh ... ags.foo |
296+
| command-line-parameter-command-injection.js:102:22:102:40 | parser.parse_args() | command-line-parameter-command-injection.js:102:22:102:44 | parser. ... s().foo |
297+
| command-line-parameter-command-injection.js:102:22:102:40 | parser.parse_args() | command-line-parameter-command-injection.js:102:22:102:44 | parser. ... s().foo |
298+
| command-line-parameter-command-injection.js:102:22:102:44 | parser. ... s().foo | command-line-parameter-command-injection.js:102:10:102:44 | "cmd.sh ... s().foo |
299+
| command-line-parameter-command-injection.js:102:22:102:44 | parser. ... s().foo | command-line-parameter-command-injection.js:102:10:102:44 | "cmd.sh ... s().foo |
291300
#select
292301
| 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 |
293302
| 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 |
@@ -314,3 +323,4 @@ edges
314323
| command-line-parameter-command-injection.js:85:10:85:59 | "cmd.sh ... 2)).foo | command-line-parameter-command-injection.js:85:34:85:45 | process.argv | command-line-parameter-command-injection.js:85:10:85:59 | "cmd.sh ... 2)).foo | This command depends on an unsanitized $@. | command-line-parameter-command-injection.js:85:34:85:45 | process.argv | command-line argument |
315324
| command-line-parameter-command-injection.js:89:10:89:30 | "cmd.sh ... ags.foo | command-line-parameter-command-injection.js:88:25:88:36 | process.argv | command-line-parameter-command-injection.js:89:10:89:30 | "cmd.sh ... ags.foo | This command depends on an unsanitized $@. | command-line-parameter-command-injection.js:88:25:88:36 | process.argv | command-line argument |
316325
| command-line-parameter-command-injection.js:92:10:92:30 | "cmd.sh ... ags.foo | command-line-parameter-command-injection.js:91:14:91:38 | require ... .spec}) | command-line-parameter-command-injection.js:92:10:92:30 | "cmd.sh ... ags.foo | This command depends on an unsanitized $@. | command-line-parameter-command-injection.js:91:14:91:38 | require ... .spec}) | command-line argument |
326+
| 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 |

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,3 +91,13 @@ cp.exec("cmd.sh " + require("optimist").argv.foo); // NOT OK
9191
var flags = require('arg')({...spec});
9292
cp.exec("cmd.sh " + flags.foo); // NOT OK
9393
})
94+
95+
(function () {
96+
const { ArgumentParser } = require('argparse');
97+
98+
const parser = new ArgumentParser({description: 'Argparse example'});
99+
100+
parser.add_argument('-f', '--foo', { help: 'foo bar' });
101+
102+
cp.exec("cmd.sh " + parser.parse_args().foo); // NOT OK
103+
})

0 commit comments

Comments
 (0)