@@ -14,8 +14,7 @@ import java
14
14
import semmle.code.java.dataflow.FlowSources
15
15
import semmle.code.java.frameworks.Servlets
16
16
import semmle.code.java.dataflow.TaintTracking
17
- import semmle.code.java.dataflow.TaintTracking2
18
- import DataFlow:: PathGraph
17
+ import CorsOriginFlow:: PathGraph
19
18
20
19
/**
21
20
* Holds if `header` sets `Access-Control-Allow-Credentials` to `true`. This ensures fair chances of exploitability.
@@ -48,24 +47,25 @@ private Expr getAccessControlAllowOriginHeaderName() {
48
47
}
49
48
50
49
/**
51
- * This taintflow2 configuration checks if there is a flow from source node towards CorsProbableCheckAccess methods.
50
+ * A taint-tracking configuration for flow from a source node to CorsProbableCheckAccess methods.
52
51
*/
53
- class CorsSourceReachesCheckConfig extends TaintTracking2 :: Configuration {
54
- CorsSourceReachesCheckConfig ( ) { this = "CorsOriginConfig" }
52
+ module CorsSourceReachesCheckConfig implements DataFlow :: ConfigSig {
53
+ predicate isSource ( DataFlow :: Node source ) { CorsOriginFlow :: flow ( source , _ ) }
55
54
56
- override predicate isSource ( DataFlow:: Node source ) { any ( CorsOriginConfig c ) .hasFlow ( source , _) }
57
-
58
- override predicate isSink ( DataFlow:: Node sink ) {
55
+ predicate isSink ( DataFlow:: Node sink ) {
59
56
sink .asExpr ( ) = any ( CorsProbableCheckAccess check ) .getAnArgument ( )
60
57
}
61
58
}
62
59
63
- private class CorsOriginConfig extends TaintTracking:: Configuration {
64
- CorsOriginConfig ( ) { this = "CorsOriginConfig" }
60
+ /**
61
+ * Taint-tracking flow from a source node to CorsProbableCheckAccess methods.
62
+ */
63
+ module CorsSourceReachesCheckFlow = TaintTracking:: Global< CorsSourceReachesCheckConfig > ;
65
64
66
- override predicate isSource ( DataFlow:: Node source ) { source instanceof RemoteFlowSource }
65
+ private module CorsOriginConfig implements DataFlow:: ConfigSig {
66
+ predicate isSource ( DataFlow:: Node source ) { source instanceof RemoteFlowSource }
67
67
68
- override predicate isSink ( DataFlow:: Node sink ) {
68
+ predicate isSink ( DataFlow:: Node sink ) {
69
69
exists ( MethodAccess corsHeader , MethodAccess allowCredentialsHeader |
70
70
(
71
71
corsHeader .getMethod ( ) instanceof ResponseSetHeaderMethod or
@@ -79,9 +79,11 @@ private class CorsOriginConfig extends TaintTracking::Configuration {
79
79
}
80
80
}
81
81
82
- from
83
- DataFlow:: PathNode source , DataFlow:: PathNode sink , CorsOriginConfig conf ,
84
- CorsSourceReachesCheckConfig sanconf
85
- where conf .hasFlowPath ( source , sink ) and not sanconf .hasFlow ( source .getNode ( ) , _)
82
+ private module CorsOriginFlow = TaintTracking:: Global< CorsOriginConfig > ;
83
+
84
+ from CorsOriginFlow:: PathNode source , CorsOriginFlow:: PathNode sink
85
+ where
86
+ CorsOriginFlow:: flowPath ( source , sink ) and
87
+ not CorsSourceReachesCheckFlow:: flow ( source .getNode ( ) , _)
86
88
select sink .getNode ( ) , source , sink , "CORS header is being set using user controlled value $@." ,
87
89
source .getNode ( ) , "user-provided value"
0 commit comments