Skip to content

Commit d06444e

Browse files
committed
upgrade additional steps
1 parent 369bc50 commit d06444e

File tree

2 files changed

+50
-24
lines changed

2 files changed

+50
-24
lines changed

javascript/ql/src/experimental/Security/CWE-522-DecompressionBombs/DecompressionBombs.ql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,10 @@ class BombConfiguration extends TaintTracking::Configuration {
140140
//node-tar
141141
readablePipeAdditionalTaintStep(pred, succ)
142142
or
143+
streamPipelineAdditionalTaintStep(pred, succ)
144+
or
145+
promisesFileHandlePipeAdditionalTaintStep(pred, succ)
146+
or
143147
exists(FileSystemReadAccess cn | pred = cn.getADataNode() and succ = cn.getAPathArgument())
144148
or
145149
exists(DataFlow::Node sinkhelper, AstNode an |

javascript/ql/src/experimental/Security/CWE-522-DecompressionBombs/ReadableAdditionalStep.qll

Lines changed: 46 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,53 +2,75 @@ import javascript
22
import API
33

44
predicate readablePipeAdditionalTaintStep(DataFlow::Node pred, DataFlow::Node succ) {
5-
// this step connect the first pipe parameter to the last pipe parameter
6-
exists(API::Node cn |
7-
cn =
5+
exists(API::Node receiver |
6+
receiver =
87
[
98
API::moduleImport("fs").getMember("createReadStream"),
109
API::moduleImport("stream").getMember("Readable")
1110
]
1211
|
13-
pred = cn.getParameter(0).asSink() and
14-
succ = cn.getASuccessor*().getMember("pipe").getParameter(0).asSink()
12+
genaralStreamPipeAdditionalTaintStep(receiver, pred, succ)
13+
)
14+
}
15+
16+
predicate promisesFileHandlePipeAdditionalTaintStep(DataFlow::Node pred, DataFlow::Node succ) {
17+
exists(API::Node receiver |
18+
receiver =
19+
nodeJsPromisesFileSystem()
20+
.getMember("open")
21+
.getASuccessor*()
22+
.getMember(["createReadStream", "createWriteStream"])
23+
.getReturn()
24+
|
25+
genaralStreamPipeAdditionalTaintStep(receiver, pred, succ)
1526
)
27+
}
28+
29+
// git receiver which we'll have receiver(pred).pipe(succ) and other succerssor pipe methods
30+
predicate genaralStreamPipeAdditionalTaintStep(
31+
API::Node receiver, DataFlow::Node pred, DataFlow::Node succ
32+
) {
33+
// this step connect the first pipe parameter to the last pipe parameter
34+
pred = [receiver.getParameter(0).asSink(), receiver.asSource()] and
35+
succ = receiver.getASuccessor*().getMember("pipe").getParameter(0).asSink()
1636
or
1737
// this step connect the a pipe parameter to the next pipe parameter
18-
exists(API::Node cn |
19-
cn =
20-
[
21-
API::moduleImport("fs").getMember("createReadStream"),
22-
API::moduleImport("stream").getMember("Readable")
23-
].getASuccessor*()
24-
|
38+
exists(API::Node cn | cn = receiver.getASuccessor*() |
2539
pred = cn.getParameter(0).asSink() and
2640
succ = cn.getReturn().getMember("pipe").getParameter(0).asSink()
2741
)
28-
or
42+
}
43+
44+
predicate streamPipelineAdditionalTaintStep(DataFlow::Node pred, DataFlow::Node succ) {
2945
// this step connect the a pipe parameter to the next parameter
3046
exists(API::Node cn, int i |
3147
i in [0 .. 10] and
32-
cn =
33-
[
34-
API::moduleImport("stream/promises").getMember("pipeline"),
35-
API::moduleImport("stream").getMember("pipeline")
36-
]
48+
cn = nodeJsStream().getMember("pipeline")
3749
|
3850
pred = cn.getParameter(i).asSink() and
3951
succ = cn.getParameter(i + 1).asSink()
4052
)
4153
or
42-
// this step connect the first pipe parameter to all of the next parameters
54+
// this step connect the first pipe parameter to the next parameter
4355
exists(API::Node cn, int i |
4456
i in [1 .. 10] and
45-
cn =
46-
[
47-
API::moduleImport("stream/promises").getMember("pipeline"),
48-
API::moduleImport("stream").getMember("pipeline")
49-
]
57+
cn = nodeJsStream().getMember("pipeline")
5058
|
5159
pred = cn.getParameter(0).asSink() and
5260
succ = cn.getParameter(i).asSink()
5361
)
5462
}
63+
64+
/**
65+
* Promises API
66+
*/
67+
API::Node nodeJsPromisesFileSystem() {
68+
result = [API::moduleImport("fs").getMember("promises"), API::moduleImport("fs/promises")]
69+
}
70+
71+
/**
72+
* Stream Promises API
73+
*/
74+
API::Node nodeJsStream() {
75+
result = [API::moduleImport("stream/promises"), API::moduleImport("stream").getMember("promises")]
76+
}

0 commit comments

Comments
 (0)