Skip to content

Commit 632e0c8

Browse files
committed
Rust: Generate sources and sinks
1 parent e1f92b4 commit 632e0c8

File tree

11 files changed

+77
-8
lines changed

11 files changed

+77
-8
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,9 @@ module Node {
291291
n.getAstNode() = pos.getParameterIn(c.asCfgScope().(Callable).getParamList())
292292
}
293293

294+
/** Get the parameter position of this parameter. */
295+
ParameterPosition getPosition() { this.isParameterOf(_, result) }
296+
294297
/** Gets the parameter in the CFG that this node corresponds to. */
295298
ParamBaseCfgNode getParameter() { result = n }
296299
}

rust/ql/src/utils/modelgenerator/internal/CaptureModels.qll

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ private import rust
33
private import rust as R
44
private import codeql.rust.dataflow.DataFlow
55
private import codeql.rust.dataflow.internal.DataFlowImpl
6+
private import codeql.rust.dataflow.FlowSource as FlowSource
7+
private import codeql.rust.dataflow.FlowSink as FlowSink
68
private import codeql.rust.dataflow.internal.TaintTrackingImpl
79
private import codeql.mad.modelgenerator.internal.ModelGeneratorImpl
810
private import codeql.rust.dataflow.internal.FlowSummaryImpl as FlowSummary
@@ -105,14 +107,13 @@ module ModelGeneratorInput implements ModelGeneratorInputSig<Location, RustDataF
105107

106108
predicate sinkModelSanitizer(DataFlow::Node node) { none() }
107109

108-
predicate apiSource(DataFlow::Node source) { none() }
110+
predicate apiSource(DataFlow::Node source) { source instanceof DataFlow::ParameterNode }
109111

110112
bindingset[sourceEnclosing, api]
111113
predicate irrelevantSourceSinkApi(Callable sourceEnclosing, SourceTargetApi api) { none() }
112114

113115
string getInputArgument(DataFlow::Node source) {
114-
// TODO: Implement when we want to generate sources and sinks
115-
result = "getInputArgument(" + source + ")"
116+
result = "Argument[" + source.(Node::SourceParameterNode).getPosition().toString() + "]"
116117
}
117118

118119
bindingset[kind]
@@ -174,11 +175,9 @@ module ModelGeneratorInput implements ModelGeneratorInputSig<Location, RustDataF
174175

175176
string partialNeutralModelRow(Callable api, int i) { result = partialModelRow(api, i) }
176177

177-
// TODO: Implement this when we want to generate sources.
178-
predicate sourceNode(DataFlow::Node node, string kind) { none() }
178+
predicate sourceNode(DataFlow::Node node, string kind) { FlowSource::sourceNode(node, kind) }
179179

180-
// TODO: Implement this when we want to generate sinks.
181-
predicate sinkNode(DataFlow::Node node, string kind) { none() }
180+
predicate sinkNode(DataFlow::Node node, string kind) { FlowSink::sinkNode(node, kind) }
182181
}
183182

184183
import MakeModelGenerator<Location, RustDataFlow, RustTaintTracking, ModelGeneratorInput>
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
unexpectedModel
2+
expectedModel
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
extensions:
2+
- addsTo:
3+
pack: codeql/rust-all
4+
extensible: sinkModel
5+
data:
6+
- ["repo::test", "crate::sinks::known_sink", "Argument[0]", "test-sink", "manual"]
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import rust
2+
import utils.modelgenerator.internal.CaptureModels
3+
import utils.test.InlineMadTest
4+
5+
module InlineMadTestConfig implements InlineMadTestConfigSig {
6+
string getCapturedModel(Function f) { result = captureSink(f) }
7+
8+
string getKind() { result = "sink" }
9+
}
10+
11+
import InlineMadTest<InlineMadTestConfig>
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
unexpectedModel
2+
expectedModel
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
extensions:
2+
- addsTo:
3+
pack: codeql/rust-all
4+
extensible: sourceModel
5+
data:
6+
- ["repo::test", "crate::sources::known_source", "ReturnValue", "test-source", "manual"]
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import rust
2+
import utils.modelgenerator.internal.CaptureModels
3+
import utils.test.InlineMadTest
4+
import codeql.rust.dataflow.internal.ModelsAsData
5+
6+
module InlineMadTestConfig implements InlineMadTestConfigSig {
7+
string getCapturedModel(Function c) { result = captureSource(c) }
8+
9+
string getKind() { result = "source" }
10+
}
11+
12+
import InlineMadTest<InlineMadTestConfig>

rust/ql/test/utils-tests/modelgenerator/CaptureSummaryModels.ql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import utils.modelgenerator.internal.CaptureModels
33
import utils.test.InlineMadTest
44

55
module InlineMadTestConfig implements InlineMadTestConfigSig {
6-
string getCapturedModel(Function c) { result = ContentSensitive::captureFlow(c, _) }
6+
string getCapturedModel(Function f) { result = ContentSensitive::captureFlow(f, _) }
77

88
string getKind() { result = "summary" }
99
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// A manually modeled sink
2+
fn known_sink(n: i64) {
3+
()
4+
}
5+
6+
// sink=repo::test;crate::sinks::derived_sink;Argument[1];test-sink;df-generated
7+
pub fn derived_sink(c: bool, n: i64) -> i64 {
8+
if c {
9+
known_sink(n);
10+
1
11+
} else {
12+
0
13+
}
14+
}

0 commit comments

Comments
 (0)