Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
---
category: fix
---
* 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.
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
}

override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
(
this.isSink(node) or
this.isSink(node, _) or
this.isAdditionalTaintStep(node, _) or
this.isAdditionalTaintStep(node, _, _, _)
) and
defaultImplicitTaintRead(node, c)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
}

override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
(
this.isSink(node) or
this.isSink(node, _) or
this.isAdditionalTaintStep(node, _) or
this.isAdditionalTaintStep(node, _, _, _)
) and
defaultImplicitTaintRead(node, c)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
}

override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
(
this.isSink(node) or
this.isSink(node, _) or
this.isAdditionalTaintStep(node, _) or
this.isAdditionalTaintStep(node, _, _, _)
) and
defaultImplicitTaintRead(node, c)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
}

override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
(
this.isSink(node) or
this.isSink(node, _) or
this.isAdditionalTaintStep(node, _) or
this.isAdditionalTaintStep(node, _, _, _)
) and
defaultImplicitTaintRead(node, c)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
}

override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
(
this.isSink(node) or
this.isSink(node, _) or
this.isAdditionalTaintStep(node, _) or
this.isAdditionalTaintStep(node, _, _, _)
) and
defaultImplicitTaintRead(node, c)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
---
category: fix
---
* 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.
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
}

override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
(
this.isSink(node) or
this.isSink(node, _) or
this.isAdditionalTaintStep(node, _) or
this.isAdditionalTaintStep(node, _, _, _)
) and
defaultImplicitTaintRead(node, c)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
}

override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
(
this.isSink(node) or
this.isSink(node, _) or
this.isAdditionalTaintStep(node, _) or
this.isAdditionalTaintStep(node, _, _, _)
) and
defaultImplicitTaintRead(node, c)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
}

override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
(
this.isSink(node) or
this.isSink(node, _) or
this.isAdditionalTaintStep(node, _) or
this.isAdditionalTaintStep(node, _, _, _)
) and
defaultImplicitTaintRead(node, c)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
}

override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
(
this.isSink(node) or
this.isSink(node, _) or
this.isAdditionalTaintStep(node, _) or
this.isAdditionalTaintStep(node, _, _, _)
) and
defaultImplicitTaintRead(node, c)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
}

override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
(
this.isSink(node) or
this.isSink(node, _) or
this.isAdditionalTaintStep(node, _) or
this.isAdditionalTaintStep(node, _, _, _)
) and
defaultImplicitTaintRead(node, c)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
---
category: fix
---
* 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.
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
}

override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
(
this.isSink(node) or
this.isSink(node, _) or
this.isAdditionalTaintStep(node, _) or
this.isAdditionalTaintStep(node, _, _, _)
) and
defaultImplicitTaintRead(node, c)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
}

override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
(
this.isSink(node) or
this.isSink(node, _) or
this.isAdditionalTaintStep(node, _) or
this.isAdditionalTaintStep(node, _, _, _)
) and
defaultImplicitTaintRead(node, c)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
}

override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
(
this.isSink(node) or
this.isSink(node, _) or
this.isAdditionalTaintStep(node, _) or
this.isAdditionalTaintStep(node, _, _, _)
) and
defaultImplicitTaintRead(node, c)
}

Expand Down
24 changes: 19 additions & 5 deletions java/ql/test/library-tests/dataflow/state/A.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
import java.util.Map;
import java.util.function.*;

public class A {
Object source(String state) { return null; }
Object source(String state) {
return null;
}

void sink(Object x, String state) { }
void sink(Object x, String state) {}

void stateBarrier(Object x, String state) { }
void stateBarrier(Object x, String state) {}

Object step(Object x, String s1, String s2) { return null; }
Object step(Object x, String s1, String s2) {
return null;
}

void check(Object x) { }
void check(Object x) {}

void test1() {
Object x = source("A");
Expand All @@ -31,4 +36,13 @@ void test2(Supplier<Boolean> b) {
sink(x, "B"); // $ flow=B
sink(x, "C"); // $ flow=B
}

void test3(Map m) {
// Test implicit reads
Object x = source("A");
m.put("k", x);
sink(m, "A"); // $ flow=A
Object y = step(m, "A", "B");
sink(y, "B"); // $ flow=A
}
}
8 changes: 4 additions & 4 deletions java/ql/test/library-tests/dataflow/state/test.ql
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import java
import semmle.code.java.dataflow.DataFlow
import semmle.code.java.dataflow.TaintTracking
import TestUtilities.InlineExpectationsTest
import DataFlow

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

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

class Conf extends Configuration {
class Conf extends TaintTracking::Configuration {
Conf() { this = "qltest:state" }

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

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

override predicate isBarrier(Node n, FlowState s) { bar(n, s) }
override predicate isSanitizer(Node n, FlowState s) { bar(n, s) }

override predicate isAdditionalFlowStep(Node n1, FlowState s1, Node n2, FlowState s2) {
override predicate isAdditionalTaintStep(Node n1, FlowState s1, Node n2, FlowState s2) {
step(n1, n2, s1, s2)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
---
category: fix
---
* 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.
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
}

override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
(
this.isSink(node) or
this.isSink(node, _) or
this.isAdditionalTaintStep(node, _) or
this.isAdditionalTaintStep(node, _, _, _)
) and
defaultImplicitTaintRead(node, c)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
}

override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
(
this.isSink(node) or
this.isSink(node, _) or
this.isAdditionalTaintStep(node, _) or
this.isAdditionalTaintStep(node, _, _, _)
) and
defaultImplicitTaintRead(node, c)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
}

override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
(
this.isSink(node) or
this.isSink(node, _) or
this.isAdditionalTaintStep(node, _) or
this.isAdditionalTaintStep(node, _, _, _)
) and
defaultImplicitTaintRead(node, c)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
}

override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
(
this.isSink(node) or
this.isSink(node, _) or
this.isAdditionalTaintStep(node, _) or
this.isAdditionalTaintStep(node, _, _, _)
) and
defaultImplicitTaintRead(node, c)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
---
category: fix
---
* 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.
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
}

override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
(
this.isSink(node) or
this.isSink(node, _) or
this.isAdditionalTaintStep(node, _) or
this.isAdditionalTaintStep(node, _, _, _)
) and
defaultImplicitTaintRead(node, c)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
}

override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
(
this.isSink(node) or
this.isSink(node, _) or
this.isAdditionalTaintStep(node, _) or
this.isAdditionalTaintStep(node, _, _, _)
) and
defaultImplicitTaintRead(node, c)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,12 @@ abstract class Configuration extends DataFlow::Configuration {
}

override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
(this.isSink(node) or this.isAdditionalTaintStep(node, _)) and
(
this.isSink(node) or
this.isSink(node, _) or
this.isAdditionalTaintStep(node, _) or
this.isAdditionalTaintStep(node, _, _, _)
) and
defaultImplicitTaintRead(node, c)
}

Expand Down