Skip to content

Commit cd6975f

Browse files
committed
Rust: Update DotDotCheck from getResolvedPath -> getCanonicalPath.
1 parent a702f7a commit cd6975f

File tree

3 files changed

+17
-3
lines changed

3 files changed

+17
-3
lines changed

rust/ql/lib/codeql/rust/security/TaintedPathExtensions.qll

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,8 @@ module SanitizerGuard {
6969
*/
7070
private class DotDotCheck extends SanitizerGuard::Range, CfgNodes::MethodCallExprCfgNode {
7171
DotDotCheck() {
72-
this.getAstNode().(Resolvable).getResolvedPath() = "<str>::contains" and
72+
this.getAstNode().(CallExprBase).getStaticTarget().(Addressable).getCanonicalPath() =
73+
"alloc::string::String::contains" and
7374
this.getArgument(0).getAstNode().(LiteralExpr).getTextValue() =
7475
["\"..\"", "\"../\"", "\"..\\\""]
7576
}

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#select
22
| src/main.rs:10:5:10:22 | ...::read_to_string | src/main.rs:6:11:6:19 | file_name | src/main.rs:10:5:10:22 | ...::read_to_string | This path depends on a $@. | src/main.rs:6:11:6:19 | file_name | user-provided value |
3+
| src/main.rs:20:5:20:22 | ...::read_to_string | src/main.rs:14:36:14:44 | file_name | src/main.rs:20:5:20:22 | ...::read_to_string | This path depends on a $@. | src/main.rs:14:36:14:44 | file_name | user-provided value |
34
| src/main.rs:45:5:45:22 | ...::read_to_string | src/main.rs:37:11:37:19 | file_path | src/main.rs:45:5:45:22 | ...::read_to_string | This path depends on a $@. | src/main.rs:37:11:37:19 | file_path | user-provided value |
45
| src/main.rs:59:5:59:22 | ...::read_to_string | src/main.rs:50:11:50:19 | file_path | src/main.rs:59:5:59:22 | ...::read_to_string | This path depends on a $@. | src/main.rs:50:11:50:19 | file_path | user-provided value |
56
edges
@@ -9,6 +10,12 @@ edges
910
| src/main.rs:8:35:8:43 | file_name | src/main.rs:8:21:8:44 | ...::from(...) | provenance | MaD:4 |
1011
| src/main.rs:8:35:8:43 | file_name | src/main.rs:8:21:8:44 | ...::from(...) | provenance | MaD:4 |
1112
| src/main.rs:10:24:10:32 | file_path | src/main.rs:10:5:10:22 | ...::read_to_string | provenance | MaD:1 Sink:MaD:1 |
13+
| src/main.rs:14:36:14:44 | file_name | src/main.rs:19:35:19:43 | file_name | provenance | |
14+
| src/main.rs:19:9:19:17 | file_path | src/main.rs:20:24:20:32 | file_path | provenance | |
15+
| src/main.rs:19:21:19:44 | ...::from(...) | src/main.rs:19:9:19:17 | file_path | provenance | |
16+
| src/main.rs:19:35:19:43 | file_name | src/main.rs:19:21:19:44 | ...::from(...) | provenance | MaD:4 |
17+
| src/main.rs:19:35:19:43 | file_name | src/main.rs:19:21:19:44 | ...::from(...) | provenance | MaD:4 |
18+
| src/main.rs:20:24:20:32 | file_path | src/main.rs:20:5:20:22 | ...::read_to_string | provenance | MaD:1 Sink:MaD:1 |
1219
| src/main.rs:37:11:37:19 | file_path | src/main.rs:40:52:40:60 | file_path | provenance | |
1320
| src/main.rs:40:9:40:17 | file_path | src/main.rs:45:24:45:32 | file_path | provenance | |
1421
| src/main.rs:40:21:40:62 | public_path.join(...) | src/main.rs:40:9:40:17 | file_path | provenance | |
@@ -38,6 +45,12 @@ nodes
3845
| src/main.rs:8:35:8:43 | file_name | semmle.label | file_name |
3946
| src/main.rs:10:5:10:22 | ...::read_to_string | semmle.label | ...::read_to_string |
4047
| src/main.rs:10:24:10:32 | file_path | semmle.label | file_path |
48+
| src/main.rs:14:36:14:44 | file_name | semmle.label | file_name |
49+
| src/main.rs:19:9:19:17 | file_path | semmle.label | file_path |
50+
| src/main.rs:19:21:19:44 | ...::from(...) | semmle.label | ...::from(...) |
51+
| src/main.rs:19:35:19:43 | file_name | semmle.label | file_name |
52+
| src/main.rs:20:5:20:22 | ...::read_to_string | semmle.label | ...::read_to_string |
53+
| src/main.rs:20:24:20:32 | file_path | semmle.label | file_path |
4154
| src/main.rs:37:11:37:19 | file_path | semmle.label | file_path |
4255
| src/main.rs:40:9:40:17 | file_path | semmle.label | file_path |
4356
| src/main.rs:40:21:40:62 | public_path.join(...) | semmle.label | public_path.join(...) |

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@ fn tainted_path_handler_bad(
1111
}
1212

1313
//#[handler]
14-
fn tainted_path_handler_good(Query(file_name): Query<String>) -> Result<String> {
14+
fn tainted_path_handler_good(Query(file_name): Query<String>) -> Result<String> { // $ SPURIOUS: Source=remote2
1515
// GOOD: ensure that the filename has no path separators or parent directory references
1616
if file_name.contains("..") || file_name.contains("/") || file_name.contains("\\") {
1717
return Err(Error::from_status(StatusCode::BAD_REQUEST));
1818
}
1919
let file_path = PathBuf::from(file_name);
20-
fs::read_to_string(file_path).map_err(InternalServerError) // $ path-injection-sink
20+
fs::read_to_string(file_path).map_err(InternalServerError) // $ path-injection-sink SPURIOUS: Alert[rust/path-injection]=remote2
2121
}
2222

2323
//#[handler]

0 commit comments

Comments
 (0)