Skip to content

Commit dad9420

Browse files
committed
C#: Add some implicit toString data flow test cases.
1 parent b0062fc commit dad9420

File tree

3 files changed

+82
-0
lines changed

3 files changed

+82
-0
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
using System;
2+
3+
public class TestClass
4+
{
5+
public class MyClass()
6+
{
7+
public override string ToString()
8+
{
9+
return "tainted";
10+
}
11+
}
12+
13+
public static void Sink(object o) { }
14+
15+
public void M1()
16+
{
17+
var x1 = new MyClass();
18+
var x2 = "Hello" + x1.ToString();
19+
Sink(x2);
20+
}
21+
22+
public void M2()
23+
{
24+
var x1 = new MyClass();
25+
var x2 = "Hello" + x1;
26+
Sink(x2); // MISSING
27+
}
28+
29+
public void M3()
30+
{
31+
var x1 = new MyClass();
32+
var x2 = $"Hello {x1.ToString()}";
33+
Sink(x2);
34+
}
35+
36+
public void M4()
37+
{
38+
var x1 = new MyClass();
39+
var x2 = $"Hello {x1}";
40+
Sink(x2); // Missing
41+
}
42+
43+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
models
2+
edges
3+
| implicitToString.cs:9:20:9:28 | "tainted" : String | implicitToString.cs:18:28:18:40 | call to method ToString : String | provenance | |
4+
| implicitToString.cs:9:20:9:28 | "tainted" : String | implicitToString.cs:32:27:32:39 | call to method ToString : String | provenance | |
5+
| implicitToString.cs:18:13:18:14 | access to local variable x2 : String | implicitToString.cs:19:14:19:15 | access to local variable x2 | provenance | |
6+
| implicitToString.cs:18:28:18:40 | call to method ToString : String | implicitToString.cs:18:13:18:14 | access to local variable x2 : String | provenance | |
7+
| implicitToString.cs:32:13:32:14 | access to local variable x2 : String | implicitToString.cs:33:14:33:15 | access to local variable x2 | provenance | |
8+
| implicitToString.cs:32:27:32:39 | call to method ToString : String | implicitToString.cs:32:13:32:14 | access to local variable x2 : String | provenance | |
9+
nodes
10+
| implicitToString.cs:9:20:9:28 | "tainted" : String | semmle.label | "tainted" : String |
11+
| implicitToString.cs:18:13:18:14 | access to local variable x2 : String | semmle.label | access to local variable x2 : String |
12+
| implicitToString.cs:18:28:18:40 | call to method ToString : String | semmle.label | call to method ToString : String |
13+
| implicitToString.cs:19:14:19:15 | access to local variable x2 | semmle.label | access to local variable x2 |
14+
| implicitToString.cs:32:13:32:14 | access to local variable x2 : String | semmle.label | access to local variable x2 : String |
15+
| implicitToString.cs:32:27:32:39 | call to method ToString : String | semmle.label | call to method ToString : String |
16+
| implicitToString.cs:33:14:33:15 | access to local variable x2 | semmle.label | access to local variable x2 |
17+
subpaths
18+
#select
19+
| implicitToString.cs:9:20:9:28 | "tainted" : String | implicitToString.cs:9:20:9:28 | "tainted" : String | implicitToString.cs:19:14:19:15 | access to local variable x2 | $@ | implicitToString.cs:19:14:19:15 | access to local variable x2 | access to local variable x2 |
20+
| implicitToString.cs:9:20:9:28 | "tainted" : String | implicitToString.cs:9:20:9:28 | "tainted" : String | implicitToString.cs:33:14:33:15 | access to local variable x2 | $@ | implicitToString.cs:33:14:33:15 | access to local variable x2 | access to local variable x2 |
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import csharp
2+
import utils.test.ProvenancePathGraph::ShowProvenance<Tt::PathNode, Tt::PathGraph>
3+
4+
module TtConfig implements DataFlow::ConfigSig {
5+
predicate isSource(DataFlow::Node src) { src.asExpr().(StringLiteral).getValue() = "tainted" }
6+
7+
predicate isSink(DataFlow::Node sink) {
8+
exists(MethodCall mc |
9+
mc.getTarget().hasUndecoratedName("Sink") and
10+
mc.getAnArgument() = sink.asExpr()
11+
)
12+
}
13+
}
14+
15+
module Tt = TaintTracking::Global<TtConfig>;
16+
17+
from Tt::PathNode source, Tt::PathNode sink
18+
where Tt::flowPath(source, sink)
19+
select source, source, sink, "$@", sink, sink.toString()

0 commit comments

Comments
 (0)