Skip to content

Commit d1a5c9b

Browse files
committed
Rust: Add a test case resembling code seen in the wild.
1 parent 8b04bc0 commit d1a5c9b

File tree

2 files changed

+40
-1
lines changed

2 files changed

+40
-1
lines changed

rust/ql/test/query-tests/security/CWE-022/TaintedPath.expected

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
| src/main.rs:113:13:113:37 | ...::open | src/main.rs:103:17:103:30 | ...::args | src/main.rs:113:13:113:37 | ...::open | This path depends on a $@. | src/main.rs:103:17:103:30 | ...::args | user-provided value |
77
| src/main.rs:122:13:122:25 | ...::copy | src/main.rs:103:17:103:30 | ...::args | src/main.rs:122:13:122:25 | ...::copy | This path depends on a $@. | src/main.rs:103:17:103:30 | ...::args | user-provided value |
88
| src/main.rs:123:13:123:25 | ...::copy | src/main.rs:103:17:103:30 | ...::args | src/main.rs:123:13:123:25 | ...::copy | This path depends on a $@. | src/main.rs:103:17:103:30 | ...::args | user-provided value |
9+
| src/main.rs:174:25:174:34 | ...::open | src/main.rs:185:17:185:30 | ...::args | src/main.rs:174:25:174:34 | ...::open | This path depends on a $@. | src/main.rs:185:17:185:30 | ...::args | user-provided value |
910
edges
1011
| src/main.rs:7:11:7:19 | file_name | src/main.rs:9:35:9:43 | file_name | provenance | |
1112
| src/main.rs:9:9:9:17 | file_path | src/main.rs:11:24:11:32 | file_path | provenance | |
@@ -49,6 +50,15 @@ edges
4950
| src/main.rs:122:27:122:39 | path1.clone() | src/main.rs:122:13:122:25 | ...::copy | provenance | MaD:4 Sink:MaD:4 |
5051
| src/main.rs:123:37:123:41 | path1 | src/main.rs:123:37:123:49 | path1.clone() | provenance | MaD:7 |
5152
| src/main.rs:123:37:123:49 | path1.clone() | src/main.rs:123:13:123:25 | ...::copy | provenance | MaD:4 Sink:MaD:4 |
53+
| src/main.rs:170:16:170:29 | ...: ... [&ref] | src/main.rs:174:36:174:43 | path_str [&ref] | provenance | |
54+
| src/main.rs:174:36:174:43 | path_str [&ref] | src/main.rs:174:25:174:34 | ...::open | provenance | MaD:2 Sink:MaD:2 |
55+
| src/main.rs:185:9:185:13 | path1 | src/main.rs:186:18:186:22 | path1 | provenance | |
56+
| src/main.rs:185:17:185:30 | ...::args | src/main.rs:185:17:185:32 | ...::args(...) [element] | provenance | Src:MaD:6 |
57+
| src/main.rs:185:17:185:32 | ...::args(...) [element] | src/main.rs:185:17:185:39 | ... .nth(...) [Some] | provenance | MaD:8 |
58+
| src/main.rs:185:17:185:39 | ... .nth(...) [Some] | src/main.rs:185:17:185:48 | ... .unwrap() | provenance | MaD:9 |
59+
| src/main.rs:185:17:185:48 | ... .unwrap() | src/main.rs:185:9:185:13 | path1 | provenance | |
60+
| src/main.rs:186:17:186:22 | &path1 [&ref] | src/main.rs:170:16:170:29 | ...: ... [&ref] | provenance | |
61+
| src/main.rs:186:18:186:22 | path1 | src/main.rs:186:17:186:22 | &path1 [&ref] | provenance | |
5262
models
5363
| 1 | Sink: <async_std::fs::file::File>::open; Argument[0]; path-injection |
5464
| 2 | Sink: <std::fs::File>::open; Argument[0]; path-injection |
@@ -108,4 +118,14 @@ nodes
108118
| src/main.rs:123:13:123:25 | ...::copy | semmle.label | ...::copy |
109119
| src/main.rs:123:37:123:41 | path1 | semmle.label | path1 |
110120
| src/main.rs:123:37:123:49 | path1.clone() | semmle.label | path1.clone() |
121+
| src/main.rs:170:16:170:29 | ...: ... [&ref] | semmle.label | ...: ... [&ref] |
122+
| src/main.rs:174:25:174:34 | ...::open | semmle.label | ...::open |
123+
| src/main.rs:174:36:174:43 | path_str [&ref] | semmle.label | path_str [&ref] |
124+
| src/main.rs:185:9:185:13 | path1 | semmle.label | path1 |
125+
| src/main.rs:185:17:185:30 | ...::args | semmle.label | ...::args |
126+
| src/main.rs:185:17:185:32 | ...::args(...) [element] | semmle.label | ...::args(...) [element] |
127+
| src/main.rs:185:17:185:39 | ... .nth(...) [Some] | semmle.label | ... .nth(...) [Some] |
128+
| src/main.rs:185:17:185:48 | ... .unwrap() | semmle.label | ... .unwrap() |
129+
| src/main.rs:186:17:186:22 | &path1 [&ref] | semmle.label | &path1 [&ref] |
130+
| src/main.rs:186:18:186:22 | path1 | semmle.label | path1 |
111131
subpaths

rust/ql/test/query-tests/security/CWE-022/src/main.rs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,4 +165,23 @@ fn sinks(path1: &Path, path2: &Path) {
165165
let _ = async_std::fs::OpenOptions::new().open(path1); // $ path-injection-sink
166166
}
167167

168-
fn main() {}
168+
use std::fs::File;
169+
170+
fn my_function(path_str: &str) -> Result<(), std::io::Error> {
171+
// somewhat realistic example
172+
let path = Path::new(path_str);
173+
if path.exists() { // $ path-injection-sink
174+
let mut file1 = File::open(path_str)?; // $ path-injection-sink Alert[rust/path-injection]=arg2
175+
// ...
176+
177+
let mut file2 = File::open(path)?; // $ path-injection-sink MISSING: Alert[rust/path-injection]=arg2
178+
// ...
179+
}
180+
181+
Ok(())
182+
}
183+
184+
fn main() {
185+
let path1 = std::env::args().nth(1).unwrap(); // $ Source=arg2
186+
my_function(&path1);
187+
}

0 commit comments

Comments
 (0)