@@ -7,37 +7,49 @@ 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
+
10
30
/**
11
31
* Taint-tracking configuration tracing flow from untrusted inputs to an argument of a function whose result is used as an if-statement condition.
12
32
*
13
33
* 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)`.
34
+ * the flow from `checkToken`'s result to the condition of `if(isGood)` matches the configuration `VerificationMethodToIfFlowConfig` above,
35
+ * and so the flow from `getHeader(...)` to the argument to `checkToken` matches this configuration.
15
36
*/
16
37
class VerificationMethodFlowConfig extends TaintTracking2:: Configuration {
17
38
VerificationMethodFlowConfig ( ) { this = "VerificationMethodFlowConfig" }
18
39
19
40
override predicate isSource ( DataFlow:: Node src ) { src instanceof RemoteFlowSource }
20
41
21
42
override predicate isSink ( DataFlow:: Node sink ) {
22
- exists ( IfStmt is , Method m | is .getEnclosingCallable ( ) = m |
23
- (
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 |
43
+ exists ( MethodAccess ma , int i , VerificationMethodToIfFlowConfig vmtifc |
44
+ ma instanceof BarrierGuard
45
+ |
34
46
(
35
- ma .getMethod ( ) .getAParameter ( ) .getName ( ) .regexpMatch ( "(?i).*(token|auth|referer|origin).*" )
47
+ ma .getMethod ( ) .getParameter ( i ) .getName ( ) .regexpMatch ( "(?i).*(token|auth|referer|origin).*" )
36
48
or
37
49
ma .getMethod ( ) .getName ( ) .regexpMatch ( "(?i).*(token|auth|referer|origin).*" )
38
50
) and
39
- ma .getAnArgument ( ) = prod .asExpr ( ) and
40
- ma = succ . asExpr ( )
51
+ ma .getArgument ( i ) = sink .asExpr ( ) and
52
+ vmtifc . hasFlow ( exprNode ( ma ) , _ )
41
53
)
42
54
}
43
55
}
0 commit comments