Skip to content

Commit 569fad6

Browse files
authored
Merge pull request #10360 from atorralba/atorralba/fix-taint-implicit-reads
Dataflow: Fix implicit reads in taint tracking when FlowStates are used
2 parents 15db520 + 1078cf0 commit 569fad6

File tree

27 files changed

+163
-29
lines changed

27 files changed

+163
-29
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
category: fix
3+
---
4+
* Fixed an issue in the taint tracking analysis where implicit reads were not allowed by default in sinks or additional taint steps that used flow states.

cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTrackingImpl.qll

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
172172
}
173173

174174
override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
175-
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
175+
(
176+
this.isSink(node) or
177+
this.isSink(node, _) or
178+
this.isAdditionalTaintStep(node, _) or
179+
this.isAdditionalTaintStep(node, _, _, _)
180+
) and
176181
defaultImplicitTaintRead(node, c)
177182
}
178183

cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking2/TaintTrackingImpl.qll

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
172172
}
173173

174174
override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
175-
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
175+
(
176+
this.isSink(node) or
177+
this.isSink(node, _) or
178+
this.isAdditionalTaintStep(node, _) or
179+
this.isAdditionalTaintStep(node, _, _, _)
180+
) and
176181
defaultImplicitTaintRead(node, c)
177182
}
178183

cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking1/TaintTrackingImpl.qll

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
172172
}
173173

174174
override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
175-
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
175+
(
176+
this.isSink(node) or
177+
this.isSink(node, _) or
178+
this.isAdditionalTaintStep(node, _) or
179+
this.isAdditionalTaintStep(node, _, _, _)
180+
) and
176181
defaultImplicitTaintRead(node, c)
177182
}
178183

cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking2/TaintTrackingImpl.qll

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
172172
}
173173

174174
override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
175-
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
175+
(
176+
this.isSink(node) or
177+
this.isSink(node, _) or
178+
this.isAdditionalTaintStep(node, _) or
179+
this.isAdditionalTaintStep(node, _, _, _)
180+
) and
176181
defaultImplicitTaintRead(node, c)
177182
}
178183

cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking3/TaintTrackingImpl.qll

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
172172
}
173173

174174
override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
175-
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
175+
(
176+
this.isSink(node) or
177+
this.isSink(node, _) or
178+
this.isAdditionalTaintStep(node, _) or
179+
this.isAdditionalTaintStep(node, _, _, _)
180+
) and
176181
defaultImplicitTaintRead(node, c)
177182
}
178183

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
category: fix
3+
---
4+
* Fixed an issue in the taint tracking analysis where implicit reads were not allowed by default in sinks or additional taint steps that used flow states.

csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking1/TaintTrackingImpl.qll

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
172172
}
173173

174174
override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
175-
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
175+
(
176+
this.isSink(node) or
177+
this.isSink(node, _) or
178+
this.isAdditionalTaintStep(node, _) or
179+
this.isAdditionalTaintStep(node, _, _, _)
180+
) and
176181
defaultImplicitTaintRead(node, c)
177182
}
178183

csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking2/TaintTrackingImpl.qll

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
172172
}
173173

174174
override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
175-
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
175+
(
176+
this.isSink(node) or
177+
this.isSink(node, _) or
178+
this.isAdditionalTaintStep(node, _) or
179+
this.isAdditionalTaintStep(node, _, _, _)
180+
) and
176181
defaultImplicitTaintRead(node, c)
177182
}
178183

csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking3/TaintTrackingImpl.qll

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
172172
}
173173

174174
override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
175-
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
175+
(
176+
this.isSink(node) or
177+
this.isSink(node, _) or
178+
this.isAdditionalTaintStep(node, _) or
179+
this.isAdditionalTaintStep(node, _, _, _)
180+
) and
176181
defaultImplicitTaintRead(node, c)
177182
}
178183

csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking4/TaintTrackingImpl.qll

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
172172
}
173173

174174
override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
175-
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
175+
(
176+
this.isSink(node) or
177+
this.isSink(node, _) or
178+
this.isAdditionalTaintStep(node, _) or
179+
this.isAdditionalTaintStep(node, _, _, _)
180+
) and
176181
defaultImplicitTaintRead(node, c)
177182
}
178183

csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking5/TaintTrackingImpl.qll

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
172172
}
173173

174174
override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
175-
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
175+
(
176+
this.isSink(node) or
177+
this.isSink(node, _) or
178+
this.isAdditionalTaintStep(node, _) or
179+
this.isAdditionalTaintStep(node, _, _, _)
180+
) and
176181
defaultImplicitTaintRead(node, c)
177182
}
178183

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
category: fix
3+
---
4+
* Fixed an issue in the taint tracking analysis where implicit reads were not allowed by default in sinks or additional taint steps that used flow states.

java/ql/lib/semmle/code/java/dataflow/internal/tainttracking1/TaintTrackingImpl.qll

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
172172
}
173173

174174
override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
175-
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
175+
(
176+
this.isSink(node) or
177+
this.isSink(node, _) or
178+
this.isAdditionalTaintStep(node, _) or
179+
this.isAdditionalTaintStep(node, _, _, _)
180+
) and
176181
defaultImplicitTaintRead(node, c)
177182
}
178183

java/ql/lib/semmle/code/java/dataflow/internal/tainttracking2/TaintTrackingImpl.qll

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
172172
}
173173

174174
override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
175-
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
175+
(
176+
this.isSink(node) or
177+
this.isSink(node, _) or
178+
this.isAdditionalTaintStep(node, _) or
179+
this.isAdditionalTaintStep(node, _, _, _)
180+
) and
176181
defaultImplicitTaintRead(node, c)
177182
}
178183

java/ql/lib/semmle/code/java/dataflow/internal/tainttracking3/TaintTrackingImpl.qll

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
172172
}
173173

174174
override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
175-
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
175+
(
176+
this.isSink(node) or
177+
this.isSink(node, _) or
178+
this.isAdditionalTaintStep(node, _) or
179+
this.isAdditionalTaintStep(node, _, _, _)
180+
) and
176181
defaultImplicitTaintRead(node, c)
177182
}
178183

java/ql/test/library-tests/dataflow/state/A.java

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,20 @@
1+
import java.util.Map;
12
import java.util.function.*;
23

34
public class A {
4-
Object source(String state) { return null; }
5+
Object source(String state) {
6+
return null;
7+
}
58

6-
void sink(Object x, String state) { }
9+
void sink(Object x, String state) {}
710

8-
void stateBarrier(Object x, String state) { }
11+
void stateBarrier(Object x, String state) {}
912

10-
Object step(Object x, String s1, String s2) { return null; }
13+
Object step(Object x, String s1, String s2) {
14+
return null;
15+
}
1116

12-
void check(Object x) { }
17+
void check(Object x) {}
1318

1419
void test1() {
1520
Object x = source("A");
@@ -31,4 +36,13 @@ void test2(Supplier<Boolean> b) {
3136
sink(x, "B"); // $ flow=B
3237
sink(x, "C"); // $ flow=B
3338
}
39+
40+
void test3(Map m) {
41+
// Test implicit reads
42+
Object x = source("A");
43+
m.put("k", x);
44+
sink(m, "A"); // $ flow=A
45+
Object y = step(m, "A", "B");
46+
sink(y, "B"); // $ flow=A
47+
}
3448
}

java/ql/test/library-tests/dataflow/state/test.ql

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import java
2-
import semmle.code.java.dataflow.DataFlow
2+
import semmle.code.java.dataflow.TaintTracking
33
import TestUtilities.InlineExpectationsTest
44
import DataFlow
55

@@ -39,16 +39,16 @@ predicate step(Node n1, Node n2, string s1, string s2) {
3939

4040
predicate checkNode(Node n) { n.asExpr().(Argument).getCall().getCallee().hasName("check") }
4141

42-
class Conf extends Configuration {
42+
class Conf extends TaintTracking::Configuration {
4343
Conf() { this = "qltest:state" }
4444

4545
override predicate isSource(Node n, FlowState s) { src(n, s) }
4646

4747
override predicate isSink(Node n, FlowState s) { sink(n, s) }
4848

49-
override predicate isBarrier(Node n, FlowState s) { bar(n, s) }
49+
override predicate isSanitizer(Node n, FlowState s) { bar(n, s) }
5050

51-
override predicate isAdditionalFlowStep(Node n1, FlowState s1, Node n2, FlowState s2) {
51+
override predicate isAdditionalTaintStep(Node n1, FlowState s1, Node n2, FlowState s2) {
5252
step(n1, n2, s1, s2)
5353
}
5454

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
category: fix
3+
---
4+
* Fixed an issue in the taint tracking analysis where implicit reads were not allowed by default in sinks or additional taint steps that used flow states.

python/ql/lib/semmle/python/dataflow/new/internal/tainttracking1/TaintTrackingImpl.qll

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
172172
}
173173

174174
override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
175-
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
175+
(
176+
this.isSink(node) or
177+
this.isSink(node, _) or
178+
this.isAdditionalTaintStep(node, _) or
179+
this.isAdditionalTaintStep(node, _, _, _)
180+
) and
176181
defaultImplicitTaintRead(node, c)
177182
}
178183

python/ql/lib/semmle/python/dataflow/new/internal/tainttracking2/TaintTrackingImpl.qll

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
172172
}
173173

174174
override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
175-
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
175+
(
176+
this.isSink(node) or
177+
this.isSink(node, _) or
178+
this.isAdditionalTaintStep(node, _) or
179+
this.isAdditionalTaintStep(node, _, _, _)
180+
) and
176181
defaultImplicitTaintRead(node, c)
177182
}
178183

python/ql/lib/semmle/python/dataflow/new/internal/tainttracking3/TaintTrackingImpl.qll

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
172172
}
173173

