Skip to content

Commit 8da4482

Browse files
committed
Rust: Add tests for std::fs::canonicalize and similar.
1 parent 801be8f commit 8da4482

File tree

2 files changed

+46
-5
lines changed

2 files changed

+46
-5
lines changed
Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,41 @@
11
#select
22
| src/main.rs:11:5:11:22 | ...::read_to_string | src/main.rs:7:11:7:19 | file_name | src/main.rs:11:5:11:22 | ...::read_to_string | This path depends on a $@. | src/main.rs:7:11:7:19 | file_name | user-provided value |
3+
| src/main.rs:104:13:104:31 | ...::open | src/main.rs:103:17:103:30 | ...::args | src/main.rs:104:13:104:31 | ...::open | This path depends on a $@. | src/main.rs:103:17:103:30 | ...::args | user-provided value |
34
edges
45
| src/main.rs:7:11:7:19 | file_name | src/main.rs:9:35:9:43 | file_name | provenance | |
56
| src/main.rs:9:9:9:17 | file_path | src/main.rs:11:24:11:32 | file_path | provenance | |
67
| src/main.rs:9:21:9:44 | ...::from(...) | src/main.rs:9:9:9:17 | file_path | provenance | |
7-
| src/main.rs:9:35:9:43 | file_name | src/main.rs:9:21:9:44 | ...::from(...) | provenance | MaD:2 |
8-
| src/main.rs:9:35:9:43 | file_name | src/main.rs:9:21:9:44 | ...::from(...) | provenance | MaD:2 |
9-
| src/main.rs:11:24:11:32 | file_path | src/main.rs:11:5:11:22 | ...::read_to_string | provenance | MaD:1 Sink:MaD:1 |
8+
| src/main.rs:9:35:9:43 | file_name | src/main.rs:9:21:9:44 | ...::from(...) | provenance | MaD:7 |
9+
| src/main.rs:9:35:9:43 | file_name | src/main.rs:9:21:9:44 | ...::from(...) | provenance | MaD:7 |
10+
| src/main.rs:11:24:11:32 | file_path | src/main.rs:11:5:11:22 | ...::read_to_string | provenance | MaD:2 Sink:MaD:2 |
11+
| src/main.rs:103:9:103:13 | path1 | src/main.rs:104:33:104:37 | path1 | provenance | |
12+
| src/main.rs:103:17:103:30 | ...::args | src/main.rs:103:17:103:32 | ...::args(...) [element] | provenance | Src:MaD:3 |
13+
| src/main.rs:103:17:103:32 | ...::args(...) [element] | src/main.rs:103:17:103:39 | ... .nth(...) [Some] | provenance | MaD:5 |
14+
| src/main.rs:103:17:103:39 | ... .nth(...) [Some] | src/main.rs:103:17:103:48 | ... .unwrap() | provenance | MaD:6 |
15+
| src/main.rs:103:17:103:48 | ... .unwrap() | src/main.rs:103:9:103:13 | path1 | provenance | |
16+
| src/main.rs:104:33:104:37 | path1 | src/main.rs:104:33:104:45 | path1.clone() | provenance | MaD:4 |
17+
| src/main.rs:104:33:104:45 | path1.clone() | src/main.rs:104:13:104:31 | ...::open | provenance | MaD:1 Sink:MaD:1 |
1018
models
11-
| 1 | Sink: std::fs::read_to_string; Argument[0]; path-injection |
12-
| 2 | Summary: <std::path::PathBuf as core::convert::From>::from; Argument[0]; ReturnValue; taint |
19+
| 1 | Sink: <std::fs::File>::open; Argument[0]; path-injection |
20+
| 2 | Sink: std::fs::read_to_string; Argument[0]; path-injection |
21+
| 3 | Source: std::env::args; ReturnValue.Element; commandargs |
22+
| 4 | Summary: <_ as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value |
23+
| 5 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Element; ReturnValue.Field[core::option::Option::Some(0)]; value |
24+
| 6 | Summary: <core::option::Option>::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value |
25+
| 7 | Summary: <std::path::PathBuf as core::convert::From>::from; Argument[0]; ReturnValue; taint |
1326
nodes
1427
| src/main.rs:7:11:7:19 | file_name | semmle.label | file_name |
1528
| src/main.rs:9:9:9:17 | file_path | semmle.label | file_path |
1629
| src/main.rs:9:21:9:44 | ...::from(...) | semmle.label | ...::from(...) |
1730
| src/main.rs:9:35:9:43 | file_name | semmle.label | file_name |
1831
| src/main.rs:11:5:11:22 | ...::read_to_string | semmle.label | ...::read_to_string |
1932
| src/main.rs:11:24:11:32 | file_path | semmle.label | file_path |
33+
| src/main.rs:103:9:103:13 | path1 | semmle.label | path1 |
34+
| src/main.rs:103:17:103:30 | ...::args | semmle.label | ...::args |
35+
| src/main.rs:103:17:103:32 | ...::args(...) [element] | semmle.label | ...::args(...) [element] |
36+
| src/main.rs:103:17:103:39 | ... .nth(...) [Some] | semmle.label | ... .nth(...) [Some] |
37+
| src/main.rs:103:17:103:48 | ... .unwrap() | semmle.label | ... .unwrap() |
38+
| src/main.rs:104:13:104:31 | ...::open | semmle.label | ...::open |
39+
| src/main.rs:104:33:104:37 | path1 | semmle.label | path1 |
40+
| src/main.rs:104:33:104:45 | path1.clone() | semmle.label | path1.clone() |
2041
subpaths

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,26 @@ fn tainted_path_handler_folder_almost_good3(
9999
fs::read_to_string(file_path).map_err(InternalServerError) // $ path-injection-sink MISSING: Alert[rust/path-injection]=remote5
100100
}
101101

102+
async fn more_simple_cases() {
103+
let path1 = std::env::args().nth(1).unwrap(); // $ Source=arg1
104+
let _ = std::fs::File::open(path1.clone()); // $ path-injection-sink Alert[rust/path-injection]=arg1
105+
106+
let path2 = std::fs::canonicalize(path1.clone()).unwrap();
107+
let _ = std::fs::File::open(path2); // $ path-injection-sink MISSING: Alert[rust/path-injection]=arg1
108+
109+
let path3 = tokio::fs::canonicalize(path1.clone()).await.unwrap();
110+
let _ = tokio::fs::File::open(path3); // $ MISSING: path-injection-sink Alert[rust/path-injection]=arg1
111+
112+
let path4 = async_std::fs::canonicalize(path1.clone()).await.unwrap();
113+
let _ = async_std::fs::File::open(path4); // $ MISSING: path-injection-sink Alert[rust/path-injection]=arg1
114+
115+
let path5 = std::path::Path::new(&path1);
116+
let _ = std::fs::File::open(path5); // $ path-injection-sink MISSING: Alert[rust/path-injection]=arg1
117+
118+
let path6 = path5.canonicalize().unwrap();
119+
let _ = std::fs::File::open(path6); // $ path-injection-sink MISSING: Alert[rust/path-injection]=arg1
120+
}
121+
102122
fn sinks(path1: &Path, path2: &Path) {
103123
let _ = std::fs::copy(path1, path2); // $ path-injection-sink
104124
let _ = std::fs::create_dir(path1); // $ path-injection-sink

0 commit comments

Comments
 (0)