@@ -2165,22 +2165,10 @@ private module StdlibPrivate {
21652165 private class RequestCall extends HTTP:: Client:: Request:: Range , DataFlow:: MethodCallNode {
21662166 RequestCall ( ) { this .calls ( instance ( _) , [ "request" , "_send_request" , "putrequest" ] ) }
21672167
2168- override DataFlow:: Node getResponse ( ) {
2169- // TODO: this does not seem like the right abstraction, to allow for nice path-explanations
2170- //
2171- // For nice path-explanation, we would like either
2172- // 1: tainting instance
2173- // 1a. host on object creation -> obj
2174- // 1b. url on request call -> obj
2175- // 2. obj -> obj.getresponse()
2176- //
2177- // For now, that's really all we use the `getResponse` predicate for.
2178- result .( HttpConnectionGetResponseCall ) .getObject ( ) .getALocalSource ( ) =
2179- this .getObject ( ) .getALocalSource ( )
2180- }
2168+ DataFlow:: Node getUrlArg ( ) { result in [ this .getArg ( 1 ) , this .getArgByName ( "url" ) ] }
21812169
21822170 override DataFlow:: Node getAUrlPart ( ) {
2183- result in [ this .getArg ( 1 ) , this . getArgByName ( "url" ) ]
2171+ result = this .getUrlArg ( )
21842172 or
21852173 this .getObject ( ) = instance ( result )
21862174 }
@@ -2202,6 +2190,32 @@ private module StdlibPrivate {
22022190 HTTPResponse:: InstanceSource {
22032191 HttpConnectionGetResponseCall ( ) { this .calls ( instance ( _) , "getresponse" ) }
22042192 }
2193+
2194+ /**
2195+ * Extra taint propagation for `http.client.HTTPConnection`,
2196+ * to ensure that responses to user-controlled URL are tainted.
2197+ */
2198+ private class AdditionalTaintStep extends TaintTracking:: AdditionalTaintStep {
2199+ override predicate step ( DataFlow:: Node nodeFrom , DataFlow:: Node nodeTo ) {
2200+ // constructor
2201+ exists ( InstanceSource instanceSource |
2202+ nodeFrom = instanceSource .getHostArgument ( ) and
2203+ nodeTo = instanceSource
2204+ )
2205+ or
2206+ // a request method
2207+ exists ( RequestCall call |
2208+ nodeFrom = call .getUrlArg ( ) and
2209+ nodeTo .( DataFlow:: PostUpdateNode ) .getPreUpdateNode ( ) = call .getObject ( )
2210+ )
2211+ or
2212+ // `getresponse` call
2213+ exists ( HttpConnectionGetResponseCall call |
2214+ nodeFrom = call .getObject ( ) and
2215+ nodeTo = call
2216+ )
2217+ }
2218+ }
22052219 }
22062220
22072221 /**
0 commit comments