@@ -13,9 +13,10 @@ import java
1313import semmle.code.java.dataflow.TaintTracking
1414import semmle.code.java.frameworks.Networking
1515import DataFlow:: PathGraph
16+ private import semmle.code.java.dataflow.ExternalFlow
1617
17- class HTTPString extends StringLiteral {
18- HTTPString ( ) {
18+ class HttpString extends StringLiteral {
19+ HttpString ( ) {
1920 // Avoid matching "https" here.
2021 exists ( string s | this .getRepresentedString ( ) = s |
2122 (
@@ -30,26 +31,12 @@ class HTTPString extends StringLiteral {
3031 }
3132}
3233
33- class URLOpenMethod extends Method {
34- URLOpenMethod ( ) {
35- this .getDeclaringType ( ) .getQualifiedName ( ) = "java.net.URL" and
36- (
37- this .getName ( ) = "openConnection" or
38- this .getName ( ) = "openStream"
39- )
40- }
41- }
34+ class HttpStringToUrlOpenMethodFlowConfig extends TaintTracking:: Configuration {
35+ HttpStringToUrlOpenMethodFlowConfig ( ) { this = "HttpsUrls::HttpStringToUrlOpenMethodFlowConfig" }
4236
43- class HTTPStringToURLOpenMethodFlowConfig extends TaintTracking:: Configuration {
44- HTTPStringToURLOpenMethodFlowConfig ( ) { this = "HttpsUrls::HTTPStringToURLOpenMethodFlowConfig" }
37+ override predicate isSource ( DataFlow:: Node src ) { src .asExpr ( ) instanceof HttpString }
4538
46- override predicate isSource ( DataFlow:: Node src ) { src .asExpr ( ) instanceof HTTPString }
47-
48- override predicate isSink ( DataFlow:: Node sink ) {
49- exists ( MethodAccess m |
50- sink .asExpr ( ) = m .getQualifier ( ) and m .getMethod ( ) instanceof URLOpenMethod
51- )
52- }
39+ override predicate isSink ( DataFlow:: Node sink ) { sink instanceof UrlOpenSink }
5340
5441 override predicate isAdditionalTaintStep ( DataFlow:: Node node1 , DataFlow:: Node node2 ) {
5542 exists ( UrlConstructorCall u |
@@ -63,10 +50,17 @@ class HTTPStringToURLOpenMethodFlowConfig extends TaintTracking::Configuration {
6350 }
6451}
6552
66- from DataFlow:: PathNode source , DataFlow:: PathNode sink , MethodAccess m , HTTPString s
53+ /**
54+ * A sink that represents a URL opening method call, such as a call to `java.net.URL.openConnection()`.
55+ */
56+ private class UrlOpenSink extends DataFlow:: Node {
57+ UrlOpenSink ( ) { sinkNode ( this , "open-url" ) }
58+ }
59+
60+ from DataFlow:: PathNode source , DataFlow:: PathNode sink , MethodAccess m , HttpString s
6761where
6862 source .getNode ( ) .asExpr ( ) = s and
6963 sink .getNode ( ) .asExpr ( ) = m .getQualifier ( ) and
70- any ( HTTPStringToURLOpenMethodFlowConfig c ) .hasFlowPath ( source , sink )
64+ any ( HttpStringToUrlOpenMethodFlowConfig c ) .hasFlowPath ( source , sink )
7165select m , source , sink , "URL may have been constructed with HTTP protocol, using $@." , s ,
7266 "this source"
0 commit comments