@@ -2,53 +2,75 @@ import javascript
22import API
33
44predicate 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