Skip to content

Commit 439aadf

Browse files
author
Max Schaefer
committed
JavaScript: Do even more type tracking in command injection.
1 parent ef18b39 commit 439aadf

File tree

3 files changed

+46
-2
lines changed

3 files changed

+46
-2
lines changed

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

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,26 @@ private DataFlow::SourceNode argumentList(SystemCommandExecution sys) {
6363
result = argumentList(sys, DataFlow::TypeBackTracker::end())
6464
}
6565

66+
/**
67+
* Gets a data-flow node whose value ends up being interpreted as an element of the argument list
68+
* `args` after a flow summarised by `t`.
69+
*/
70+
private DataFlow::Node argumentListElement(DataFlow::SourceNode args, DataFlow::TypeBackTracker t) {
71+
t.start() and
72+
args = argumentList(_) and
73+
result = args.getAPropertyWrite().getRhs()
74+
or
75+
exists(DataFlow::TypeBackTracker t2 | t2 = t.smallstep(result, argumentListElement(args, t2)))
76+
}
77+
78+
/**
79+
* Gets a data-flow node whose value ends up being interpreted as an element of the argument list
80+
* `args`.
81+
*/
82+
private DataFlow::Node argumentListElement(DataFlow::SourceNode args) {
83+
result = argumentListElement(args, DataFlow::TypeBackTracker::end())
84+
}
85+
6686
/**
6787
* Holds if `source` contributes to the arguments of an indirect command execution `sys`.
6888
*
@@ -86,8 +106,8 @@ predicate isIndirectCommandArgument(DataFlow::Node source, SystemCommandExecutio
86106
exists(DataFlow::ArrayCreationNode args, DataFlow::Node shell, string dashC |
87107
shellCmd(shell.asExpr(), dashC) and
88108
shell = commandArgument(sys) and
89-
args.getAPropertyWrite().getRhs().mayHaveStringValue(dashC) and
90109
args = argumentList(sys) and
110+
argumentListElement(args).mayHaveStringValue(dashC) and
91111
(
92112
source = argumentList(sys)
93113
or

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,18 @@ nodes
6767
| exec-sh2.js:14:25:14:31 | req.url |
6868
| exec-sh2.js:14:25:14:31 | req.url |
6969
| exec-sh2.js:15:12:15:14 | cmd |
70+
| exec-sh.js:13:17:13:23 | command |
71+
| exec-sh.js:15:32:15:51 | [shell.arg, command] |
72+
| exec-sh.js:15:32:15:51 | [shell.arg, command] |
73+
| exec-sh.js:15:44:15:50 | command |
74+
| exec-sh.js:15:44:15:50 | command |
75+
| exec-sh.js:19:9:19:49 | cmd |
76+
| exec-sh.js:19:15:19:38 | url.par ... , true) |
77+
| exec-sh.js:19:15:19:44 | url.par ... ).query |
78+
| exec-sh.js:19:15:19:49 | url.par ... ry.path |
79+
| exec-sh.js:19:25:19:31 | req.url |
80+
| exec-sh.js:19:25:19:31 | req.url |
81+
| exec-sh.js:20:12:20:14 | cmd |
7082
| execSeries.js:3:20:3:22 | arr |
7183
| execSeries.js:6:14:6:16 | arr |
7284
| execSeries.js:6:14:6:21 | arr[i++] |
@@ -197,6 +209,17 @@ edges
197209
| exec-sh2.js:14:25:14:31 | req.url | exec-sh2.js:14:15:14:38 | url.par ... , true) |
198210
| exec-sh2.js:14:25:14:31 | req.url | exec-sh2.js:14:15:14:38 | url.par ... , true) |
199211
| exec-sh2.js:15:12:15:14 | cmd | exec-sh2.js:9:17:9:23 | command |
212+
| exec-sh.js:13:17:13:23 | command | exec-sh.js:15:44:15:50 | command |
213+
| exec-sh.js:13:17:13:23 | command | exec-sh.js:15:44:15:50 | command |
214+
| exec-sh.js:15:44:15:50 | command | exec-sh.js:15:32:15:51 | [shell.arg, command] |
215+
| exec-sh.js:15:44:15:50 | command | exec-sh.js:15:32:15:51 | [shell.arg, command] |
216+
| exec-sh.js:19:9:19:49 | cmd | exec-sh.js:20:12:20:14 | cmd |
217+
| exec-sh.js:19:15:19:38 | url.par ... , true) | exec-sh.js:19:15:19:44 | url.par ... ).query |
218+
| exec-sh.js:19:15:19:44 | url.par ... ).query | exec-sh.js:19:15:19:49 | url.par ... ry.path |
219+
| exec-sh.js:19:15:19:49 | url.par ... ry.path | exec-sh.js:19:9:19:49 | cmd |
220+
| exec-sh.js:19:25:19:31 | req.url | exec-sh.js:19:15:19:38 | url.par ... , true) |
221+
| exec-sh.js:19:25:19:31 | req.url | exec-sh.js:19:15:19:38 | url.par ... , true) |
222+
| exec-sh.js:20:12:20:14 | cmd | exec-sh.js:13:17:13:23 | command |
200223
| execSeries.js:3:20:3:22 | arr | execSeries.js:6:14:6:16 | arr |
201224
| execSeries.js:6:14:6:16 | arr | execSeries.js:6:14:6:21 | arr[i++] |
202225
| execSeries.js:6:14:6:21 | arr[i++] | execSeries.js:14:24:14:30 | command |
@@ -285,6 +308,8 @@ edges
285308
| 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 depends on $@. | child_process-test.js:83:19:83:36 | req.query.fileName | a user-provided value |
286309
| exec-sh2.js:10:12:10:57 | cp.spaw ... ptions) | exec-sh2.js:14:25:14:31 | req.url | exec-sh2.js:10:33:10:47 | ["-c", command] | This command depends on $@. | exec-sh2.js:14:25:14:31 | req.url | a user-provided value |
287310
| 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 depends on $@. | exec-sh2.js:14:25:14:31 | req.url | a user-provided value |
311+
| exec-sh.js:15:12:15:61 | cp.spaw ... ptions) | exec-sh.js:19:25:19:31 | req.url | exec-sh.js:15:32:15:51 | [shell.arg, command] | This command depends on $@. | exec-sh.js:19:25:19:31 | req.url | a user-provided value |
312+
| 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 depends on $@. | exec-sh.js:19:25:19:31 | req.url | a user-provided value |
288313
| execSeries.js:14:41:14:47 | command | execSeries.js:18:34:18:40 | req.url | execSeries.js:14:41:14:47 | command | This command depends on $@. | execSeries.js:18:34:18:40 | req.url | a user-provided value |
289314
| lib/subLib/index.js:8:10:8:25 | "rm -rf " + name | child_process-test.js:85:37:85:54 | req.query.fileName | lib/subLib/index.js:8:10:8:25 | "rm -rf " + name | This command depends on $@. | child_process-test.js:85:37:85:54 | req.query.fileName | a user-provided value |
290315
| other.js:7:33:7:35 | cmd | other.js:5:25:5:31 | req.url | other.js:7:33:7:35 | cmd | This command depends on $@. | other.js:5:25:5:31 | req.url | a user-provided value |
Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +0,0 @@
1-
| query-tests/Security/CWE-078/exec-sh.js:15 | expected an alert, but found none | BAD | ComandInjection |

0 commit comments

Comments
 (0)