@@ -7,48 +7,37 @@ import semmle.code.java.dataflow.DataFlow3
77import semmle.code.java.dataflow.FlowSources
88import semmle.code.java.frameworks.spring.SpringController
99
10- /** A data flow configuration tracing flow from the result of a method whose name includes token/auth/referer/origin to an if-statement condition. */
11- class VerificationMethodToIfFlowConfig extends DataFlow3:: Configuration {
12- VerificationMethodToIfFlowConfig ( ) { this = "VerificationMethodToIfFlowConfig" }
13-
14- override predicate isSource ( DataFlow:: Node src ) {
15- exists ( MethodAccess ma | ma instanceof BarrierGuard |
16- (
17- ma .getMethod ( ) .getAParameter ( ) .getName ( ) .regexpMatch ( "(?i).*(token|auth|referer|origin).*" )
18- or
19- ma .getMethod ( ) .getName ( ) .regexpMatch ( "(?i).*(token|auth|referer|origin).*" )
20- ) and
21- ma = src .asExpr ( )
22- )
23- }
24-
25- override predicate isSink ( DataFlow:: Node sink ) {
26- exists ( IfStmt is | is .getCondition ( ) = sink .asExpr ( ) )
27- }
28- }
29-
30- /** Taint-tracking configuration tracing flow from untrusted inputs to an argument of a function whose result is used as an if-statement condition.
31- *
32- * For example, in the context `String userControlled = request.getHeader("xyz"); boolean isGood = checkToken(userControlled); if(isGood) { ...`,
33- * the flow from `checkToken`'s result to the condition of `if(isGood)` matches the configuration `VerificationMethodToIfFlowConfig` above,
34- * and so the flow from `getHeader(...)` to the argument to `checkToken` matches this configuration.
10+ /**
11+ * Taint-tracking configuration tracing flow from untrusted inputs to an argument of a function whose result is used as an if-statement condition.
12+ *
13+ * For example, in the context `String userControlled = request.getHeader("xyz"); boolean isGood = checkToken(userControlled); if(isGood) { ...`,
14+ * the flow from `getHeader(...)` to the argument to `checkToken`, and then the flow from `checkToken`'s result to the condition of `if(isGood)`.
3515 */
3616class VerificationMethodFlowConfig extends TaintTracking2:: Configuration {
3717 VerificationMethodFlowConfig ( ) { this = "VerificationMethodFlowConfig" }
3818
3919 override predicate isSource ( DataFlow:: Node src ) { src instanceof RemoteFlowSource }
4020
4121 override predicate isSink ( DataFlow:: Node sink ) {
42- exists ( MethodAccess ma , int i , VerificationMethodToIfFlowConfig vmtifc |
43- ma instanceof BarrierGuard
44- |
22+ exists ( IfStmt is , Method m | is .getEnclosingCallable ( ) = m |
4523 (
46- ma .getMethod ( ) .getParameter ( i ) .getName ( ) .regexpMatch ( "(?i).*(token|auth|referer|origin).*" )
24+ not m .getAParameter ( ) .getName ( ) .regexpMatch ( "(?i).*(token|auth|referer|origin).*" )
25+ or
26+ not m .getName ( ) .regexpMatch ( "(?i).*(token|auth|referer|origin).*" )
27+ ) and
28+ sink .asExpr ( ) = is .getCondition ( )
29+ )
30+ }
31+
32+ override predicate isAdditionalTaintStep ( DataFlow:: Node prod , DataFlow:: Node succ ) {
33+ exists ( MethodAccess ma |
34+ (
35+ ma .getMethod ( ) .getAParameter ( ) .getName ( ) .regexpMatch ( "(?i).*(token|auth|referer|origin).*" )
4736 or
4837 ma .getMethod ( ) .getName ( ) .regexpMatch ( "(?i).*(token|auth|referer|origin).*" )
4938 ) and
50- ma .getArgument ( i ) = sink .asExpr ( ) and
51- vmtifc . hasFlow ( exprNode ( ma ) , _ )
39+ ma .getAnArgument ( ) = prod .asExpr ( ) and
40+ ma = succ . asExpr ( )
5241 )
5342 }
5443}
0 commit comments