Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit fa0e27b

Browse files
author
Robert Marsh
committed
C++: move interprocedural iterator flow to taint
1 parent 5f2cafc commit fa0e27b

4 files changed

Lines changed: 29 additions & 13 deletions

File tree

cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowUtil.qll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ private class VariablePartialDefinitionNode extends PartialDefinitionNode {
303303
override Node getPreUpdateNode() { pd.definesExpressions(_, result.asExpr()) }
304304
}
305305

306-
private class IteratorPartialDefinitionNode extends PartialDefinitionNode {
306+
class IteratorPartialDefinitionNode extends PartialDefinitionNode {
307307
override IteratorPartialDefinition pd;
308308

309309
override Node getPreUpdateNode() { pd.definesExpressions(_, result.asExpr()) }
@@ -546,10 +546,10 @@ predicate simpleLocalFlowStep(Node nodeFrom, Node nodeTo) {
546546
or
547547
// In `f(&x->a)`, this step provides the flow from post-`&` to post-`x->a`,
548548
// from which there is field flow to `x` via reverse read.
549-
exists(PartialDefinition def, Expr inner, Expr outer |
549+
exists(VariablePartialDefinition def, Expr inner, Expr outer |
550550
def.definesExpressions(inner, outer) and
551551
inner = nodeTo.(InnerPartialDefinitionNode).getPreUpdateNode().asExpr() and
552-
outer = nodeFrom.(PartialDefinitionNode).getPreUpdateNode().asExpr()
552+
outer = nodeFrom.(VariablePartialDefinitionNode).getPreUpdateNode().asExpr()
553553
)
554554
or
555555
// Reverse flow: data that flows from the post-update node of a reference

cpp/ql/src/semmle/code/cpp/dataflow/internal/FlowVar.qll

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ class FlowVar extends TFlowVar {
109109
* ```
110110
*/
111111
private module PartialDefinitions {
112-
abstract class PartialDefinition extends Expr {
112+
class PartialDefinition extends Expr {
113113
ControlFlowNode node;
114114

115115
PartialDefinition() {
@@ -216,8 +216,7 @@ private module PartialDefinitions {
216216
VariablePartialDefinition() {
217217
exists(Expr convertedInner |
218218
valueToUpdate(convertedInner, this.getFullyConverted(), node) and
219-
innerDefinedExpr = convertedInner.getUnconverted() and
220-
not this instanceof Conversion
219+
innerDefinedExpr = convertedInner.getUnconverted()
221220
)
222221
}
223222

@@ -249,11 +248,16 @@ private module PartialDefinitions {
249248
/**
250249
* A partial definition that's a definition by reference.
251250
*/
252-
class DefinitionByReference extends PartialDefinition {
251+
class DefinitionByReference extends VariablePartialDefinition {
253252
DefinitionByReference() { exists(Call c | this = c.getAnArgument() or this = c.getQualifier()) }
254253
}
255254
}
256255

256+
predicate quickTest(PartialDefinition pd) {
257+
pd instanceof DefinitionByReference and
258+
pd instanceof IteratorPartialDefinition
259+
}
260+
257261
import PartialDefinitions
258262
private import FlowVar_internal
259263

cpp/ql/src/semmle/code/cpp/dataflow/internal/TaintTrackingUtil.qll

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ predicate localTaintStep(DataFlow::Node src, DataFlow::Node sink) {
3131
*/
3232
predicate defaultAdditionalTaintStep(DataFlow::Node src, DataFlow::Node sink) {
3333
localAdditionalTaintStep(src, sink)
34+
or
35+
exists(FunctionCall call, int i |
36+
sink.(DataFlow::IteratorPartialDefinitionNode).getPartialDefinition().definesExpressions(_, call.getArgument(i)) and
37+
src.(DataFlow::RefParameterFinalValueNode).getParameter() = call.getTarget().getParameter(i)
38+
)
3439
}
3540

3641
/**
@@ -258,9 +263,9 @@ private predicate exprToPartialDefinitionStep(Expr exprIn, Expr exprOut) {
258263
}
259264

260265
private predicate iteratorDereference(Call c) {
261-
c.getTarget() instanceof IteratorArrayMemberOperator
262-
or
263-
c.getTarget() instanceof IteratorPointerDereferenceMemberOperator
264-
or
265-
c.getTarget() instanceof IteratorPointerDereferenceOperator
266+
c.getTarget() instanceof IteratorArrayMemberOperator
267+
or
268+
c.getTarget() instanceof IteratorPointerDereferenceMemberOperator
269+
or
270+
c.getTarget() instanceof IteratorPointerDereferenceOperator
266271
}

cpp/ql/test/library-tests/dataflow/taint-tests/vector.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ void taint_vector_output_iterator(std::vector<int>::iterator iter) {
331331
}
332332

333333
void test_vector_output_iterator(int b) {
334-
std::vector<int> v1(10), v2(10), v3(10), v4(10), v5(10), v6(10), v7(10), v8(10);
334+
std::vector<int> v1(10), v2(10), v3(10), v4(10), v5(10), v6(10), v7(10), v8(10), v9(10);
335335

336336
std::vector<int>::iterator i1 = v1.begin();
337337
*i1 = source();
@@ -379,4 +379,11 @@ void test_vector_output_iterator(int b) {
379379
sink(v8); // tainted [NOT DETECTED by IR]
380380
*i8 = 1;
381381
sink(v8);
382+
383+
std::vector<int>::iterator i9 = v9.begin();
384+
385+
*i9 = source();
386+
taint_vector_output_iterator(i9);
387+
388+
sink(v9);
382389
}

0 commit comments

Comments
 (0)