Skip to content

Commit b510e47

Browse files
committed
support rest-patterns inside property patterns
1 parent c580ada commit b510e47

4 files changed

Lines changed: 24 additions & 1 deletion

File tree

javascript/ql/src/semmle/javascript/DefUse.qll

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,12 @@ private predicate defn(ControlFlowNode def, Expr lhs) {
8585
exists(EnumMember member | def = member.getIdentifier() |
8686
lhs = def and not exists(member.getInitializer())
8787
)
88+
or
89+
exists(PropertyPattern prop, ObjectPattern obj, Expr rest |
90+
prop.getValuePattern() = obj and obj.getRest() = rest
91+
|
92+
lhs = rest and def = prop
93+
)
8894
}
8995

9096
/**

javascript/ql/src/semmle/javascript/dataflow/DataFlow.qll

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1386,6 +1386,11 @@ module DataFlow {
13861386
succ = valueNode(v.getAUse())
13871387
)
13881388
or
1389+
exists(SsaExplicitDefinition def |
1390+
pred.getAstNode() = def.getDef() and
1391+
succ = TSsaDefNode(def)
1392+
)
1393+
or
13891394
exists(Expr predExpr, Expr succExpr |
13901395
pred = valueNode(predExpr) and succ = valueNode(succExpr)
13911396
|

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,12 @@ nodes
7979
| command-line-parameter-command-injection.js:43:22:43:58 | require ... parse() |
8080
| command-line-parameter-command-injection.js:43:22:43:58 | require ... parse() |
8181
| command-line-parameter-command-injection.js:43:22:43:62 | require ... e().foo |
82+
| command-line-parameter-command-injection.js:48:3:50:3 | args |
83+
| command-line-parameter-command-injection.js:48:3:50:3 | argv: { ... rgs\\n\\t\\t} |
84+
| command-line-parameter-command-injection.js:48:3:50:3 | argv: { ... rgs\\n\\t\\t} |
85+
| command-line-parameter-command-injection.js:55:10:55:25 | "cmd.sh " + args |
86+
| command-line-parameter-command-injection.js:55:10:55:25 | "cmd.sh " + args |
87+
| command-line-parameter-command-injection.js:55:22:55:25 | args |
8288
edges
8389
| command-line-parameter-command-injection.js:4:10:4:21 | process.argv | command-line-parameter-command-injection.js:4:10:4:21 | process.argv |
8490
| 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] |
@@ -149,6 +155,11 @@ edges
149155
| command-line-parameter-command-injection.js:43:22:43:58 | require ... parse() | command-line-parameter-command-injection.js:43:22:43:62 | require ... e().foo |
150156
| command-line-parameter-command-injection.js:43:22:43:62 | require ... e().foo | command-line-parameter-command-injection.js:43:10:43:62 | "cmd.sh ... e().foo |
151157
| command-line-parameter-command-injection.js:43:22:43:62 | require ... e().foo | command-line-parameter-command-injection.js:43:10:43:62 | "cmd.sh ... e().foo |
158+
| command-line-parameter-command-injection.js:48:3:50:3 | args | command-line-parameter-command-injection.js:55:22:55:25 | args |
159+
| command-line-parameter-command-injection.js:48:3:50:3 | argv: { ... rgs\\n\\t\\t} | command-line-parameter-command-injection.js:48:3:50:3 | args |
160+
| command-line-parameter-command-injection.js:48:3:50:3 | argv: { ... rgs\\n\\t\\t} | command-line-parameter-command-injection.js:48:3:50:3 | args |
161+
| command-line-parameter-command-injection.js:55:22:55:25 | args | command-line-parameter-command-injection.js:55:10:55:25 | "cmd.sh " + args |
162+
| command-line-parameter-command-injection.js:55:22:55:25 | args | command-line-parameter-command-injection.js:55:10:55:25 | "cmd.sh " + args |
152163
#select
153164
| 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 |
154165
| 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 |
@@ -166,3 +177,4 @@ edges
166177
| command-line-parameter-command-injection.js:33:9:33:48 | "cmd.sh ... rgv.foo | command-line-parameter-command-injection.js:33:21:33:44 | require ... ").argv | command-line-parameter-command-injection.js:33:9:33:48 | "cmd.sh ... rgv.foo | This command depends on an unsanitized $@. | command-line-parameter-command-injection.js:33:21:33:44 | require ... ").argv | command-line argument |
167178
| command-line-parameter-command-injection.js:41:10:41:25 | "cmd.sh " + args | command-line-parameter-command-injection.js:36:13:39:7 | require ... \\t\\t.argv | command-line-parameter-command-injection.js:41:10:41:25 | "cmd.sh " + args | This command depends on an unsanitized $@. | command-line-parameter-command-injection.js:36:13:39:7 | require ... \\t\\t.argv | command-line argument |
168179
| command-line-parameter-command-injection.js:43:10:43:62 | "cmd.sh ... e().foo | command-line-parameter-command-injection.js:43:22:43:58 | require ... parse() | command-line-parameter-command-injection.js:43:10:43:62 | "cmd.sh ... e().foo | This command depends on an unsanitized $@. | command-line-parameter-command-injection.js:43:22:43:58 | require ... parse() | command-line argument |
180+
| command-line-parameter-command-injection.js:55:10:55:25 | "cmd.sh " + args | command-line-parameter-command-injection.js:48:3:50:3 | argv: { ... rgs\\n\\t\\t} | command-line-parameter-command-injection.js:55:10:55:25 | "cmd.sh " + args | This command depends on an unsanitized $@. | command-line-parameter-command-injection.js:48:3:50:3 | argv: { ... rgs\\n\\t\\t} | command-line argument |

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,6 @@ cp.exec("cmd.sh " + require("optimist").argv.foo); // NOT OK
5252
.usage('Usage: foo bar')
5353
.command();
5454

55-
cp.exec("cmd.sh " + args); // NOT OK - but not flagged yet.
55+
cp.exec("cmd.sh " + args); // NOT OK
5656
});
5757

0 commit comments

Comments
 (0)