Skip to content

Commit 3363f5e

Browse files
committed
JS: add query for Express-HBS LFR
1 parent 064d897 commit 3363f5e

3 files changed

Lines changed: 64 additions & 0 deletions

File tree

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/**
2+
* @name Express-Hbs Local File Read and Potential RCE
3+
* @description Writing user input directly to res.render of ExpressJS used with Hbs can lead to LFR
4+
* @kind path-problem
5+
* @problem.severity error
6+
* @precision high
7+
* @id js/express-hbs-lfr
8+
* @tags security
9+
* external/cwe/cwe-073
10+
* external/cwe/cwe-094
11+
*/
12+
13+
import javascript
14+
import DataFlow
15+
import PathGraph
16+
import Express
17+
import semmle.javascript.DynamicPropertyAccess
18+
19+
predicate isUsingHbsEngine() {
20+
exists(MethodCallExpr method |
21+
method.getMethodName() = "set" and
22+
Express::appCreation().flowsToExpr(method.getReceiver()) and
23+
method.getArgument(1).getStringValue().matches("hbs")
24+
)
25+
}
26+
27+
class HbsLFRTaint extends TaintTracking::Configuration {
28+
HbsLFRTaint() { this = "HbsLFRTaint" }
29+
30+
override predicate isSource(Node node) { node instanceof RemoteFlowSource }
31+
32+
override predicate isSink(Node node) {
33+
exists(MethodCallExpr mc |
34+
Express::isResponse(mc.getReceiver()) and
35+
mc.getMethodName() = "render" and
36+
node.asExpr() = mc.getArgument(1) and
37+
isUsingHbsEngine()
38+
)
39+
}
40+
}
41+
42+
from HbsLFRTaint cfg, Node source, Node sink
43+
where cfg.hasFlow(source, sink)
44+
select source, sink
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
var app = require('express')();
2+
app.set('view engine', 'hbs');
3+
4+
app.post('/path', function(req, res) {
5+
var bodyParameter = req.body.bodyParameter
6+
var queryParameter = req.query.queryParameter
7+
8+
res.render('template', bodyParameter)
9+
res.render('template', queryParameter)
10+
});
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
var app = require('express')();
2+
app.set('view engine', 'hbs');
3+
4+
app.post('/path', function(req, res) {
5+
var bodyParameter = req.body.bodyParameter
6+
var queryParameter = req.query.queryParameter
7+
8+
res.render('template', {bodyParameter})
9+
res.render('template', {queryParameter})
10+
});

0 commit comments

Comments
 (0)