|
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