174174
override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
175-
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
175+
(
176+
this.isSink(node) or
177+
this.isSink(node, _) or
178+
this.isAdditionalTaintStep(node, _) or
179+
this.isAdditionalTaintStep(node, _, _, _)
180+
) and
176181
defaultImplicitTaintRead(node, c)
177182
}
178183

python/ql/lib/semmle/python/dataflow/new/internal/tainttracking4/TaintTrackingImpl.qll

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
172172
}
173173

174174
override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
175-
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
175+
(
176+
this.isSink(node) or
177+
this.isSink(node, _) or
178+
this.isAdditionalTaintStep(node, _) or
179+
this.isAdditionalTaintStep(node, _, _, _)
180+
) and
176181
defaultImplicitTaintRead(node, c)
177182
}
178183

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
category: fix
3+
---
4+
* Fixed an issue in the taint tracking analysis where implicit reads were not allowed by default in sinks or additional taint steps that used flow states.

ruby/ql/lib/codeql/ruby/dataflow/internal/tainttracking1/TaintTrackingImpl.qll

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
172172
}
173173

174174
override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
175-
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
175+
(
176+
this.isSink(node) or
177+
this.isSink(node, _) or
178+
this.isAdditionalTaintStep(node, _) or
179+
this.isAdditionalTaintStep(node, _, _, _)
180+
) and
176181
defaultImplicitTaintRead(node, c)
177182
}
178183

ruby/ql/lib/codeql/ruby/dataflow/internal/tainttrackingforlibraries/TaintTrackingImpl.qll

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
172172
}
173173

174174
override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
175-
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
175+
(
176+
this.isSink(node) or
177+
this.isSink(node, _) or
178+
this.isAdditionalTaintStep(node, _) or
179+
this.isAdditionalTaintStep(node, _, _, _)
180+
) and
176181
defaultImplicitTaintRead(node, c)
177182
}
178183

swift/ql/lib/codeql/swift/dataflow/internal/tainttracking1/TaintTrackingImpl.qll

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
172172
}
173173

174174
override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
175-
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
175+
(
176+
this.isSink(node) or
177+
this.isSink(node, _) or
178+
this.isAdditionalTaintStep(node, _) or
179+
this.isAdditionalTaintStep(node, _, _, _)
180+
) and
176181
defaultImplicitTaintRead(node, c)
177182
}
178183

0 commit comments

Comments
 (0)