Skip to content

Commit 6b4e34d

Browse files
committed
Added a step from parse to opts for commander js
1 parent e980798 commit 6b4e34d

File tree

3 files changed

+21
-2
lines changed

3 files changed

+21
-2
lines changed

javascript/ql/lib/semmle/javascript/frameworks/CommandLineArguments.qll

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,11 @@ private class ArgsParseStep extends TaintTracking::SharedTaintStep {
9595
pred = call.getArgument(0)
9696
)
9797
or
98+
exists(API::Node commanderNode | commanderNode = commander() |
99+
pred = commanderNode.getMember("parse").getACall().getAnArgument() and
100+
succ = commanderNode.getMember("opts").getACall()
101+
)
102+
or
98103
exists(DataFlow::MethodCallNode methodCall | methodCall = yargs() |
99104
pred = methodCall.getReceiver() and
100105
succ = methodCall

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
| child_process-test.js:75:29:75:31 | cmd | child_process-test.js:73:25:73:31 | req.url | child_process-test.js:75:29:75:31 | cmd | This command line depends on a $@. | child_process-test.js:73:25:73:31 | req.url | user-provided value |
2222
| child_process-test.js:83:19:83:36 | req.query.fileName | child_process-test.js:83:19:83:36 | req.query.fileName | child_process-test.js:83:19:83:36 | req.query.fileName | This command line depends on a $@. | child_process-test.js:83:19:83:36 | req.query.fileName | user-provided value |
2323
| child_process-test.js:94:11:94:35 | "ping " ... ms.host | child_process-test.js:94:21:94:30 | ctx.params | child_process-test.js:94:11:94:35 | "ping " ... ms.host | This command line depends on a $@. | child_process-test.js:94:21:94:30 | ctx.params | user-provided value |
24+
| command-line-libs.js:14:8:14:18 | options.cmd | command-line-libs.js:9:16:9:23 | req.body | command-line-libs.js:14:8:14:18 | options.cmd | This command line depends on a $@. | command-line-libs.js:9:16:9:23 | req.body | user-provided value |
2425
| command-line-libs.js:40:8:40:17 | parsed.cmd | command-line-libs.js:33:16:33:23 | req.body | command-line-libs.js:40:8:40:17 | parsed.cmd | This command line depends on a $@. | command-line-libs.js:33:16:33:23 | req.body | user-provided value |
2526
| exec-sh2.js:10:12:10:57 | cp.spaw ... ptions) | exec-sh2.js:14:25:14:31 | req.url | exec-sh2.js:10:40:10:46 | command | This command line depends on a $@. | exec-sh2.js:14:25:14:31 | req.url | user-provided value |
2627
| exec-sh.js:15:12:15:61 | cp.spaw ... ptions) | exec-sh.js:19:25:19:31 | req.url | exec-sh.js:15:44:15:50 | command | This command line depends on a $@. | exec-sh.js:19:25:19:31 | req.url | user-provided value |
@@ -117,6 +118,12 @@ edges
117118
| child_process-test.js:73:15:73:38 | url.par ... , true) | child_process-test.js:73:9:73:49 | cmd | provenance | |
118119
| child_process-test.js:73:25:73:31 | req.url | child_process-test.js:73:15:73:38 | url.par ... , true) | provenance | |
119120
| child_process-test.js:94:21:94:30 | ctx.params | child_process-test.js:94:11:94:35 | "ping " ... ms.host | provenance | |
121+
| command-line-libs.js:9:9:9:34 | args | command-line-libs.js:12:17:12:20 | args | provenance | |
122+
| command-line-libs.js:9:16:9:23 | req.body | command-line-libs.js:9:9:9:34 | args | provenance | |
123+
| command-line-libs.js:12:17:12:20 | args | command-line-libs.js:13:19:13:32 | program.opts() | provenance | |
124+
| command-line-libs.js:13:9:13:32 | options | command-line-libs.js:14:8:14:14 | options | provenance | |
125+
| command-line-libs.js:13:19:13:32 | program.opts() | command-line-libs.js:13:9:13:32 | options | provenance | |
126+
| command-line-libs.js:14:8:14:14 | options | command-line-libs.js:14:8:14:18 | options.cmd | provenance | |
120127
| command-line-libs.js:33:9:33:34 | args | command-line-libs.js:34:24:34:27 | args | provenance | |
121128
| command-line-libs.js:33:16:33:23 | req.body | command-line-libs.js:33:9:33:34 | args | provenance | |
122129
| command-line-libs.js:34:9:38:12 | parsed | command-line-libs.js:40:8:40:13 | parsed | provenance | |
@@ -278,6 +285,13 @@ nodes
278285
| child_process-test.js:83:19:83:36 | req.query.fileName | semmle.label | req.query.fileName |
279286
| child_process-test.js:94:11:94:35 | "ping " ... ms.host | semmle.label | "ping " ... ms.host |
280287
| child_process-test.js:94:21:94:30 | ctx.params | semmle.label | ctx.params |
288+
| command-line-libs.js:9:9:9:34 | args | semmle.label | args |
289+
| command-line-libs.js:9:16:9:23 | req.body | semmle.label | req.body |
290+
| command-line-libs.js:12:17:12:20 | args | semmle.label | args |
291+
| command-line-libs.js:13:9:13:32 | options | semmle.label | options |
292+
| command-line-libs.js:13:19:13:32 | program.opts() | semmle.label | program.opts() |
293+
| command-line-libs.js:14:8:14:14 | options | semmle.label | options |
294+
| command-line-libs.js:14:8:14:18 | options.cmd | semmle.label | options.cmd |
281295
| command-line-libs.js:33:9:33:34 | args | semmle.label | args |
282296
| command-line-libs.js:33:16:33:23 | req.body | semmle.label | req.body |
283297
| command-line-libs.js:34:9:38:12 | parsed | semmle.label | parsed |

javascript/ql/test/query-tests/Security/CWE-078/CommandInjection/command-line-libs.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ const app = express();
66
app.use(express.json());
77

88
app.post('/Command', (req, res) => {
9-
const args = req.body.args || []; // $ MISSING: Source
9+
const args = req.body.args || []; // $ Source
1010
const program = new Command();
1111
program.option('--cmd <value>', 'Command to execute');
1212
program.parse(args, { from: 'user' });
1313
const options = program.opts();
14-
exec(options.cmd); // $ MISSING: Alert
14+
exec(options.cmd); // $ Alert
1515
});
1616

1717
app.post('/arg', (req, res) => {

0 commit comments

Comments
 (0)