Skip to content

Commit dbf085a

Browse files
authored
Merge pull request #1432 from xiemaisi/js/process-module
Approved by esben-semmle
2 parents 1ff67f7 + 70cf32c commit dbf085a

File tree

4 files changed

+26
-9
lines changed

4 files changed

+26
-9
lines changed

javascript/ql/src/semmle/javascript/frameworks/NodeJSLib.qll

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,23 @@ import semmle.javascript.security.SensitiveActions
88

99
module NodeJSLib {
1010
/**
11-
* Gets a reference to the 'process' object.
11+
* An access to the global `process` variable in a Node.js module, interpreted as
12+
* an import of the `process` module.
1213
*/
13-
DataFlow::SourceNode process() {
14-
result = DataFlow::globalVarRef("process") or
15-
result = DataFlow::moduleImport("process")
14+
private class ImplicitProcessImport extends DataFlow::ModuleImportNode::Range {
15+
ImplicitProcessImport() {
16+
this = DataFlow::globalVarRef("process") and
17+
getTopLevel() instanceof NodeModule
18+
}
19+
20+
override string getPath() { result = "process" }
1621
}
1722

1823
/**
19-
* Gets a reference to a member of the 'process' object.
24+
* Gets a reference to the 'process' object.
2025
*/
21-
private DataFlow::SourceNode processMember(string member) {
22-
result = process().getAPropertyRead(member) or
23-
result = DataFlow::moduleMember("process", member)
26+
DataFlow::SourceNode process() {
27+
result = DataFlow::moduleImport("process")
2428
}
2529

2630
/**
@@ -363,7 +367,7 @@ module NodeJSLib {
363367
ProcessTermination() {
364368
this = DataFlow::moduleImport("exit").getAnInvocation()
365369
or
366-
this = processMember("exit").getACall()
370+
this = DataFlow::moduleMember("process", "exit").getACall()
367371
}
368372
}
369373

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
var p1 = require('process');
2+
var p2 = global.process;
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
require('fs');
2+
var p3 = process;

javascript/ql/test/library-tests/ModuleImportNodes/tests.expected

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ test_ModuleImportNode
1313
| moduleUses.js:1:11:1:24 | require('mod') | mod | moduleUses.js:11:1:11:3 | mod | mod |
1414
| moduleUses.js:1:11:1:24 | require('mod') | mod | moduleUses.js:13:1:13:3 | mod | mod |
1515
| moduleUses.js:1:11:1:24 | require('mod') | mod | moduleUses.js:15:5:15:7 | mod | mod |
16+
| process2.js:2:10:2:16 | process | process | process2.js:2:10:2:16 | process | process |
1617
test_ModuleImportNode_getAConstructorInvocation
1718
| destructuringES6.js:1:1:1:41 | import ... ctron'; | destructuringES6.js:2:1:2:19 | new BrowserWindow() |
1819
| destructuringRequire.js:1:27:1:45 | require('electron') | destructuringRequire.js:2:1:2:19 | new BrowserWindow() |
@@ -22,11 +23,15 @@ test_moduleImport
2223
| electron | destructuringRequire.js:1:27:1:45 | require('electron') |
2324
| fs | amd1.js:1:25:1:26 | fs |
2425
| fs | amd2.js:2:12:2:24 | require('fs') |
26+
| fs | process2.js:1:1:1:13 | require('fs') |
2527
| mod | moduleUses.js:1:11:1:24 | require('mod') |
2628
| myDefaultImportedModuleInstance | instanceThroughDefaultImport.js:1:1:1:82 | import ... tance'; |
2729
| myDefaultImportedModuleInstance | instanceThroughDefaultImport.js:1:8:1:42 | myDefaultImportedModuleInstanceName |
2830
| myNamespaceImportedModuleInstance | instanceThroughNamespaceImport.js:1:8:1:49 | myNamespaceImportedModuleInstanceName |
2931
| myRequiredModuleInstance | instanceThroughRequire.js:1:36:1:70 | require ... tance') |
32+
| process | process2.js:2:10:2:16 | process |
33+
| process | process.js:1:10:1:27 | require('process') |
34+
| process | process.js:2:10:2:23 | global.process |
3035
test_moduleMember
3136
| electron | BrowserWindow | destructuringES6.js:1:10:1:22 | BrowserWindow |
3237
| electron | BrowserWindow | destructuringRequire.js:1:9:1:21 | BrowserWindow |
@@ -47,6 +52,10 @@ test_ModuleImportNode_getPath
4752
| instanceThroughNamespaceImport.js:1:8:1:49 | myNamespaceImportedModuleInstanceName | myNamespaceImportedModuleInstance |
4853
| instanceThroughRequire.js:1:36:1:70 | require ... tance') | myRequiredModuleInstance |
4954
| moduleUses.js:1:11:1:24 | require('mod') | mod |
55+
| process2.js:1:1:1:13 | require('fs') | fs |
56+
| process2.js:2:10:2:16 | process | process |
57+
| process.js:1:10:1:27 | require('process') | process |
58+
| process.js:2:10:2:23 | global.process | process |
5059
test_ModuleImportNode_getAMethodCall
5160
| amd1.js:1:25:1:26 | fs | amd1.js:2:3:2:29 | fs.read ... a.txt") |
5261
| amd2.js:2:12:2:24 | require('fs') | amd2.js:3:3:3:29 | fs.read ... a.txt") |

0 commit comments

Comments
 (0)