Skip to content

Commit 1179380

Browse files
committed
support subrouters, and engine registrations with file extensions
1 parent 70b8cde commit 1179380

File tree

3 files changed

+51
-2
lines changed

3 files changed

+51
-2
lines changed

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ module TemplateObjectInjection {
5353
|
5454
setup.getARouteHandler() = getRouteHandler() and
5555
setup.getRouter() = router and
56-
usesVulnerableTemplateEngine(router)
56+
top.getASubRouter*() = router and
57+
usesVulnerableTemplateEngine(top)
5758
)
5859
}
5960
}
@@ -98,7 +99,13 @@ module TemplateObjectInjection {
9899
viewEngineCall.getMethodName() = "set" and
99100
viewEngineCall.getArgument(0).getStringValue() = "view engine" and
100101
// The name set by the `app.engine("name")` call matches `app.set("view engine", "name")`.
101-
viewEngineCall.getArgument(1).getStringValue() = registerCall.getArgument(0).getStringValue()
102+
(
103+
viewEngineCall.getArgument(1).getStringValue() =
104+
registerCall.getArgument(0).getStringValue()
105+
or
106+
"." + viewEngineCall.getArgument(1).getStringValue() =
107+
registerCall.getArgument(0).getStringValue()
108+
)
102109
|
103110
// Different ways of initializing vulnerable template engines.
104111
engine = DataFlow::moduleImport(getAVulnerableTemplateEngine())

javascript/ql/test/query-tests/Security/CWE-073/TemplateObjectInjection.expected

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,18 @@ nodes
1717
| tst2.js:34:25:34:46 | req.bod ... rameter |
1818
| tst2.js:35:28:35:40 | bodyParameter |
1919
| tst2.js:35:28:35:40 | bodyParameter |
20+
| tst2.js:42:9:42:46 | bodyParameter |
21+
| tst2.js:42:25:42:32 | req.body |
22+
| tst2.js:42:25:42:32 | req.body |
23+
| tst2.js:42:25:42:46 | req.bod ... rameter |
24+
| tst2.js:43:28:43:40 | bodyParameter |
25+
| tst2.js:43:28:43:40 | bodyParameter |
26+
| tst2.js:51:9:51:46 | bodyParameter |
27+
| tst2.js:51:25:51:32 | req.body |
28+
| tst2.js:51:25:51:32 | req.body |
29+
| tst2.js:51:25:51:46 | req.bod ... rameter |
30+
| tst2.js:52:28:52:40 | bodyParameter |
31+
| tst2.js:52:28:52:40 | bodyParameter |
2032
| tst.js:5:9:5:46 | bodyParameter |
2133
| tst.js:5:25:5:32 | req.body |
2234
| tst.js:5:25:5:32 | req.body |
@@ -58,6 +70,16 @@ edges
5870
| tst2.js:34:25:34:32 | req.body | tst2.js:34:25:34:46 | req.bod ... rameter |
5971
| tst2.js:34:25:34:32 | req.body | tst2.js:34:25:34:46 | req.bod ... rameter |
6072
| tst2.js:34:25:34:46 | req.bod ... rameter | tst2.js:34:9:34:46 | bodyParameter |
73+
| tst2.js:42:9:42:46 | bodyParameter | tst2.js:43:28:43:40 | bodyParameter |
74+
| tst2.js:42:9:42:46 | bodyParameter | tst2.js:43:28:43:40 | bodyParameter |
75+
| tst2.js:42:25:42:32 | req.body | tst2.js:42:25:42:46 | req.bod ... rameter |
76+
| tst2.js:42:25:42:32 | req.body | tst2.js:42:25:42:46 | req.bod ... rameter |
77+
| tst2.js:42:25:42:46 | req.bod ... rameter | tst2.js:42:9:42:46 | bodyParameter |
78+
| tst2.js:51:9:51:46 | bodyParameter | tst2.js:52:28:52:40 | bodyParameter |
79+
| tst2.js:51:9:51:46 | bodyParameter | tst2.js:52:28:52:40 | bodyParameter |
80+
| tst2.js:51:25:51:32 | req.body | tst2.js:51:25:51:46 | req.bod ... rameter |
81+
| tst2.js:51:25:51:32 | req.body | tst2.js:51:25:51:46 | req.bod ... rameter |
82+
| tst2.js:51:25:51:46 | req.bod ... rameter | tst2.js:51:9:51:46 | bodyParameter |
6183
| tst.js:5:9:5:46 | bodyParameter | tst.js:8:28:8:40 | bodyParameter |
6284
| tst.js:5:9:5:46 | bodyParameter | tst.js:8:28:8:40 | bodyParameter |
6385
| tst.js:5:25:5:32 | req.body | tst.js:5:25:5:46 | req.bod ... rameter |
@@ -85,6 +107,8 @@ edges
85107
| tst2.js:7:28:7:40 | bodyParameter | tst2.js:6:25:6:32 | req.body | tst2.js:7:28:7:40 | bodyParameter | Template object injection due to $@. | tst2.js:6:25:6:32 | req.body | user-provided value |
86108
| tst2.js:27:28:27:40 | bodyParameter | tst2.js:26:25:26:32 | req.body | tst2.js:27:28:27:40 | bodyParameter | Template object injection due to $@. | tst2.js:26:25:26:32 | req.body | user-provided value |
87109
| tst2.js:35:28:35:40 | bodyParameter | tst2.js:34:25:34:32 | req.body | tst2.js:35:28:35:40 | bodyParameter | Template object injection due to $@. | tst2.js:34:25:34:32 | req.body | user-provided value |
110+
| tst2.js:43:28:43:40 | bodyParameter | tst2.js:42:25:42:32 | req.body | tst2.js:43:28:43:40 | bodyParameter | Template object injection due to $@. | tst2.js:42:25:42:32 | req.body | user-provided value |
111+
| tst2.js:52:28:52:40 | bodyParameter | tst2.js:51:25:51:32 | req.body | tst2.js:52:28:52:40 | bodyParameter | Template object injection due to $@. | tst2.js:51:25:51:32 | req.body | user-provided value |
88112
| tst.js:8:28:8:40 | bodyParameter | tst.js:5:25:5:32 | req.body | tst.js:8:28:8:40 | bodyParameter | Template object injection due to $@. | tst.js:5:25:5:32 | req.body | user-provided value |
89113
| tst.js:9:28:9:41 | queryParameter | tst.js:6:26:6:49 | req.que ... rameter | tst.js:9:28:9:41 | queryParameter | Template object injection due to $@. | tst.js:6:26:6:49 | req.que ... rameter | user-provided value |
90114
| tst.js:22:28:22:30 | obj | tst.js:6:26:6:49 | req.que ... rameter | tst.js:22:28:22:30 | obj | Template object injection due to $@. | tst.js:6:26:6:49 | req.que ... rameter | user-provided value |

javascript/ql/test/query-tests/Security/CWE-073/tst2.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,21 @@ app5.post('/path', function(req, res) {
3434
var bodyParameter = req.body.bodyParameter;
3535
res.render('template', bodyParameter); // NOT OK
3636
});
37+
38+
var app6 = require('express')();
39+
app6.register(".html", require("consolidate").whiskers);
40+
app6.set('view engine', 'html');
41+
app6.post('/path', function(req, res) {
42+
var bodyParameter = req.body.bodyParameter;
43+
res.render('template', bodyParameter); // NOT OK
44+
});
45+
46+
const express = require('express');
47+
var router = express.Router();
48+
var app7 = express();
49+
app7.set('view engine', 'ejs');
50+
router.post('/path', function(req, res) {
51+
var bodyParameter = req.body.bodyParameter;
52+
res.render('template', bodyParameter); // NOT OK
53+
});
54+
app7.use("/router", router);

0 commit comments

Comments
 (0)