JS: recognize req.query.x as deep object taint

This commit is contained in:
Asger F
2018-10-10 17:15:56 +01:00
parent d72d7345b8
commit 5e720486d5
3 changed files with 14 additions and 1 deletions

View File

@@ -501,6 +501,17 @@ module Express {
// but all known body parsers are deep, assume req.body is a deep object.
kind = "body" and
forall(ExpressLibraries::BodyParser bodyParser | bodyParser.isDeepObject())
or
kind = "parameter" and
exists (DataFlow::Node request | request = DataFlow::valueNode(rh.getARequestExpr()) |
this.(DataFlow::MethodCallNode).calls(request, "param")
or
exists (DataFlow::PropRead base |
// `req.query.name`
base.accesses(request, "query") and
this = base.getAPropertyReference(_)
)
)
}
}

View File

@@ -1,4 +1,6 @@
| mongodb.js:18:16:18:20 | query | This query depends on $@. | mongodb.js:13:19:13:26 | req.body | a user-provided value |
| mongodb.js:45:16:45:20 | query | This query depends on $@. | mongodb.js:40:19:40:33 | req.query.title | a user-provided value |
| mongodb_bodySafe.js:29:16:29:20 | query | This query depends on $@. | mongodb_bodySafe.js:24:19:24:33 | req.query.title | a user-provided value |
| mongoose.js:27:20:27:24 | query | This query depends on $@. | mongoose.js:21:19:21:26 | req.body | a user-provided value |
| mongoose.js:30:25:30:29 | query | This query depends on $@. | mongoose.js:21:19:21:26 | req.body | a user-provided value |
| mongoose.js:33:24:33:28 | query | This query depends on $@. | mongoose.js:21:19:21:26 | req.body | a user-provided value |

View File

@@ -42,6 +42,6 @@ app.post('/documents/find', (req, res) => {
let doc = db.collection('doc');
// NOT OK: query is tainted by user-provided object value
doc.find(query); // Not currently detected
doc.find(query);
});
});