Skip to content

Commit aca7877

Browse files
committed
Rust: Add some missing path / file metadata models.
1 parent 8145264 commit aca7877

File tree

3 files changed

+37
-2
lines changed

3 files changed

+37
-2
lines changed

rust/ql/lib/codeql/rust/frameworks/stdlib/fs.model.yml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,27 @@ extensions:
33
pack: codeql/rust-all
44
extensible: sourceModel
55
data:
6+
- ["std::fs::exists", "ReturnValue.Field[core::result::Result::Ok(0)]", "file", "manual"]
67
- ["std::fs::read", "ReturnValue.Field[core::result::Result::Ok(0)]", "file", "manual"]
8+
- ["std::fs::read_dir", "ReturnValue.Field[core::result::Result::Ok(0)]", "file", "manual"]
79
- ["std::fs::read_to_string", "ReturnValue.Field[core::result::Result::Ok(0)]", "file", "manual"]
810
- ["std::fs::read_link", "ReturnValue.Field[core::result::Result::Ok(0)]", "file", "manual"]
11+
- ["std::fs::metadata", "ReturnValue.Field[core::result::Result::Ok(0)]", "file", "manual"]
12+
- ["std::fs::symlink_metadata", "ReturnValue.Field[core::result::Result::Ok(0)]", "file", "manual"]
913
- ["<std::fs::DirEntry>::path", "ReturnValue", "file", "manual"]
1014
- ["<std::fs::DirEntry>::file_name", "ReturnValue", "file", "manual"]
1115
- ["<std::fs::File>::open", "ReturnValue.Field[core::result::Result::Ok(0)]", "file", "manual"]
1216
- ["<std::fs::File>::open_buffered", "ReturnValue.Field[core::result::Result::Ok(0)]", "file", "manual"]
1317
- ["<std::fs::OpenOptions>::open", "ReturnValue.Field[core::result::Result::Ok(0)]", "file", "manual"]
18+
- ["<std::path::Path>::exists", "ReturnValue", "file", "manual"]
19+
- ["<std::path::Path>::try_exists", "ReturnValue.Field[core::result::Result::Ok(0)]", "file", "manual"]
20+
- ["<std::path::Path>::is_file", "ReturnValue", "file", "manual"]
21+
- ["<std::path::Path>::is_dir", "ReturnValue", "file", "manual"]
22+
- ["<std::path::Path>::is_symlink", "ReturnValue", "file", "manual"]
23+
- ["<std::path::Path>::metadata", "ReturnValue.Field[core::result::Result::Ok(0)]", "file", "manual"]
24+
- ["<std::path::Path>::symlink_metadata", "ReturnValue.Field[core::result::Result::Ok(0)]", "file", "manual"]
25+
- ["<std::path::Path>::read_dir", "ReturnValue.Field[core::result::Result::Ok(0)]", "file", "manual"]
26+
- ["<std::path::Path>::read_link", "ReturnValue.Field[core::result::Result::Ok(0)]", "file", "manual"]
1427
- addsTo:
1528
pack: codeql/rust-all
1629
extensible: sinkModel
@@ -68,3 +81,12 @@ extensions:
6881
- ["<std::path::Path>::with_extension", "Argument[Self].Reference", "ReturnValue", "taint", "manual"]
6982
- ["<std::path::Path>::with_file_name", "Argument[Self].Reference", "ReturnValue", "taint", "manual"]
7083
- ["<std::path::Path>::with_file_name", "Argument[0]", "ReturnValue", "taint", "manual"]
84+
- ["<std::fs::Metadata>::accessed", "Argument[self].Reference", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"]
85+
- ["<std::fs::Metadata>::created", "Argument[self].Reference", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"]
86+
- ["<std::fs::Metadata>::file_type", "Argument[self].Reference", "ReturnValue", "taint", "manual"]
87+
- ["<std::fs::Metadata>::is_file", "Argument[self].Reference", "ReturnValue", "taint", "manual"]
88+
- ["<std::fs::Metadata>::is_dir", "Argument[self].Reference", "ReturnValue", "taint", "manual"]
89+
- ["<std::fs::Metadata>::is_symlink", "Argument[self].Reference", "ReturnValue", "taint", "manual"]
90+
- ["<std::fs::Metadata>::len", "Argument[self].Reference", "ReturnValue", "taint", "manual"]
91+
- ["<std::fs::Metadata>::modified", "Argument[self].Reference", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"]
92+
- ["<std::fs::Metadata>::permissions", "Argument[self].Reference", "ReturnValue", "taint", "manual"]

rust/ql/test/query-tests/security/CWE-295/DisabledCertificateCheck.expected

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,24 @@
1212
| main.rs:83:32:83:37 | always | main.rs:74:15:74:18 | true | main.rs:83:32:83:37 | always | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. |
1313
| main.rs:88:32:88:40 | sometimes | main.rs:75:22:75:25 | true | main.rs:88:32:88:40 | sometimes | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. |
1414
| main.rs:93:32:93:47 | sometimes_global | main.rs:154:17:154:20 | true | main.rs:93:32:93:47 | sometimes_global | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. |
15+
| main.rs:109:36:109:37 | b1 | main.rs:107:17:107:31 | ...::exists | main.rs:109:36:109:37 | b1 | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. |
1516
| main.rs:146:36:146:37 | b6 | main.rs:144:39:144:42 | true | main.rs:146:36:146:37 | b6 | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. |
1617
edges
1718
| main.rs:73:19:73:40 | ...: bool | main.rs:93:32:93:47 | sometimes_global | provenance | |
1819
| main.rs:74:6:74:11 | always | main.rs:83:32:83:37 | always | provenance | |
1920
| main.rs:74:15:74:18 | true | main.rs:74:6:74:11 | always | provenance | |
2021
| main.rs:75:6:75:18 | mut sometimes | main.rs:88:32:88:40 | sometimes | provenance | |
2122
| main.rs:75:22:75:25 | true | main.rs:75:6:75:18 | mut sometimes | provenance | |
23+
| main.rs:107:6:107:7 | b1 | main.rs:109:36:109:37 | b1 | provenance | |
24+
| main.rs:107:17:107:31 | ...::exists | main.rs:107:17:107:42 | ...::exists(...) [Ok] | provenance | Src:MaD:1 |
25+
| main.rs:107:17:107:42 | ...::exists(...) [Ok] | main.rs:107:17:107:51 | ... .unwrap() | provenance | MaD:2 |
26+
| main.rs:107:17:107:51 | ... .unwrap() | main.rs:107:6:107:7 | b1 | provenance | |
2227
| main.rs:144:6:144:7 | b6 | main.rs:146:36:146:37 | b6 | provenance | |
2328
| main.rs:144:39:144:42 | true | main.rs:144:6:144:7 | b6 | provenance | |
2429
| main.rs:154:17:154:20 | true | main.rs:73:19:73:40 | ...: bool | provenance | |
30+
models
31+
| 1 | Source: std::fs::exists; ReturnValue.Field[core::result::Result::Ok(0)]; file |
32+
| 2 | Summary: <core::result::Result>::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value |
2533
nodes
2634
| main.rs:4:32:4:35 | true | semmle.label | true |
2735
| main.rs:9:36:9:39 | true | semmle.label | true |
@@ -41,6 +49,11 @@ nodes
4149
| main.rs:83:32:83:37 | always | semmle.label | always |
4250
| main.rs:88:32:88:40 | sometimes | semmle.label | sometimes |
4351
| main.rs:93:32:93:47 | sometimes_global | semmle.label | sometimes_global |
52+
| main.rs:107:6:107:7 | b1 | semmle.label | b1 |
53+
| main.rs:107:17:107:31 | ...::exists | semmle.label | ...::exists |
54+
| main.rs:107:17:107:42 | ...::exists(...) [Ok] | semmle.label | ...::exists(...) [Ok] |
55+
| main.rs:107:17:107:51 | ... .unwrap() | semmle.label | ... .unwrap() |
56+
| main.rs:109:36:109:37 | b1 | semmle.label | b1 |
4457
| main.rs:144:6:144:7 | b6 | semmle.label | b6 |
4558
| main.rs:144:39:144:42 | true | semmle.label | true |
4659
| main.rs:146:36:146:37 | b6 | semmle.label | b6 |

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,9 @@ fn test_threat_model_source() {
104104
// hostname setting from `fs` functions returning `bool` directly
105105
// (these are highly unnatural but serve to create simple tests)
106106

107-
let b1: bool = std::fs::exists("main.rs").unwrap();
107+
let b1: bool = std::fs::exists("main.rs").unwrap(); // $ Source=exists
108108
let _client = native_tls::TlsConnector::builder()
109-
.danger_accept_invalid_hostnames(b1) // $ MISSING: Alert[rust/disabled-certificate-check]=fs
109+
.danger_accept_invalid_hostnames(b1) // $ Alert[rust/disabled-certificate-check]=exists
110110
.build()
111111
.unwrap();
112112

0 commit comments

Comments
 (0)