@@ -7,48 +7,37 @@ import semmle.code.java.dataflow.DataFlow3
7
7
import semmle.code.java.dataflow.FlowSources
8
8
import semmle.code.java.frameworks.spring.SpringController
9
9
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)`.
35
15
*/
36
16
class VerificationMethodFlowConfig extends TaintTracking2:: Configuration {
37
17
VerificationMethodFlowConfig ( ) { this = "VerificationMethodFlowConfig" }
38
18
39
19
override predicate isSource ( DataFlow:: Node src ) { src instanceof RemoteFlowSource }
40
20
41
21
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 |
45
23
(
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).*" )
47
36
or
48
37
ma .getMethod ( ) .getName ( ) .regexpMatch ( "(?i).*(token|auth|referer|origin).*" )
49
38
) and
50
- ma .getArgument ( i ) = sink .asExpr ( ) and
51
- vmtifc . hasFlow ( exprNode ( ma ) , _ )
39
+ ma .getAnArgument ( ) = prod .asExpr ( ) and
40
+ ma = succ . asExpr ( )
52
41
)
53
42
}
54
43
}
0 commit comments