Skip to content

Commit 6ba0dc2

Browse files
authored
Merge pull request #19439 from Napalys/js/fastify-all
JS: Modeling of `fastify`
2 parents 1770f56 + 68a9dd9 commit 6ba0dc2

File tree

5 files changed

+35
-1
lines changed

5 files changed

+35
-1
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
category: minorAnalysis
3+
---
4+
* Enhanced modeling of the [fastify](https://www.npmjs.com/package/fastify) framework to support the `all` route handler method.

javascript/ql/lib/semmle/javascript/frameworks/Fastify.qll

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,8 @@ module Fastify {
138138

139139
RouteSetup() {
140140
this = server(server).getAMethodCall(methodName) and
141-
methodName = ["route", "get", "head", "post", "put", "delete", "options", "patch", "addHook"]
141+
methodName =
142+
["route", "get", "head", "post", "put", "delete", "options", "patch", "addHook", "all"]
142143
}
143144

144145
override DataFlow::SourceNode getARouteHandler() {

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@
5757
| fastify.js:84:30:84:43 | reply.userCode | fastify.js:79:20:79:42 | request ... plyCode | fastify.js:84:30:84:43 | reply.userCode | This code execution depends on a $@. | fastify.js:79:20:79:42 | request ... plyCode | user-provided value |
5858
| fastify.js:99:30:99:52 | reply.l ... tedCode | fastify.js:94:29:94:41 | request.query | fastify.js:99:30:99:52 | reply.l ... tedCode | This code execution depends on a $@. | fastify.js:94:29:94:41 | request.query | user-provided value |
5959
| fastify.js:99:30:99:52 | reply.l ... tedCode | fastify.js:94:29:94:51 | request ... plyCode | fastify.js:99:30:99:52 | reply.l ... tedCode | This code execution depends on a $@. | fastify.js:94:29:94:51 | request ... plyCode | user-provided value |
60+
| fastify.js:107:23:107:31 | userInput | fastify.js:106:21:106:33 | request.query | fastify.js:107:23:107:31 | userInput | This code execution depends on a $@. | fastify.js:106:21:106:33 | request.query | user-provided value |
61+
| fastify.js:107:23:107:31 | userInput | fastify.js:106:21:106:38 | request.query.code | fastify.js:107:23:107:31 | userInput | This code execution depends on a $@. | fastify.js:106:21:106:38 | request.query.code | user-provided value |
62+
| fastify.js:108:28:108:50 | reply.l ... tedCode | fastify.js:94:29:94:41 | request.query | fastify.js:108:28:108:50 | reply.l ... tedCode | This code execution depends on a $@. | fastify.js:94:29:94:41 | request.query | user-provided value |
63+
| fastify.js:108:28:108:50 | reply.l ... tedCode | fastify.js:94:29:94:51 | request ... plyCode | fastify.js:108:28:108:50 | reply.l ... tedCode | This code execution depends on a $@. | fastify.js:94:29:94:51 | request ... plyCode | user-provided value |
6064
| 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 | This code execution depends on a $@. | module.js:9:16:9:29 | req.query.code | user-provided value |
6165
| module.js:11:17:11:30 | req.query.code | module.js:11:17:11:30 | req.query.code | module.js:11:17:11:30 | req.query.code | This code execution depends on a $@. | module.js:11:17:11:30 | req.query.code | user-provided value |
6266
| 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 | This code execution depends on a $@. | react-native.js:7:17:7:33 | req.param("code") | user-provided value |
@@ -145,6 +149,10 @@ edges
145149
| fastify.js:79:20:79:42 | request ... plyCode | fastify.js:84:30:84:43 | reply.userCode | provenance | |
146150
| fastify.js:94:29:94:41 | request.query | fastify.js:94:29:94:51 | request ... plyCode | provenance | |
147151
| fastify.js:94:29:94:51 | request ... plyCode | fastify.js:99:30:99:52 | reply.l ... tedCode | provenance | |
152+
| fastify.js:94:29:94:51 | request ... plyCode | fastify.js:108:28:108:50 | reply.l ... tedCode | provenance | |
153+
| fastify.js:106:9:106:38 | userInput | fastify.js:107:23:107:31 | userInput | provenance | |
154+
| fastify.js:106:21:106:33 | request.query | fastify.js:106:9:106:38 | userInput | provenance | |
155+
| fastify.js:106:21:106:38 | request.query.code | fastify.js:106:9:106:38 | userInput | provenance | |
148156
| react-native.js:7:7:7:33 | tainted | react-native.js:8:32:8:38 | tainted | provenance | |
149157
| react-native.js:7:7:7:33 | tainted | react-native.js:10:23:10:29 | tainted | provenance | |
150158
| react-native.js:7:17:7:33 | req.param("code") | react-native.js:7:7:7:33 | tainted | provenance | |
@@ -268,6 +276,11 @@ nodes
268276
| fastify.js:94:29:94:41 | request.query | semmle.label | request.query |
269277
| fastify.js:94:29:94:51 | request ... plyCode | semmle.label | request ... plyCode |
270278
| fastify.js:99:30:99:52 | reply.l ... tedCode | semmle.label | reply.l ... tedCode |
279+
| fastify.js:106:9:106:38 | userInput | semmle.label | userInput |
280+
| fastify.js:106:21:106:33 | request.query | semmle.label | request.query |
281+
| fastify.js:106:21:106:38 | request.query.code | semmle.label | request.query.code |
282+
| fastify.js:107:23:107:31 | userInput | semmle.label | userInput |
283+
| fastify.js:108:28:108:50 | reply.l ... tedCode | semmle.label | reply.l ... tedCode |
271284
| module.js:9:16:9:29 | req.query.code | semmle.label | req.query.code |
272285
| module.js:11:17:11:30 | req.query.code | semmle.label | req.query.code |
273286
| react-native.js:7:7:7:33 | tainted | semmle.label | tainted |

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@ edges
5151
| fastify.js:79:20:79:42 | request ... plyCode | fastify.js:84:30:84:43 | reply.userCode | provenance | |
5252
| fastify.js:94:29:94:41 | request.query | fastify.js:94:29:94:51 | request ... plyCode | provenance | |
5353
| fastify.js:94:29:94:51 | request ... plyCode | fastify.js:99:30:99:52 | reply.l ... tedCode | provenance | |
54+
| fastify.js:94:29:94:51 | request ... plyCode | fastify.js:108:28:108:50 | reply.l ... tedCode | provenance | |
55+
| fastify.js:106:9:106:38 | userInput | fastify.js:107:23:107:31 | userInput | provenance | |
56+
| fastify.js:106:21:106:33 | request.query | fastify.js:106:9:106:38 | userInput | provenance | |
57+
| fastify.js:106:21:106:38 | request.query.code | fastify.js:106:9:106:38 | userInput | provenance | |
5458
| react-native.js:7:7:7:33 | tainted | react-native.js:8:32:8:38 | tainted | provenance | |
5559
| react-native.js:7:7:7:33 | tainted | react-native.js:10:23:10:29 | tainted | provenance | |
5660
| react-native.js:7:17:7:33 | req.param("code") | react-native.js:7:7:7:33 | tainted | provenance | |
@@ -176,6 +180,11 @@ nodes
176180
| fastify.js:94:29:94:41 | request.query | semmle.label | request.query |
177181
| fastify.js:94:29:94:51 | request ... plyCode | semmle.label | request ... plyCode |
178182
| fastify.js:99:30:99:52 | reply.l ... tedCode | semmle.label | reply.l ... tedCode |
183+
| fastify.js:106:9:106:38 | userInput | semmle.label | userInput |
184+
| fastify.js:106:21:106:33 | request.query | semmle.label | request.query |
185+
| fastify.js:106:21:106:38 | request.query.code | semmle.label | request.query.code |
186+
| fastify.js:107:23:107:31 | userInput | semmle.label | userInput |
187+
| fastify.js:108:28:108:50 | reply.l ... tedCode | semmle.label | reply.l ... tedCode |
179188
| module.js:9:16:9:29 | req.query.code | semmle.label | req.query.code |
180189
| module.js:11:17:11:30 | req.query.code | semmle.label | req.query.code |
181190
| react-native.js:7:7:7:33 | tainted | semmle.label | tainted |

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,3 +101,10 @@ fastify.get('/flow-through-reply', async (request, reply) => {
101101
}
102102
return { result: null };
103103
});
104+
105+
fastify.all('/eval', async (request, reply) => {
106+
const userInput = request.query.code; // $ Source[js/code-injection]
107+
const result = eval(userInput); // $ Alert[js/code-injection]
108+
const replyResult = eval(reply.locals.nestedCode); // $ Alert[js/code-injection]
109+
return { method: request.method, result };
110+
});

0 commit comments

Comments
 (0)