Skip to content

Commit 7e108a8

Browse files
authored
Merge pull request #19310 from geoffw0/trim
Rust: Add model for str.trim
2 parents e1bddb6 + 9da6d94 commit 7e108a8

File tree

9 files changed

+1017
-988
lines changed

9 files changed

+1017
-988
lines changed

Diff for: rust/ql/lib/codeql/rust/frameworks/stdlib/lang-alloc.model.yml

+4-2
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ extensions:
3232
# Fmt
3333
- ["lang:alloc", "crate::fmt::format", "Argument[0]", "ReturnValue", "taint", "manual"]
3434
# String
35-
- ["lang:alloc", "<crate::string::String>::as_str", "Argument[self]", "ReturnValue", "taint", "manual"]
36-
- ["lang:alloc", "<crate::string::String>::as_bytes", "Argument[self]", "ReturnValue", "taint", "manual"]
35+
- ["lang:alloc", "<crate::string::String>::as_str", "Argument[self]", "ReturnValue", "value", "manual"]
36+
- ["lang:alloc", "<crate::string::String>::as_bytes", "Argument[self]", "ReturnValue", "value", "manual"]
3737
- ["lang:alloc", "<_ as crate::string::ToString>::to_string", "Argument[self]", "ReturnValue", "taint", "manual"]
38+
- ["lang:alloc", "<crate::string::String>::parse", "Argument[self]", "ReturnValue.Field[crate::result::Result::Ok(0)]", "taint", "manual"]
39+
- ["lang:alloc", "<crate::string::String>::trim", "Argument[self]", "ReturnValue.Reference", "taint", "manual"]

Diff for: rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml

+4
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,11 @@ extensions:
4040
- ["lang:core", "crate::ptr::write_unaligned", "Argument[1]", "Argument[0].Reference", "value", "manual"]
4141
- ["lang:core", "crate::ptr::write_volatile", "Argument[1]", "Argument[0].Reference", "value", "manual"]
4242
# Str
43+
- ["lang:core", "<str>::as_str", "Argument[self]", "ReturnValue", "taint", "value"]
44+
- ["lang:core", "<str>::as_bytes", "Argument[self]", "ReturnValue", "taint", "value"]
45+
- ["lang:core", "<str>::to_string", "Argument[self]", "ReturnValue", "taint", "manual"]
4346
- ["lang:core", "<str>::parse", "Argument[self]", "ReturnValue.Field[crate::result::Result::Ok(0)]", "taint", "manual"]
47+
- ["lang:core", "<str>::trim", "Argument[self]", "ReturnValue.Reference", "taint", "manual"]
4448
- addsTo:
4549
pack: codeql/rust-all
4650
extensible: sourceModel

Diff for: rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected

+984-979
Large diffs are not rendered by default.

Diff for: rust/ql/test/library-tests/dataflow/strings/inline-taint-flow.expected

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
models
22
| 1 | Summary: lang:alloc; <_ as crate::string::ToString>::to_string; Argument[self]; ReturnValue; taint |
33
| 2 | Summary: lang:alloc; <crate::string::String as crate::convert::From>::from; Argument[0]; ReturnValue; value |
4-
| 3 | Summary: lang:alloc; <crate::string::String>::as_str; Argument[self]; ReturnValue; taint |
4+
| 3 | Summary: lang:alloc; <crate::string::String>::as_str; Argument[self]; ReturnValue; value |
55
| 4 | Summary: lang:alloc; crate::fmt::format; Argument[0]; ReturnValue; taint |
66
| 5 | Summary: lang:core; crate::hint::must_use; Argument[0]; ReturnValue; value |
77
edges

