@@ -14,8 +14,7 @@ import java
1414import semmle.code.java.dataflow.FlowSources
1515import semmle.code.java.frameworks.Servlets
1616import semmle.code.java.dataflow.TaintTracking
17- import semmle.code.java.dataflow.TaintTracking2
18- import DataFlow:: PathGraph
17+ import CorsOriginFlow:: PathGraph
1918
2019/**
2120 * Holds if `header` sets `Access-Control-Allow-Credentials` to `true`. This ensures fair chances of exploitability.
@@ -48,24 +47,25 @@ private Expr getAccessControlAllowOriginHeaderName() {
4847}
4948
5049/**
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.
5251 */
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 , _ ) }
5554
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 ) {
5956 sink .asExpr ( ) = any ( CorsProbableCheckAccess check ) .getAnArgument ( )
6057 }
6158}
6259
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 > ;
6564
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 }
6767
68- override predicate isSink ( DataFlow:: Node sink ) {
68+ predicate isSink ( DataFlow:: Node sink ) {
6969 exists ( MethodAccess corsHeader , MethodAccess allowCredentialsHeader |
7070 (
7171 corsHeader .getMethod ( ) instanceof ResponseSetHeaderMethod or
@@ -79,9 +79,11 @@ private class CorsOriginConfig extends TaintTracking::Configuration {
7979 }
8080}
8181
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 ( ) , _)
8688select sink .getNode ( ) , source , sink , "CORS header is being set using user controlled value $@." ,
8789 source .getNode ( ) , "user-provided value"
0 commit comments