@@ -38,17 +38,18 @@ module BusBoy {
38
38
}
39
39
40
40
/**
41
- * Holds if busboy file data as additional taint steps according to a Readable Stream type
42
- *
43
- * TODO: I don't know how it can be a global taint step!
41
+ * A busboy file data step according to a Readable Stream type
44
42
*/
45
- predicate busBoyReadableAdditionalTaintStep ( DataFlow:: Node pred , DataFlow:: Node succ ) {
46
- exists ( API:: Node busboyOnEvent |
47
- busboyOnEvent = API:: moduleImport ( "busboy" ) .getReturn ( ) .getMember ( "on" )
48
- |
49
- busboyOnEvent .getParameter ( 0 ) .asSink ( ) .mayHaveStringValue ( "file" ) and
50
- customStreamPipeAdditionalTaintStep ( busboyOnEvent .getParameter ( 1 ) .getParameter ( 1 ) , pred , succ )
51
- )
43
+ private class AdditionalTaintStep extends TaintTracking:: SharedTaintStep {
44
+ override predicate step ( DataFlow:: Node pred , DataFlow:: Node succ ) {
45
+ exists ( API:: Node busboyOnEvent |
46
+ busboyOnEvent = API:: moduleImport ( "busboy" ) .getReturn ( ) .getMember ( "on" )
47
+ |
48
+ busboyOnEvent .getParameter ( 0 ) .asSink ( ) .mayHaveStringValue ( "file" ) and
49
+ customStreamPipeAdditionalTaintStep ( busboyOnEvent .getParameter ( 1 ) .getParameter ( 1 ) , pred ,
50
+ succ )
51
+ )
52
+ }
52
53
}
53
54
}
54
55
@@ -89,11 +90,6 @@ module Formidable {
89
90
}
90
91
}
91
92
92
- API:: Node test ( ) {
93
- result =
94
- API:: moduleImport ( "multiparty" ) .getMember ( "Form" ) .getInstance ( ) .getMember ( "on" ) .getASuccessor * ( )
95
- }
96
-
97
93
/**
98
94
* A module for modeling [multiparty](https://www.npmjs.com/package/multiparty) package
99
95
*/
@@ -116,7 +112,7 @@ module Multiparty {
116
112
this = on .getParameter ( 1 ) .getParameter ( [ 0 , 1 ] ) .asSource ( )
117
113
or
118
114
on .getParameter ( 0 ) .asSink ( ) .mayHaveStringValue ( "part" ) and
119
- this = readableStreamDataNode ( on .getParameter ( 1 ) .getParameter ( 0 ) ) .asSink ( )
115
+ this = readableStreamDataNode ( on .getParameter ( 1 ) .getParameter ( 0 ) ) .asSource ( )
120
116
)
121
117
)
122
118
)
@@ -126,18 +122,58 @@ module Multiparty {
126
122
}
127
123
128
124
/**
129
- * Holds if multiparty part data as additional taint steps according to a Readable Stream type
130
- *
131
- * TODO: I don't know how it can be a global taint step!
125
+ * A multiparty part data step according to a Readable Stream type
126
+ */
127
+ private class AdditionalTaintStep extends TaintTracking:: SharedTaintStep {
128
+ override predicate step ( DataFlow:: Node pred , DataFlow:: Node succ ) {
129
+ exists ( API:: Node multipartyOnEvent |
130
+ multipartyOnEvent =
131
+ API:: moduleImport ( "multiparty" ) .getMember ( "Form" ) .getInstance ( ) .getMember ( "on" )
132
+ |
133
+ multipartyOnEvent .getParameter ( 0 ) .asSink ( ) .mayHaveStringValue ( "part" ) and
134
+ customStreamPipeAdditionalTaintStep ( multipartyOnEvent .getParameter ( 1 ) .getParameter ( 0 ) , pred ,
135
+ succ )
136
+ )
137
+ }
138
+ }
139
+ }
140
+
141
+ /**
142
+ * A module for modeling [dicer](https://www.npmjs.com/package/dicer) package
143
+ */
144
+ module Dicer {
145
+ /**
146
+ * A source of remote flow from the `dicer` library.
132
147
*/
133
- predicate multipartyReadableAdditionalTaintStep ( DataFlow:: Node pred , DataFlow:: Node succ ) {
134
- exists ( API:: Node multipartyOnEvent |
135
- multipartyOnEvent =
136
- API:: moduleImport ( "multiparty" ) .getMember ( "Form" ) .getInstance ( ) .getMember ( "on" )
137
- |
138
- multipartyOnEvent .getParameter ( 0 ) .asSink ( ) .mayHaveStringValue ( "part" ) and
139
- customStreamPipeAdditionalTaintStep ( multipartyOnEvent .getParameter ( 1 ) .getParameter ( 0 ) , pred ,
140
- succ )
141
- )
148
+ private class DicerRemoteFlow extends RemoteFlowSource {
149
+ DicerRemoteFlow ( ) {
150
+ exists ( API:: Node dicer | dicer = API:: moduleImport ( "dicer" ) .getInstance ( ) |
151
+ exists ( API:: Node on | on = dicer .getMember ( "on" ) |
152
+ on .getParameter ( 0 ) .asSink ( ) .mayHaveStringValue ( "part" ) and
153
+ this = readableStreamDataNode ( on .getParameter ( 1 ) .getParameter ( 0 ) ) .asSource ( )
154
+ or
155
+ exists ( API:: Node onPart | onPart = on .getParameter ( 1 ) .getParameter ( 0 ) .getMember ( "on" ) |
156
+ onPart .getParameter ( 0 ) .asSink ( ) .mayHaveStringValue ( "header" ) and
157
+ this = onPart .getParameter ( 1 ) .getParameter ( 0 ) .asSource ( )
158
+ )
159
+ )
160
+ )
161
+ }
162
+
163
+ override string getSourceType ( ) { result = "parsed user value from Dicer" }
164
+ }
165
+
166
+ /**
167
+ * A dicer part data step according to a Readable Stream type
168
+ */
169
+ private class AdditionalTaintStep extends TaintTracking:: SharedTaintStep {
170
+ override predicate step ( DataFlow:: Node pred , DataFlow:: Node succ ) {
171
+ exists ( API:: Node onEvent |
172
+ onEvent = API:: moduleImport ( "dicer" ) .getInstance ( ) .getMember ( "on" )
173
+ |
174
+ onEvent .getParameter ( 0 ) .asSink ( ) .mayHaveStringValue ( "part" ) and
175
+ customStreamPipeAdditionalTaintStep ( onEvent .getParameter ( 1 ) .getParameter ( 0 ) , pred , succ )
176
+ )
177
+ }
142
178
}
143
179
}
0 commit comments