@@ -2,53 +2,75 @@ import javascript
2
2
import API
3
3
4
4
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 =
8
7
[
9
8
API:: moduleImport ( "fs" ) .getMember ( "createReadStream" ) ,
10
9
API:: moduleImport ( "stream" ) .getMember ( "Readable" )
11
10
]
12
11
|
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 )
15
26
)
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 ( )
16
36
or
17
37
// 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 * ( ) |
25
39
pred = cn .getParameter ( 0 ) .asSink ( ) and
26
40
succ = cn .getReturn ( ) .getMember ( "pipe" ) .getParameter ( 0 ) .asSink ( )
27
41
)
28
- or
42
+ }
43
+
44
+ predicate streamPipelineAdditionalTaintStep ( DataFlow:: Node pred , DataFlow:: Node succ ) {
29
45
// this step connect the a pipe parameter to the next parameter
30
46
exists ( API:: Node cn , int i |
31
47
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" )
37
49
|
38
50
pred = cn .getParameter ( i ) .asSink ( ) and
39
51
succ = cn .getParameter ( i + 1 ) .asSink ( )
40
52
)
41
53
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
43
55
exists ( API:: Node cn , int i |
44
56
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" )
50
58
|
51
59
pred = cn .getParameter ( 0 ) .asSink ( ) and
52
60
succ = cn .getParameter ( i ) .asSink ( )
53
61
)
54
62
}
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