Skip to content

Commit e1d90e9

Browse files
author
Max Schaefer
committed
JavaScript: Add modelling for Module.prototype._compile.
1 parent b409cf6 commit e1d90e9

File tree

4 files changed

+30
-0
lines changed

4 files changed

+30
-0
lines changed

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,4 +124,15 @@ module CodeInjection {
124124
class NoSQLCodeInjectionSink extends Sink {
125125
NoSQLCodeInjectionSink() { any(NoSQL::Query q).getACodeOperator() = this }
126126
}
127+
128+
/**
129+
* The first argument to `Module.prototype._compile` from the Node.js built-in module `module`,
130+
* considered as a code-injection sink.
131+
*/
132+
class ModuleCompileSink extends Sink {
133+
ModuleCompileSink() {
134+
this =
135+
API::moduleImport("module").getInstance().getMember("_compile").getACall().getArgument(0)
136+
}
137+
}
127138
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,9 @@ nodes
108108
| express.js:21:19:21:48 | req.par ... ntext") |
109109
| express.js:21:19:21:48 | req.par ... ntext") |
110110
| express.js:21:19:21:48 | req.par ... ntext") |
111+
| module.js:9:16:9:29 | req.query.code |
112+
| module.js:9:16:9:29 | req.query.code |
113+
| module.js:9:16:9:29 | req.query.code |
111114
| react-native.js:7:7:7:33 | tainted |
112115
| react-native.js:7:17:7:33 | req.param("code") |
113116
| react-native.js:7:17:7:33 | req.param("code") |
@@ -246,6 +249,7 @@ edges
246249
| express.js:17:30:17:53 | req.par ... cript") | express.js:17:30:17:53 | req.par ... cript") |
247250
| express.js:19:37:19:70 | req.par ... odule") | express.js:19:37:19:70 | req.par ... odule") |
248251
| express.js:21:19:21:48 | req.par ... ntext") | express.js:21:19:21:48 | req.par ... ntext") |
252+
| module.js:9:16:9:29 | req.query.code | module.js:9:16:9:29 | req.query.code |
249253
| react-native.js:7:7:7:33 | tainted | react-native.js:8:32:8:38 | tainted |
250254
| react-native.js:7:7:7:33 | tainted | react-native.js:8:32:8:38 | tainted |
251255
| react-native.js:7:7:7:33 | tainted | react-native.js:10:23:10:29 | tainted |
@@ -308,6 +312,7 @@ edges
308312
| express.js:17:30:17:53 | req.par ... cript") | express.js:17:30:17:53 | req.par ... cript") | express.js:17:30:17:53 | req.par ... cript") | $@ flows to here and is interpreted as code. | express.js:17:30:17:53 | req.par ... cript") | User-provided value |
309313
| express.js:19:37:19:70 | req.par ... odule") | express.js:19:37:19:70 | req.par ... odule") | express.js:19:37:19:70 | req.par ... odule") | $@ flows to here and is interpreted as code. | express.js:19:37:19:70 | req.par ... odule") | User-provided value |
310314
| express.js:21:19:21:48 | req.par ... ntext") | express.js:21:19:21:48 | req.par ... ntext") | express.js:21:19:21:48 | req.par ... ntext") | $@ flows to here and is interpreted as code. | express.js:21:19:21:48 | req.par ... ntext") | User-provided value |
315+
| module.js:9:16:9:29 | req.query.code | module.js:9:16:9:29 | req.query.code | module.js:9:16:9:29 | req.query.code | $@ flows to here and is interpreted as code. | module.js:9:16:9:29 | req.query.code | User-provided value |
311316
| react-native.js:8:32:8:38 | tainted | react-native.js:7:17:7:33 | req.param("code") | react-native.js:8:32:8:38 | tainted | $@ flows to here and is interpreted as code. | react-native.js:7:17:7:33 | req.param("code") | User-provided value |
312317
| react-native.js:10:23:10:29 | tainted | react-native.js:7:17:7:33 | req.param("code") | react-native.js:10:23:10:29 | tainted | $@ flows to here and is interpreted as code. | react-native.js:7:17:7:33 | req.param("code") | User-provided value |
313318
| tst.js:2:6:2:83 | documen ... t=")+8) | tst.js:2:6:2:22 | document.location | tst.js:2:6:2:83 | documen ... t=")+8) | $@ flows to here and is interpreted as code. | tst.js:2:6:2:22 | document.location | User-provided value |

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,9 @@ nodes
112112
| express.js:21:19:21:48 | req.par ... ntext") |
113113
| express.js:21:19:21:48 | req.par ... ntext") |
114114
| express.js:21:19:21:48 | req.par ... ntext") |
115+
| module.js:9:16:9:29 | req.query.code |
116+
| module.js:9:16:9:29 | req.query.code |
117+
| module.js:9:16:9:29 | req.query.code |
115118
| react-native.js:7:7:7:33 | tainted |
116119
| react-native.js:7:17:7:33 | req.param("code") |
117120
| react-native.js:7:17:7:33 | req.param("code") |
@@ -254,6 +257,7 @@ edges
254257
| express.js:17:30:17:53 | req.par ... cript") | express.js:17:30:17:53 | req.par ... cript") |
255258
| express.js:19:37:19:70 | req.par ... odule") | express.js:19:37:19:70 | req.par ... odule") |
256259
| express.js:21:19:21:48 | req.par ... ntext") | express.js:21:19:21:48 | req.par ... ntext") |
260+
| module.js:9:16:9:29 | req.query.code | module.js:9:16:9:29 | req.query.code |
257261
| react-native.js:7:7:7:33 | tainted | react-native.js:8:32:8:38 | tainted |
258262
| react-native.js:7:7:7:33 | tainted | react-native.js:8:32:8:38 | tainted |
259263
| react-native.js:7:7:7:33 | tainted | react-native.js:10:23:10:29 | tainted |
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
var express = require('express'),
2+
Module = require('module');
3+
4+
var app = express();
5+
6+
app.get('/some/path', function (req, res) {
7+
let filename = req.query.filename;
8+
var m = new Module(filename, module.parent);
9+
m._compile(req.query.code, filename); // NOT OK
10+
});

0 commit comments

Comments
 (0)