Skip to content

Commit 262f724

Browse files
author
Robert Marsh
committed
C++: add taint edges to DefinitionByReferenceNode
1 parent 09d0548 commit 262f724

File tree

2 files changed

+38
-1
lines changed

2 files changed

+38
-1
lines changed

cpp/ql/src/semmle/code/cpp/dataflow/TaintTracking.qll

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
*/
1010
import semmle.code.cpp.dataflow.DataFlow
1111
import semmle.code.cpp.dataflow.DataFlow2
12+
import semmle.code.cpp.models.interfaces.DataFlow
13+
import semmle.code.cpp.models.interfaces.Taint
1214

1315
module TaintTracking {
1416

@@ -187,6 +189,9 @@ module TaintTracking {
187189
exprFrom.(PostfixCrementOperation)
188190
)
189191
)
192+
or
193+
// Taint can flow through modeled functions
194+
exprToDefinitionByReferenceStep(nodeFrom.asExpr(), nodeTo.asDefiningArgument())
190195
}
191196

192197
/**
@@ -226,4 +231,35 @@ module TaintTracking {
226231
e instanceof AlignofOperator
227232
}
228233

229-
}
234+
private predicate exprToDefinitionByReferenceStep(Expr exprIn, Expr argOut) {
235+
exists(DataFlowFunction f, Call call, FunctionOutput outModel, int argOutIndex |
236+
call.getTarget() = f and
237+
argOut = call.getArgument(argOutIndex) and
238+
outModel.isOutParameterPointer(argOutIndex) and
239+
exists(int argInIndex, FunctionInput inModel |
240+
f.hasDataFlow(inModel, outModel)
241+
|
242+
inModel.isInParameterPointer(argInIndex) and
243+
exprIn = call.getArgument(argInIndex)
244+
)
245+
)
246+
or
247+
exists(TaintFunction f, Call call, FunctionOutput outModel, int argOutIndex |
248+
call.getTarget() = f and
249+
argOut = call.getArgument(argOutIndex) and
250+
outModel.isOutParameterPointer(argOutIndex) and
251+
exists(int argInIndex, FunctionInput inModel |
252+
f.hasTaintFlow(inModel, outModel)
253+
|
254+
inModel.isInParameterPointer(argInIndex) and
255+
exprIn = call.getArgument(argInIndex)
256+
or
257+
inModel.isInParameterPointer(argInIndex) and
258+
call.passesByReference(argInIndex, exprIn)
259+
or
260+
inModel.isInParameter(argInIndex) and
261+
exprIn = call.getArgument(argInIndex)
262+
)
263+
)
264+
}
265+
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,5 @@
1010
| taint.cpp:151:7:151:12 | call to select | taint.cpp:151:20:151:25 | call to source |
1111
| taint.cpp:167:8:167:13 | call to source | taint.cpp:167:8:167:13 | call to source |
1212
| taint.cpp:168:8:168:14 | tainted | taint.cpp:164:19:164:24 | call to source |
13+
| taint.cpp:173:8:173:13 | buffer | taint.cpp:164:19:164:24 | call to source |
1314
| taint.cpp:181:8:181:9 | * ... | taint.cpp:185:11:185:16 | call to source |

0 commit comments

Comments
 (0)