Skip to content

Commit 42b582d

Browse files
committed
Refactor StaticInitializationVector
1 parent 469ac80 commit 42b582d

File tree

3 files changed

+30
-14
lines changed

3 files changed

+30
-14
lines changed

java/ql/lib/semmle/code/java/security/StaticInitializationVectorQuery.qll

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -83,25 +83,23 @@ private class ArrayUpdate extends Expr {
8383
/**
8484
* A config that tracks dataflow from creating an array to an operation that updates it.
8585
*/
86-
private class ArrayUpdateConfig extends DataFlow2::Configuration {
87-
ArrayUpdateConfig() { this = "ArrayUpdateConfig" }
86+
private module ArrayUpdateConfig implements DataFlow::ConfigSig {
87+
predicate isSource(DataFlow::Node source) { source.asExpr() instanceof StaticByteArrayCreation }
8888

89-
override predicate isSource(DataFlow::Node source) {
90-
source.asExpr() instanceof StaticByteArrayCreation
91-
}
89+
predicate isSink(DataFlow::Node sink) { sink.asExpr() = any(ArrayUpdate upd).getArray() }
9290

93-
override predicate isSink(DataFlow::Node sink) { sink.asExpr() = any(ArrayUpdate upd).getArray() }
94-
95-
override predicate isBarrierOut(DataFlow::Node node) { this.isSink(node) }
91+
predicate isBarrierOut(DataFlow::Node node) { isSink(node) }
9692
}
9793

94+
private module ArrayUpdateFlow = DataFlow::Global<ArrayUpdateConfig>;
95+
9896
/**
9997
* A source that defines an array that doesn't get updated.
10098
*/
10199
private class StaticInitializationVectorSource extends DataFlow::Node {
102100
StaticInitializationVectorSource() {
103101
exists(StaticByteArrayCreation array | array = this.asExpr() |
104-
not exists(ArrayUpdateConfig config | config.hasFlow(DataFlow2::exprNode(array), _)) and
102+
not ArrayUpdateFlow::flow(DataFlow2::exprNode(array), _) and
105103
// Reduce FPs from utility methods that return an empty array in an exceptional case
106104
not exists(ReturnStmt ret |
107105
array.getADimension().(CompileTimeConstantExpr).getIntValue() = 0 and
@@ -146,9 +144,11 @@ private predicate createInitializationVectorSpecStep(DataFlow::Node fromNode, Da
146144
}
147145

148146
/**
147+
* DEPRECATED: Use `StaticInitializationVectorFlow` instead.
148+
*
149149
* A config that tracks dataflow to initializing a cipher with a static initialization vector.
150150
*/
151-
class StaticInitializationVectorConfig extends TaintTracking::Configuration {
151+
deprecated class StaticInitializationVectorConfig extends TaintTracking::Configuration {
152152
StaticInitializationVectorConfig() { this = "StaticInitializationVectorConfig" }
153153

154154
override predicate isSource(DataFlow::Node source) {
@@ -161,3 +161,19 @@ class StaticInitializationVectorConfig extends TaintTracking::Configuration {
161161
createInitializationVectorSpecStep(fromNode, toNode)
162162
}
163163
}
164+
165+
/**
166+
* A config that tracks dataflow to initializing a cipher with a static initialization vector.
167+
*/
168+
private module StaticInitializationVectorConfig implements DataFlow::ConfigSig {
169+
predicate isSource(DataFlow::Node source) { source instanceof StaticInitializationVectorSource }
170+
171+
predicate isSink(DataFlow::Node sink) { sink instanceof EncryptionInitializationSink }
172+
173+
predicate isAdditionalFlowStep(DataFlow::Node fromNode, DataFlow::Node toNode) {
174+
createInitializationVectorSpecStep(fromNode, toNode)
175+
}
176+
}
177+
178+
/** Tracks the flow from a static initialization vector to the initialization of a cipher */
179+
module StaticInitializationVectorFlow = TaintTracking::Global<StaticInitializationVectorConfig>;

java/ql/src/Security/CWE/CWE-1204/StaticInitializationVector.ql

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313

1414
import java
1515
import semmle.code.java.security.StaticInitializationVectorQuery
16-
import DataFlow::PathGraph
16+
import StaticInitializationVectorFlow::PathGraph
1717

18-
from DataFlow::PathNode source, DataFlow::PathNode sink, StaticInitializationVectorConfig conf
19-
where conf.hasFlowPath(source, sink)
18+
from StaticInitializationVectorFlow::PathNode source, StaticInitializationVectorFlow::PathNode sink
19+
where StaticInitializationVectorFlow::flowPath(source, sink)
2020
select sink.getNode(), source, sink, "A $@ should not be used for encryption.", source.getNode(),
2121
"static initialization vector"

java/ql/test/query-tests/security/CWE-1204/StaticInitializationVectorTest.ql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ class StaticInitializationVectorTest extends InlineExpectationsTest {
99

1010
override predicate hasActualResult(Location location, string element, string tag, string value) {
1111
tag = "staticInitializationVector" and
12-
exists(DataFlow::Node sink, StaticInitializationVectorConfig conf | conf.hasFlowTo(sink) |
12+
exists(DataFlow::Node sink | StaticInitializationVectorFlow::flowTo(sink) |
1313
sink.getLocation() = location and
1414
element = sink.toString() and
1515
value = ""

0 commit comments

Comments
 (0)