Skip to content

Commit 6533ddf

Browse files
authored
Merge pull request #20 from esben-semmle/js/more-auth-calls-and-rate-limiters
Approved by xiemaisi
2 parents c06edd3 + fa90c53 commit 6533ddf

File tree

5 files changed

+7
-2
lines changed

5 files changed

+7
-2
lines changed

change-notes/1.18/analysis-javascript.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
| CORS misconfiguration for credentials transfer | More true-positive results | This rule now treats header names case-insensitively. |
4141
| Hard-coded credentials | More true-positive results | This rule now recognizes secret cryptographic keys. |
4242
| Insecure randomness | More true-positive results | This rule now recognizes secret cryptographic keys. |
43+
| Missing rate limiting | More true-positive results, fewer false-positive results | This rule now recognizes additional rate limiters and expensive route handlers. |
4344
| Missing X-Frame-Options HTTP header | Fewer false-positive results | This rule now treats header names case-insensitively. |
4445
| Reflected cross-site scripting | Fewer false-positive results | This rule now treats header names case-insensitively. |
4546
| Server-side URL redirect | More true-positive results | This rule now treats header names case-insensitively. |

javascript/ql/src/semmle/javascript/security/SensitiveActions.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ class AuthorizationCall extends SensitiveAction, DataFlow::CallNode {
143143
exists(string s | s = getCalleeName() |
144144
// name contains `login` or `auth`, but not as part of `loginfo` or `unauth`;
145145
// also exclude `author`
146-
s.regexpMatch("(?i).*(login(?!fo)|(?<!un)auth(?!or\\b)).*") and
146+
s.regexpMatch("(?i).*(login(?!fo)|(?<!un)auth(?!or\\b)|verify).*") and
147147
// but it does not start with `get` or `set`
148148
not s.regexpMatch("(?i)(get|set).*")
149149
)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ abstract class RateLimiter extends Express::RouteHandlerExpr {
131131
*/
132132
class ExpressRateLimit extends RateLimiter {
133133
ExpressRateLimit() {
134-
DataFlow::moduleImport("express-rate-limit").getAnInstantiation().flowsToExpr(this)
134+
DataFlow::moduleImport("express-rate-limit").getAnInvocation().flowsToExpr(this)
135135
}
136136
}
137137

javascript/ql/test/query-tests/Security/CWE-770/MissingRateLimiting.expected

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@
66
| tst.js:36:20:36:36 | expensiveHandler2 | This route handler performs $@, but is not rate-limited. | tst.js:15:40:15:73 | fs.writ ... quest") | a file system access |
77
| tst.js:37:20:37:36 | expensiveHandler3 | This route handler performs $@, but is not rate-limited. | tst.js:16:40:16:70 | child_p ... /true") | a system command |
88
| tst.js:38:20:38:36 | expensiveHandler4 | This route handler performs $@, but is not rate-limited. | tst.js:17:40:17:83 | connect ... ution') | a database access |
9+
| tst.js:64:25:64:63 | functio ... req); } | This route handler performs $@, but is not rate-limited. | tst.js:64:46:64:60 | verifyUser(req) | authorization |

javascript/ql/test/query-tests/Security/CWE-770/tst.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,6 @@ app2.get('/:path', bruteforce.prevent, expensiveHandler1); // OK
6060
var app3 = express();
6161
var limiter = require('express-limiter')(app3);
6262
app3.get('/:path', expensiveHandler1); // OK
63+
64+
express().get('/:path', function(req, res) { verifyUser(req); }); // NOT OK
65+
express().get('/:path', RateLimit(), function(req, res) { verifyUser(req); }); // OK

0 commit comments

Comments
 (0)