Skip to content

Commit 2d67526

Browse files
committed
use the generalized fs module in more places
1 parent c06680a commit 2d67526

File tree

3 files changed

+30
-25
lines changed

3 files changed

+30
-25
lines changed

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

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ module NodeJSLib {
306306

307307
FsFlowTarget() {
308308
exists(DataFlow::CallNode call, string methodName |
309-
call = DataFlow::moduleMember("fs", methodName).getACall()
309+
call = Fs::moduleMember(methodName).getACall()
310310
|
311311
methodName = "realpathSync" and
312312
tainted = call.getArgument(0) and
@@ -430,27 +430,32 @@ module NodeJSLib {
430430
}
431431

432432
/**
433-
* A member `member` from module `fs` or its drop-in replacements `graceful-fs`, `fs-extra`, `original-fs`.
433+
* Provides predicates for working with the "fs" module and its variants as a single module.
434434
*/
435-
private DataFlow::SourceNode fsModuleMember(string member) {
436-
result = fsModule(DataFlow::TypeTracker::end()).getAPropertyRead(member)
437-
}
435+
module Fs {
436+
/**
437+
* A member `member` from module `fs` or its drop-in replacements `graceful-fs`, `fs-extra`, `original-fs`.
438+
*/
439+
DataFlow::SourceNode moduleMember(string member) {
440+
result = fsModule(DataFlow::TypeTracker::end()).getAPropertyRead(member)
441+
}
438442

439-
private DataFlow::SourceNode fsModule(DataFlow::TypeTracker t) {
440-
exists(string moduleName |
441-
moduleName = "fs" or
442-
moduleName = "graceful-fs" or
443-
moduleName = "fs-extra" or
444-
moduleName = "original-fs"
445-
|
446-
result = DataFlow::moduleImport(moduleName)
443+
private DataFlow::SourceNode fsModule(DataFlow::TypeTracker t) {
444+
exists(string moduleName |
445+
moduleName = "fs" or
446+
moduleName = "graceful-fs" or
447+
moduleName = "fs-extra" or
448+
moduleName = "original-fs"
449+
|
450+
result = DataFlow::moduleImport(moduleName)
451+
or
452+
// extra support for flexible names
453+
result.asExpr().(Require).getArgument(0).mayHaveStringValue(moduleName)
454+
) and
455+
t.start()
447456
or
448-
// extra support for flexible names
449-
result.asExpr().(Require).getArgument(0).mayHaveStringValue(moduleName)
450-
) and
451-
t.start()
452-
or
453-
exists(DataFlow::TypeTracker t2 | result = fsModule(t2).track(t2, t))
457+
exists(DataFlow::TypeTracker t2 | result = fsModule(t2).track(t2, t))
458+
}
454459
}
455460

456461
/**
@@ -459,7 +464,7 @@ module NodeJSLib {
459464
private class NodeJSFileSystemAccess extends FileSystemAccess, DataFlow::CallNode {
460465
string methodName;
461466

462-
NodeJSFileSystemAccess() { this = maybePromisified(fsModuleMember(methodName)).getACall() }
467+
NodeJSFileSystemAccess() { this = maybePromisified(Fs::moduleMember(methodName)).getACall() }
463468

464469
/**
465470
* Gets the name of the called method.
@@ -582,8 +587,8 @@ module NodeJSLib {
582587
name = "readdir" or
583588
name = "realpath"
584589
|
585-
this = fsModuleMember(name).getACall().getCallback([1 .. 2]).getParameter(1) or
586-
this = fsModuleMember(name + "Sync").getACall()
590+
this = Fs::moduleMember(name).getACall().getCallback([1 .. 2]).getParameter(1) or
591+
this = Fs::moduleMember(name + "Sync").getACall()
587592
)
588593
}
589594
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,11 +155,11 @@ module TaintedPath {
155155
input = getAnArgument() and
156156
output = this
157157
or
158-
this = DataFlow::moduleMember("fs", "realpathSync").getACall() and
158+
this = NodeJSLib::Fs::moduleMember("realpathSync").getACall() and
159159
input = getArgument(0) and
160160
output = this
161161
or
162-
this = DataFlow::moduleMember("fs", "realpath").getACall() and
162+
this = NodeJSLib::Fs::moduleMember("realpath").getACall() and
163163
input = getArgument(0) and
164164
output = getCallback(1).getParameter(1)
165165
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ module ZipSlip {
107107
// However, we want to consider even the bare `createWriteStream`
108108
// to be a zipslip vulnerability since it may truncate an
109109
// existing file.
110-
this = DataFlow::moduleImport("fs").getAMemberCall("createWriteStream").getArgument(0)
110+
this = NodeJSLib::Fs::moduleMember("createWriteStream").getACall().getArgument(0)
111111
}
112112
}
113113

0 commit comments

Comments
 (0)