@@ -16,10 +16,17 @@ import semmle.code.java.dataflow.FlowSources
1616import semmle.code.java.dataflow.TaintTracking
1717import DataFlow:: PathGraph
1818
19+ private class NonConstantTimeComparisonCall extends StaticMethodAccess {
20+ NonConstantTimeComparisonCall ( ) {
21+ this .getMethod ( )
22+ .hasQualifiedName ( "org.apache.commons.lang3" , "StringUtils" ,
23+ [ "equals" , "equalsAny" , "equalsAnyIgnoreCase" , "equalsIgnoreCase" ] )
24+ }
25+ }
26+
1927private class NonConstantTimeEqualsCall extends MethodAccess {
2028 NonConstantTimeEqualsCall ( ) {
21- this .getMethod ( ) .hasQualifiedName ( "java.lang" , "String" , [ "equals" , "contentEquals" , "equalsIgnoreCase" ] ) or
22- this .getMethod ( ) .hasQualifiedName ( "java.nio" , "ByteBuffer" , [ "equals" , "compareTo" ] )
29+ this .getMethod ( ) .hasQualifiedName ( "java.lang" , "String" , [ "equals" , "contentEquals" , "equalsIgnoreCase" ] )
2330 }
2431}
2532
@@ -29,6 +36,12 @@ private predicate isNonConstantEqualsCallArgument(Expr e) {
2936 )
3037}
3138
39+ private predicate isNonConstantComparisonCallArgument ( Expr p ) {
40+ exists ( NonConstantTimeComparisonCall call |
41+ p = [ call .getArgument ( 0 ) , call .getArgument ( 1 ) ]
42+ )
43+ }
44+
3245class ClientSuppliedIpTokenCheck extends DataFlow:: Node {
3346 ClientSuppliedIpTokenCheck ( ) {
3447 exists ( MethodAccess ma |
@@ -47,7 +60,10 @@ class NonConstantTimeComparisonConfig extends TaintTracking::Configuration {
4760
4861 override predicate isSource ( DataFlow:: Node source ) { source instanceof ClientSuppliedIpTokenCheck }
4962
50- override predicate isSink ( DataFlow:: Node sink ) { isNonConstantEqualsCallArgument ( sink .asExpr ( ) ) }
63+ override predicate isSink ( DataFlow:: Node sink ) {
64+ isNonConstantEqualsCallArgument ( sink .asExpr ( ) ) or
65+ isNonConstantComparisonCallArgument ( sink .asExpr ( ) )
66+ }
5167}
5268
5369from DataFlow:: PathNode source , DataFlow:: PathNode sink , NonConstantTimeComparisonConfig conf
0 commit comments