|
14 | 14 | import java |
15 | 15 | import semmle.code.java.dataflow.FlowSources |
16 | 16 | import semmle.code.java.dataflow.TaintTracking |
17 | | -import DataFlow::PathGraph |
| 17 | +import NonConstantTimeComparisonFlow::PathGraph |
18 | 18 |
|
19 | 19 | /** A static method that uses a non-constant-time algorithm for comparing inputs. */ |
20 | 20 | private class NonConstantTimeComparisonCall extends StaticMethodAccess { |
@@ -54,20 +54,18 @@ class ClientSuppliedIpTokenCheck extends DataFlow::Node { |
54 | 54 | } |
55 | 55 | } |
56 | 56 |
|
57 | | -class NonConstantTimeComparisonConfig extends TaintTracking::Configuration { |
58 | | - NonConstantTimeComparisonConfig() { this = "NonConstantTimeComparisonConfig" } |
| 57 | +module NonConstantTimeComparisonConfig implements DataFlow::ConfigSig { |
| 58 | + predicate isSource(DataFlow::Node source) { source instanceof ClientSuppliedIpTokenCheck } |
59 | 59 |
|
60 | | - override predicate isSource(DataFlow::Node source) { |
61 | | - source instanceof ClientSuppliedIpTokenCheck |
62 | | - } |
63 | | - |
64 | | - override predicate isSink(DataFlow::Node sink) { |
| 60 | + predicate isSink(DataFlow::Node sink) { |
65 | 61 | isNonConstantEqualsCallArgument(sink.asExpr()) or |
66 | 62 | isNonConstantComparisonCallArgument(sink.asExpr()) |
67 | 63 | } |
68 | 64 | } |
69 | 65 |
|
70 | | -from DataFlow::PathNode source, DataFlow::PathNode sink, NonConstantTimeComparisonConfig conf |
71 | | -where conf.hasFlowPath(source, sink) |
| 66 | +module NonConstantTimeComparisonFlow = TaintTracking::Global<NonConstantTimeComparisonConfig>; |
| 67 | + |
| 68 | +from NonConstantTimeComparisonFlow::PathNode source, NonConstantTimeComparisonFlow::PathNode sink |
| 69 | +where NonConstantTimeComparisonFlow::flowPath(source, sink) |
72 | 70 | select sink.getNode(), source, sink, "Possible timing attack against $@ validation.", |
73 | 71 | source.getNode(), "client-supplied token" |
0 commit comments