Diff for: rust/ql/test/library-tests/dataflow/strings/main.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ fn string_to_string() {
6161

6262
fn as_str() {
6363
let s = source(67);
64-
sink_slice(s.as_str()); // $ hasTaintFlow=67
64+
sink_slice(s.as_str()); // $ hasValueFlow=67
6565
}
6666

6767
fn format_args_built_in() {

Diff for: rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected

+5-1
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,15 @@ edges
3232
| sqlx.rs:52:32:52:87 | MacroExpr | sqlx.rs:52:32:52:87 | ...::format(...) | provenance | MaD:4 |
3333
| sqlx.rs:52:32:52:87 | { ... } | sqlx.rs:52:32:52:87 | ...::must_use(...) | provenance | MaD:9 |
3434
| sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | sqlx.rs:63:26:63:39 | unsafe_query_1 [&ref] | provenance | |
35+
| sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | sqlx.rs:63:26:63:48 | unsafe_query_1.as_str() | provenance | MaD:3 |
3536
| sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | sqlx.rs:74:25:74:38 | unsafe_query_1 [&ref] | provenance | |
37+
| sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | sqlx.rs:74:25:74:47 | unsafe_query_1.as_str() | provenance | MaD:3 |
3638
| sqlx.rs:53:26:53:36 | &arg_string [&ref] | sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | provenance | |
3739
| sqlx.rs:53:27:53:36 | arg_string | sqlx.rs:53:26:53:36 | &arg_string [&ref] | provenance | |
3840
| sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | sqlx.rs:65:30:65:43 | unsafe_query_2 [&ref] | provenance | |
41+
| sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | sqlx.rs:65:30:65:52 | unsafe_query_2.as_str() | provenance | MaD:3 |
3942
| sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | sqlx.rs:76:29:76:42 | unsafe_query_2 [&ref] | provenance | |
43+
| sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | sqlx.rs:76:29:76:51 | unsafe_query_2.as_str() | provenance | MaD:3 |
4044
| sqlx.rs:54:26:54:39 | &remote_string [&ref] | sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | provenance | |
4145
| sqlx.rs:54:27:54:39 | remote_string | sqlx.rs:54:26:54:39 | &remote_string [&ref] | provenance | |
4246
| sqlx.rs:56:9:56:22 | unsafe_query_4 | sqlx.rs:67:30:67:52 | unsafe_query_4.as_str() | provenance | MaD:3 |
@@ -53,7 +57,7 @@ edges
5357
models
5458
| 1 | Source: lang:std; crate::env::args; command-line-source; ReturnValue.Element |
5559
| 2 | Source: repo:https://github.com/seanmonstar/reqwest:reqwest; crate::blocking::get; remote; ReturnValue.Field[crate::result::Result::Ok(0)] |
56-
| 3 | Summary: lang:alloc; <crate::string::String>::as_str; Argument[self]; ReturnValue; taint |
60+
| 3 | Summary: lang:alloc; <crate::string::String>::as_str; Argument[self]; ReturnValue; value |
5761
| 4 | Summary: lang:alloc; crate::fmt::format; Argument[0]; ReturnValue; taint |
5862
| 5 | Summary: lang:core; <crate::option::Option>::unwrap_or; Argument[self].Field[crate::option::Option::Some(0)]; ReturnValue; value |
5963
| 6 | Summary: lang:core; <crate::result::Result>::unwrap; Argument[self].Field[crate::result::Result::Ok(0)]; ReturnValue; value |

Diff for: rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected

+2-2
Original file line numberDiff line numberDiff line change
@@ -226,8 +226,8 @@ models
226226
| 8 | Sink: lang:std; crate::io::stdio::_print; log-injection; Argument[0] |
227227
| 9 | Sink: repo:https://github.com/rust-lang/log:log; crate::__private_api::log; log-injection; Argument[1] |
228228
| 10 | Sink: repo:https://github.com/rust-lang/log:log; crate::__private_api::log; log-injection; Argument[3] |
229-
| 11 | Summary: lang:alloc; <crate::string::String>::as_bytes; Argument[self]; ReturnValue; taint |
230-
| 12 | Summary: lang:alloc; <crate::string::String>::as_str; Argument[self]; ReturnValue; taint |
229+
| 11 | Summary: lang:alloc; <crate::string::String>::as_bytes; Argument[self]; ReturnValue; value |
230+
| 12 | Summary: lang:alloc; <crate::string::String>::as_str; Argument[self]; ReturnValue; value |
231231
| 13 | Summary: lang:alloc; crate::fmt::format; Argument[0]; ReturnValue; taint |
232232
| 14 | Summary: lang:core; crate::hint::must_use; Argument[0]; ReturnValue; value |
233233
nodes

Diff for: rust/ql/test/query-tests/security/CWE-328/WeakSensitiveDataHashing.expected

+14
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
| test.rs:62:9:62:24 | ...::digest | test.rs:62:26:62:37 | password_arr | test.rs:62:9:62:24 | ...::digest | $@ is used in a hashing algorithm (MD5) that is insecure for password hashing, since it is not a computationally expensive hash function. | test.rs:62:26:62:37 | password_arr | Sensitive data (password) |
1313
| test.rs:64:9:64:24 | ...::digest | test.rs:64:26:64:37 | password_vec | test.rs:64:9:64:24 | ...::digest | $@ is used in a hashing algorithm (MD5) that is insecure for password hashing, since it is not a computationally expensive hash function. | test.rs:64:26:64:37 | password_vec | Sensitive data (password) |
1414
| test.rs:77:9:77:33 | ...::new_with_prefix | test.rs:77:35:77:42 | password | test.rs:77:9:77:33 | ...::new_with_prefix | $@ is used in a hashing algorithm (MD5) that is insecure for password hashing, since it is not a computationally expensive hash function. | test.rs:77:35:77:42 | password | Sensitive data (password) |
15+
| test.rs:81:9:81:24 | ...::digest | test.rs:81:26:81:33 | password | test.rs:81:9:81:24 | ...::digest | $@ is used in a hashing algorithm (MD5) that is insecure for password hashing, since it is not a computationally expensive hash function. | test.rs:81:26:81:33 | password | Sensitive data (password) |
16+
| test.rs:83:9:83:24 | ...::digest | test.rs:83:26:83:33 | password | test.rs:83:9:83:24 | ...::digest | $@ is used in a hashing algorithm (MD5) that is insecure for password hashing, since it is not a computationally expensive hash function. | test.rs:83:26:83:33 | password | Sensitive data (password) |
1517
edges
1618
| test.rs:14:26:14:39 | credit_card_no | test.rs:14:9:14:24 | ...::digest | provenance | MaD:1 Sink:MaD:1 |
1719
| test.rs:15:26:15:33 | password | test.rs:15:9:15:24 | ...::digest | provenance | MaD:1 Sink:MaD:1 |
@@ -26,10 +28,16 @@ edges
2628
| test.rs:62:26:62:37 | password_arr | test.rs:62:9:62:24 | ...::digest | provenance | MaD:1 Sink:MaD:1 |
2729
| test.rs:64:26:64:37 | password_vec | test.rs:64:9:64:24 | ...::digest | provenance | MaD:1 Sink:MaD:1 |
2830
| test.rs:77:35:77:42 | password | test.rs:77:9:77:33 | ...::new_with_prefix | provenance | MaD:2 Sink:MaD:2 |
31+
| test.rs:81:26:81:33 | password | test.rs:81:26:81:40 | password.trim() [&ref] | provenance | MaD:5 |
32+
| test.rs:81:26:81:40 | password.trim() [&ref] | test.rs:81:9:81:24 | ...::digest | provenance | MaD:1 Sink:MaD:1 |
33+
| test.rs:83:26:83:33 | password | test.rs:83:26:83:44 | password.as_bytes() | provenance | MaD:4 |
34+
| test.rs:83:26:83:44 | password.as_bytes() | test.rs:83:9:83:24 | ...::digest | provenance | MaD:1 Sink:MaD:1 |
2935
models
3036
| 1 | Sink: repo:https://github.com/RustCrypto/traits:digest; <_ as crate::digest::Digest>::digest; hasher-input; Argument[0] |
3137
| 2 | Sink: repo:https://github.com/RustCrypto/traits:digest; <_ as crate::digest::Digest>::new_with_prefix; hasher-input; Argument[0] |
3238
| 3 | Sink: repo:https://github.com/stainless-steel/md5:md5; crate::compute; hasher-input; Argument[0] |
39+
| 4 | Summary: lang:core; <str>::as_bytes; Argument[self]; ReturnValue; taint |
40+
| 5 | Summary: lang:core; <str>::trim; Argument[self]; ReturnValue.Reference; taint |
3341
nodes
3442
| test.rs:14:9:14:24 | ...::digest | semmle.label | ...::digest |
3543
| test.rs:14:26:14:39 | credit_card_no | semmle.label | credit_card_no |
@@ -57,4 +65,10 @@ nodes
5765
| test.rs:64:26:64:37 | password_vec | semmle.label | password_vec |
5866
| test.rs:77:9:77:33 | ...::new_with_prefix | semmle.label | ...::new_with_prefix |
5967
| test.rs:77:35:77:42 | password | semmle.label | password |
68+
| test.rs:81:9:81:24 | ...::digest | semmle.label | ...::digest |
69+
| test.rs:81:26:81:33 | password | semmle.label | password |
70+
| test.rs:81:26:81:40 | password.trim() [&ref] | semmle.label | password.trim() [&ref] |
71+
| test.rs:83:9:83:24 | ...::digest | semmle.label | ...::digest |
72+
| test.rs:83:26:83:33 | password | semmle.label | password |
73+
| test.rs:83:26:83:44 | password.as_bytes() | semmle.label | password.as_bytes() |
6074
subpaths

Diff for: rust/ql/test/query-tests/security/CWE-328/test.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,9 @@ fn test_hash_code_patterns(
7878

7979
// hash transformed data
8080
_ = md5::Md5::digest(harmless.trim());
81-
_ = md5::Md5::digest(password.trim()); // $ MISSING: Alert[rust/weak-sensitive-data-hashing]
81+
_ = md5::Md5::digest(password.trim()); // $ Alert[rust/weak-sensitive-data-hashing]
8282
_ = md5::Md5::digest(harmless.as_bytes());
83-
_ = md5::Md5::digest(password.as_bytes()); // $ MISSING: Alert[rust/weak-sensitive-data-hashing]
83+
_ = md5::Md5::digest(password.as_bytes()); // $ Alert[rust/weak-sensitive-data-hashing]
8484
_ = md5::Md5::digest(std::str::from_utf8(harmless_arr).unwrap());
8585
_ = md5::Md5::digest(std::str::from_utf8(password_arr).unwrap()); // $ MISSING: Alert[rust/weak-sensitive-data-hashing]
8686
}

0 commit comments

Comments
 (0)