@@ -38,17 +38,18 @@ module BusBoy {
3838 }
3939
4040 /**
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
4442 */
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+ }
5253 }
5354}
5455
@@ -89,11 +90,6 @@ module Formidable {
8990 }
9091}
9192
92- API:: Node test ( ) {
93- result =
94- API:: moduleImport ( "multiparty" ) .getMember ( "Form" ) .getInstance ( ) .getMember ( "on" ) .getASuccessor * ( )
95- }
96-
9793/**
9894 * A module for modeling [multiparty](https://www.npmjs.com/package/multiparty) package
9995 */
@@ -116,7 +112,7 @@ module Multiparty {
116112 this = on .getParameter ( 1 ) .getParameter ( [ 0 , 1 ] ) .asSource ( )
117113 or
118114 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 ( )
120116 )
121117 )
122118 )
@@ -126,18 +122,58 @@ module Multiparty {
126122 }
127123
128124 /**
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.
132147 */
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+ }
142178 }
143179}
0 commit comments