Skip to content

Commit 0dfdd67

Browse files
committed
Rust: Lift content reads as taint steps
1 parent 14f9997 commit 0dfdd67

File tree

1 file changed

+10
-4
lines changed

1 file changed

+10
-4
lines changed

rust/ql/lib/codeql/rust/dataflow/internal/TaintTrackingImpl.qll

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ private import Node as Node
77
private import Content
88
private import FlowSummaryImpl as FlowSummaryImpl
99
private import codeql.rust.internal.CachedStages
10+
private import codeql.rust.internal.TypeInference as TypeInference
11+
private import codeql.rust.internal.Type as Type
12+
private import codeql.rust.frameworks.stdlib.Builtins as Builtins
1013

1114
module RustTaintTracking implements InputSig<Location, RustDataFlow> {
1215
predicate defaultTaintSanitizer(DataFlow::Node node) { none() }
@@ -45,10 +48,13 @@ module RustTaintTracking implements InputSig<Location, RustDataFlow> {
4548
// or reference.
4649
// This is needed in order to support taint-tracking configurations where
4750
// the source is a collection or reference.
48-
exists(SingletonContentSet cs | RustDataFlow::readStep(pred, cs, succ) |
49-
cs.getContent() instanceof ElementContent
50-
or
51-
cs.getContent() instanceof ReferenceContent
51+
RustDataFlow::readContentStep(pred, _, succ) and
52+
not exists(Struct s |
53+
s = TypeInference::inferType(succ.asExpr()).(Type::StructType).getStruct()
54+
|
55+
s instanceof Builtins::NumericType or
56+
s instanceof Builtins::Bool or
57+
s instanceof Builtins::Char
5258
)
5359
or
5460
exists(FormatArgsExpr format | succ.asExpr() = format |

0 commit comments

Comments
 (0)