|
1 | 1 | private import rust |
2 | 2 | private import codeql.dataflow.TaintTracking |
| 3 | +private import codeql.rust.controlflow.CfgNodes |
| 4 | +private import DataFlowImpl |
| 5 | +private import codeql.rust.dataflow.FlowSummary |
| 6 | +private import FlowSummaryImpl as FlowSummaryImpl |
3 | 7 | private import DataFlowImpl |
4 | 8 |
|
5 | 9 | module RustTaintTracking implements InputSig<Location, RustDataFlow> { |
6 | 10 | predicate defaultTaintSanitizer(Node::Node node) { none() } |
7 | 11 |
|
8 | 12 | /** |
9 | | - * Holds if the additional step from `src` to `sink` should be included in all |
| 13 | + * Holds if the additional step from `pred` to `succ` should be included in all |
10 | 14 | * global taint flow configurations. |
11 | 15 | */ |
12 | | - predicate defaultAdditionalTaintStep(Node::Node src, Node::Node sink, string model) { none() } |
| 16 | + predicate defaultAdditionalTaintStep(Node::Node pred, Node::Node succ, string model) { |
| 17 | + model = "" and |
| 18 | + ( |
| 19 | + exists(BinaryExprCfgNode binary | |
| 20 | + binary.getOperatorName() = ["+", "-", "*", "/", "%", "&", "|", "^", "<<", ">>"] and |
| 21 | + pred.asExpr() = [binary.getLhs(), binary.getRhs()] and |
| 22 | + succ.asExpr() = binary |
| 23 | + ) |
| 24 | + or |
| 25 | + exists(PrefixExprCfgNode prefix | |
| 26 | + prefix.getOperatorName() = ["-", "!"] and |
| 27 | + pred.asExpr() = prefix.getExpr() and |
| 28 | + succ.asExpr() = prefix |
| 29 | + ) |
| 30 | + or |
| 31 | + pred.asExpr() = succ.asExpr().(CastExprCfgNode).getExpr() |
| 32 | + or |
| 33 | + exists(IndexExprCfgNode index | |
| 34 | + index.getIndex() instanceof RangeExprCfgNode and |
| 35 | + pred.asExpr() = index.getBase() and |
| 36 | + succ.asExpr() = index |
| 37 | + ) |
| 38 | + ) |
| 39 | + or |
| 40 | + FlowSummaryImpl::Private::Steps::summaryLocalStep(pred.(Node::FlowSummaryNode).getSummaryNode(), |
| 41 | + succ.(Node::FlowSummaryNode).getSummaryNode(), false, model) |
| 42 | + } |
13 | 43 |
|
14 | 44 | /** |
15 | 45 | * Holds if taint flow configurations should allow implicit reads of `c` at sinks |
|
0 commit comments