Skip to content

Commit 9d6bc76

Browse files
authored
Merge pull request github#13817 from atorralba/atorralba/java/non-static-fieldvaluenode-step
Java: Allow flow out of FieldValueNodes for non-static fields
2 parents f40bcd0 + 8685242 commit 9d6bc76

File tree

6 files changed

+45
-5
lines changed

6 files changed

+45
-5
lines changed

java/ql/lib/semmle/code/java/dataflow/internal/DataFlowPrivate.qll

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,17 +33,17 @@ OutNode getAnOutNode(DataFlowCall call, ReturnKind kind) {
3333
}
3434

3535
/**
36-
* Holds if data can flow from `node1` to `node2` through a static field.
36+
* Holds if data can flow from `node1` to `node2` through a field.
3737
*/
38-
private predicate staticFieldStep(Node node1, Node node2) {
38+
private predicate fieldStep(Node node1, Node node2) {
3939
exists(Field f |
40+
// Taint fields through assigned values only if they're static
4041
f.isStatic() and
4142
f.getAnAssignedValue() = node1.asExpr() and
4243
node2.(FieldValueNode).getField() = f
4344
)
4445
or
4546
exists(Field f, FieldRead fr |
46-
f.isStatic() and
4747
node1.(FieldValueNode).getField() = f and
4848
fr.getField() = f and
4949
fr = node2.asExpr() and
@@ -72,11 +72,11 @@ private predicate variableCaptureStep(Node node1, ExprNode node2) {
7272
}
7373

7474
/**
75-
* Holds if data can flow from `node1` to `node2` through a static field or
75+
* Holds if data can flow from `node1` to `node2` through a field or
7676
* variable capture.
7777
*/
7878
predicate jumpStep(Node node1, Node node2) {
79-
staticFieldStep(node1, node2)
79+
fieldStep(node1, node2)
8080
or
8181
variableCaptureStep(node1, node2)
8282
or
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import java.io.FilterInputStream;
2+
import java.io.InputStream;
3+
4+
public class A {
5+
6+
public String src;
7+
8+
private static void sink(Object o) {}
9+
10+
public void test() {
11+
sink(src); // $ hasTaintFlow
12+
}
13+
14+
class TestFis extends FilterInputStream {
15+
16+
protected TestFis(InputStream in) {
17+
super(in);
18+
}
19+
20+
public void testOutOfSource() {
21+
// out of source field
22+
sink(this.in); // $ hasTaintFlow
23+
}
24+
}
25+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
failures
2+
testFailures
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import java
2+
import TestUtilities.InlineFlowTest
3+
4+
module FieldValueConfig implements DataFlow::ConfigSig {
5+
predicate isSource(DataFlow::Node source) { source instanceof DataFlow::FieldValueNode }
6+
7+
predicate isSink(DataFlow::Node sink) { DefaultFlowConfig::isSink(sink) }
8+
}
9+
10+
import TaintFlowTest<FieldValueConfig>

java/ql/test/library-tests/dataflow/partial/test.expected

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
edges
22
| A.java:4:16:4:18 | this <constr(this)> [post update] [elem] | A.java:22:17:22:25 | new Box(...) [elem] |
3+
| A.java:5:19:5:22 | elem | A.java:24:10:24:19 | other.elem |
34
| A.java:12:5:12:5 | b [post update] : Box [elem] | A.java:13:12:13:12 | b : Box [elem] |
45
| A.java:12:14:12:18 | src(...) : Object | A.java:12:5:12:5 | b [post update] : Box [elem] |
56
| A.java:12:14:12:18 | src(...) : Object | A.java:12:5:12:18 | ...=... : Object |

java/ql/test/library-tests/dataflow/partial/testRev.expected

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
edges
22
| A.java:4:16:4:18 | this <constr(this)> [post update] [elem] | A.java:22:17:22:25 | new Box(...) [elem] |
3+
| A.java:5:19:5:22 | elem | A.java:24:10:24:19 | other.elem |
34
| A.java:12:5:12:5 | b [post update] : Box [elem] | A.java:13:12:13:12 | b : Box [elem] |
45
| A.java:12:14:12:18 | src(...) : Object | A.java:12:5:12:5 | b [post update] : Box [elem] |
56
| A.java:12:14:12:18 | src(...) : Object | A.java:12:5:12:18 | ...=... : Object |
@@ -18,5 +19,6 @@ edges
1819
| 0 | A.java:23:13:23:17 | other [post update] [elem] |
1920
| 0 | A.java:24:10:24:14 | other [elem] |
2021
| 1 | A.java:4:16:4:18 | this <constr(this)> [post update] [elem] |
22+
| 1 | A.java:5:19:5:22 | elem |
2123
| 1 | A.java:28:5:28:5 | b [post update] [elem] |
2224
| 1 | A.java:28:14:28:25 | new Object(...) |

0 commit comments

Comments
 (0)