Skip to content

Commit 4b0354c

Browse files
authored
Merge pull request github#3555 from max-schaefer/js/require-flow
Approved by asgerf
2 parents 4b56229 + 573fdaa commit 4b0354c

File tree

3 files changed

+18
-8
lines changed

3 files changed

+18
-8
lines changed

javascript/ql/src/semmle/javascript/NodeJS.qll

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,18 @@ private class RequireVariable extends Variable {
152152
*/
153153
private predicate moduleInFile(Module m, File f) { m.getFile() = f }
154154

155+
/**
156+
* Holds if `nd` may refer to `require`, either directly or modulo local data flow.
157+
*/
158+
cached
159+
private predicate isRequire(DataFlow::Node nd) {
160+
nd.asExpr() = any(RequireVariable req).getAnAccess() and
161+
// `mjs` files explicitly disallow `require`
162+
not nd.getFile().getExtension() = "mjs"
163+
or
164+
isRequire(nd.getAPredecessor())
165+
}
166+
155167
/**
156168
* A `require` import.
157169
*
@@ -162,12 +174,7 @@ private predicate moduleInFile(Module m, File f) { m.getFile() = f }
162174
* ```
163175
*/
164176
class Require extends CallExpr, Import {
165-
cached
166-
Require() {
167-
any(RequireVariable req).getAnAccess() = getCallee() and
168-
// `mjs` files explicitly disallow `require`
169-
not getFile().getExtension() = "mjs"
170-
}
177+
Require() { isRequire(getCallee().flow()) }
171178

172179
override PathExpr getImportedPath() { result = getArgument(0) }
173180

@@ -257,8 +264,8 @@ private class RequirePath extends PathExprCandidate {
257264
RequirePath() {
258265
this = any(Require req).getArgument(0)
259266
or
260-
exists(RequireVariable req, MethodCallExpr reqres |
261-
reqres.getReceiver() = req.getAnAccess() and
267+
exists(MethodCallExpr reqres |
268+
isRequire(reqres.getReceiver().flow()) and
262269
reqres.getMethodName() = "resolve" and
263270
this = reqres.getArgument(0)
264271
)

javascript/ql/test/library-tests/NodeJS/Require.expected

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
| d.js:7:1:7:14 | require('foo') |
1212
| e.js:5:1:5:18 | require("process") |
1313
| f.js:2:1:2:7 | r("fs") |
14+
| g.js:1:1:1:96 | (proces ... https") |
15+
| g.js:1:43:1:61 | require("electron") |
1416
| index.js:1:12:1:26 | require('path') |
1517
| index.js:2:1:2:41 | require ... b.js")) |
1618
| mjs-files/require-from-js.js:1:12:1:36 | require ... on-me') |
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
(process && "renderer" === process.type ? require("electron").remote.require : require)("https");

0 commit comments

Comments
 (0)