Skip to content

Commit 147b4a9

Browse files
committed
add values written to the global scope as exports
1 parent b85d4f8 commit 147b4a9

File tree

3 files changed

+17
-0
lines changed

3 files changed

+17
-0
lines changed

javascript/ql/lib/semmle/javascript/PackageExports.qll

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,4 +171,8 @@ private DataFlow::Node getAnExportFromModule(Module mod) {
171171
result.analyze().getAValue() = mod.(AmdModule).getDefine().getAModuleExportsValue()
172172
or
173173
result = mod.getAnExportedValue(_)
174+
or
175+
// exports saved to the global object
176+
result = DataFlow::globalObjectRef().getAPropertyWrite().getRhs() and
177+
result.getTopLevel() = mod
174178
}

javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/UnsafeCodeConstruction.expected

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ nodes
77
| lib/index.js:5:35:5:38 | name |
88
| lib/index.js:6:26:6:29 | name |
99
| lib/index.js:6:26:6:29 | name |
10+
| lib/index.js:13:38:13:41 | data |
11+
| lib/index.js:13:38:13:41 | data |
12+
| lib/index.js:14:21:14:24 | data |
13+
| lib/index.js:14:21:14:24 | data |
1014
edges
1115
| lib/index.js:1:35:1:38 | data | lib/index.js:2:21:2:24 | data |
1216
| lib/index.js:1:35:1:38 | data | lib/index.js:2:21:2:24 | data |
@@ -16,6 +20,11 @@ edges
1620
| lib/index.js:5:35:5:38 | name | lib/index.js:6:26:6:29 | name |
1721
| lib/index.js:5:35:5:38 | name | lib/index.js:6:26:6:29 | name |
1822
| lib/index.js:5:35:5:38 | name | lib/index.js:6:26:6:29 | name |
23+
| lib/index.js:13:38:13:41 | data | lib/index.js:14:21:14:24 | data |
24+
| lib/index.js:13:38:13:41 | data | lib/index.js:14:21:14:24 | data |
25+
| lib/index.js:13:38:13:41 | data | lib/index.js:14:21:14:24 | data |
26+
| lib/index.js:13:38:13:41 | data | lib/index.js:14:21:14:24 | data |
1927
#select
2028
| lib/index.js:2:21:2:24 | data | lib/index.js:1:35:1:38 | data | lib/index.js:2:21:2:24 | data | $@ flows to here and is later $@. | lib/index.js:1:35:1:38 | data | Library input | lib/index.js:2:15:2:30 | "(" + data + ")" | interpreted as code |
2129
| lib/index.js:6:26:6:29 | name | lib/index.js:5:35:5:38 | name | lib/index.js:6:26:6:29 | name | $@ flows to here and is later $@. | lib/index.js:5:35:5:38 | name | Library input | lib/index.js:6:17:6:29 | "obj." + name | interpreted as code |
30+
| lib/index.js:14:21:14:24 | data | lib/index.js:13:38:13:41 | data | lib/index.js:14:21:14:24 | data | $@ flows to here and is later $@. | lib/index.js:13:38:13:41 | data | Library input | lib/index.js:14:15:14:30 | "(" + data + ")" | interpreted as code |

javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/lib/index.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,7 @@ export function unsafeGetter(obj, name) {
99
export function safeAssignment(obj, value) {
1010
eval("obj.foo = " + JSON.stringify(value)); // OK
1111
}
12+
13+
global.unsafeDeserialize = function (data) {
14+
return eval("(" + data + ")"); // NOT OK
15+
}

0 commit comments

Comments
 (0)