Skip to content

Commit 979ae67

Browse files
authored
Merge pull request #22871 from LucaCappelletti94/upstream/rust-memory-queue-logging
Rust: Add neutral models for spurious Vec and VecDeque sink models
2 parents 926ce24 + b4e2188 commit 979ae67

3 files changed

Lines changed: 51 additions & 0 deletions

File tree

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
category: minorAnalysis
3+
---
4+
* Added neutral models to inhibit spurious generated sink models for `Vec` and `VecDeque` methods such as `insert`, `remove` and `push_back`. This fixes some false positive results from queries such as `rust/cleartext-logging`.

‎rust/ql/lib/codeql/rust/frameworks/stdlib/alloc.model.yml‎

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,3 +70,29 @@ extensions:
7070
- ["<alloc::rc::Rc as core::convert::From>::from", "sink", "manual"]
7171
- ["<alloc::string::String>::split_off", "sink", "manual"]
7272
- ["<alloc::vec::Vec>::split_off", "sink", "manual"]
73+
- ["<alloc::vec::Vec>::insert", "sink", "manual"]
74+
- ["<alloc::vec::Vec>::insert_mut", "sink", "manual"]
75+
- ["<alloc::vec::Vec>::remove", "sink", "manual"]
76+
- ["<alloc::vec::Vec>::swap_remove", "sink", "manual"]
77+
- ["<alloc::collections::vec_deque::VecDeque as alloc::collections::vec_deque::spec_extend::SpecExtend>::spec_extend", "sink", "manual"]
78+
- ["<alloc::collections::vec_deque::VecDeque as core::iter::traits::collect::Extend>::extend_one", "sink", "manual"]
79+
- ["<alloc::collections::vec_deque::VecDeque as core::iter::traits::collect::Extend>::extend_reserve", "sink", "manual"]
80+
- ["<alloc::collections::vec_deque::VecDeque as std::io::Write>::write_all_vectored", "sink", "manual"]
81+
- ["<alloc::collections::vec_deque::VecDeque as std::io::Write>::write_vectored", "sink", "manual"]
82+
- ["<alloc::collections::vec_deque::VecDeque>::append", "sink", "manual"]
83+
- ["<alloc::collections::vec_deque::VecDeque>::insert", "sink", "manual"]
84+
- ["<alloc::collections::vec_deque::VecDeque>::insert_mut", "sink", "manual"]
85+
- ["<alloc::collections::vec_deque::VecDeque>::make_contiguous", "sink", "manual"]
86+
- ["<alloc::collections::vec_deque::VecDeque>::push_back", "sink", "manual"]
87+
- ["<alloc::collections::vec_deque::VecDeque>::push_back_mut", "sink", "manual"]
88+
- ["<alloc::collections::vec_deque::VecDeque>::push_front", "sink", "manual"]
89+
- ["<alloc::collections::vec_deque::VecDeque>::push_front_mut", "sink", "manual"]
90+
- ["<alloc::collections::vec_deque::VecDeque>::remove", "sink", "manual"]
91+
- ["<alloc::collections::vec_deque::VecDeque>::reserve", "sink", "manual"]
92+
- ["<alloc::collections::vec_deque::VecDeque>::reserve_exact", "sink", "manual"]
93+
- ["<alloc::collections::vec_deque::VecDeque>::rotate_left", "sink", "manual"]
94+
- ["<alloc::collections::vec_deque::VecDeque>::rotate_right", "sink", "manual"]
95+
- ["<alloc::collections::vec_deque::VecDeque>::shrink_to", "sink", "manual"]
96+
- ["<alloc::collections::vec_deque::VecDeque>::shrink_to_fit", "sink", "manual"]
97+
- ["<alloc::collections::vec_deque::VecDeque>::try_reserve", "sink", "manual"]
98+
- ["<alloc::collections::vec_deque::VecDeque>::try_reserve_exact", "sink", "manual"]

‎rust/ql/test/query-tests/security/CWE-312/test_logging.rs‎

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,26 @@ fn test_std(password: String, i: i32, opt_i: Option<i32>) {
251251
err.write(format!("message = {}\n", password).as_bytes()); // $ Alert[rust/cleartext-logging]
252252
}
253253

254+
fn test_collections(harmless: String) {
255+
// collection operations are not logging
256+
let mut passwords = Vec::new();
257+
passwords.insert(0, harmless.clone());
258+
passwords.insert(1, harmless.clone());
259+
_ = passwords.remove(1);
260+
_ = passwords.swap_remove(0);
261+
262+
let mut password_queue = std::collections::VecDeque::new();
263+
password_queue.push_back(harmless.clone());
264+
password_queue.push_front(harmless.clone());
265+
password_queue.insert(1, harmless.clone());
266+
password_queue.append(&mut std::collections::VecDeque::from([harmless]));
267+
password_queue.reserve(1);
268+
password_queue.rotate_left(1);
269+
password_queue.shrink_to(1);
270+
_ = password_queue.remove(1);
271+
password_queue.make_contiguous();
272+
}
273+
254274
fn main() {
255275
simple_logger::SimpleLogger::new().init().unwrap();
256276

@@ -260,4 +280,5 @@ fn main() {
260280
"[encrypted]".to_string(),
261281
);
262282
test_std("123456".to_string(), 0, None);
283+
test_collections("harmless".to_string());
263284
}

0 commit comments

Comments
 (0)