Skip to content

Commit 1d7dac4

Browse files
committed
Rust: switch the query to taint flow so that we get taint through conversions (without needing a special case).
1 parent 4a76b5b commit 1d7dac4

File tree

4 files changed

+22
-32
lines changed

4 files changed

+22
-32
lines changed

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

-14
Original file line numberDiff line numberDiff line change
@@ -46,20 +46,6 @@ module AccessInvalidPointer {
4646
ModelsAsDataSource() { sourceNode(this, "pointer-invalidate") }
4747
}
4848

49-
/**
50-
* A pointer invalidation from an argument of a modeled call (this is a workaround).
51-
*/
52-
private class ModelsAsDataArgumentSource extends Source {
53-
ModelsAsDataArgumentSource() {
54-
exists(DataFlow::Node n, CallExpr ce, Expr arg |
55-
sourceNode(n, "pointer-invalidate") and
56-
n.(FlowSummaryNode).getSourceElement() = ce.getFunction() and
57-
arg = ce.getArgList().getAnArg() and
58-
this.asExpr().getExpr().getParentNode+() = arg
59-
)
60-
}
61-
}
62-
6349
/**
6450
* A pointer access using the unary `*` operator.
6551
*/

rust/ql/src/queries/security/CWE-825/AccessInvalidPointer.ql

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
import rust
1616
import codeql.rust.dataflow.DataFlow
17+
import codeql.rust.dataflow.TaintTracking
1718
import codeql.rust.security.AccessInvalidPointerExtensions
1819
import AccessInvalidPointerFlow::PathGraph
1920

@@ -33,7 +34,7 @@ module AccessInvalidPointerConfig implements DataFlow::ConfigSig {
3334
}
3435
}
3536

36-
module AccessInvalidPointerFlow = DataFlow::Global<AccessInvalidPointerConfig>;
37+
module AccessInvalidPointerFlow = TaintTracking::Global<AccessInvalidPointerConfig>;
3738

3839
from AccessInvalidPointerFlow::PathNode sourceNode, AccessInvalidPointerFlow::PathNode sinkNode
3940
where AccessInvalidPointerFlow::flowPath(sourceNode, sinkNode)

rust/ql/test/query-tests/security/CWE-825/AccessInvalidPointer.expected

+19-16
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,16 @@
33
| deallocation.rs:37:14:37:33 | ...::read::<...> | deallocation.rs:20:3:20:21 | ...::dealloc | deallocation.rs:37:14:37:33 | ...::read::<...> | This operation dereferences a pointer that may be $@. | deallocation.rs:20:3:20:21 | ...::dealloc | invalid |
44
| deallocation.rs:44:6:44:7 | m1 | deallocation.rs:20:3:20:21 | ...::dealloc | deallocation.rs:44:6:44:7 | m1 | This operation dereferences a pointer that may be $@. | deallocation.rs:20:3:20:21 | ...::dealloc | invalid |
55
| deallocation.rs:49:5:49:25 | ...::write::<...> | deallocation.rs:20:3:20:21 | ...::dealloc | deallocation.rs:49:5:49:25 | ...::write::<...> | This operation dereferences a pointer that may be $@. | deallocation.rs:20:3:20:21 | ...::dealloc | invalid |
6-
| deallocation.rs:76:16:76:17 | m2 | deallocation.rs:70:23:70:24 | m2 | deallocation.rs:76:16:76:17 | m2 | This operation dereferences a pointer that may be $@. | deallocation.rs:70:23:70:24 | m2 | invalid |
7-
| deallocation.rs:81:16:81:17 | m2 | deallocation.rs:70:23:70:24 | m2 | deallocation.rs:81:16:81:17 | m2 | This operation dereferences a pointer that may be $@. | deallocation.rs:70:23:70:24 | m2 | invalid |
8-
| deallocation.rs:86:7:86:8 | m2 | deallocation.rs:70:23:70:24 | m2 | deallocation.rs:86:7:86:8 | m2 | This operation dereferences a pointer that may be $@. | deallocation.rs:70:23:70:24 | m2 | invalid |
9-
| deallocation.rs:90:7:90:8 | m2 | deallocation.rs:70:23:70:24 | m2 | deallocation.rs:90:7:90:8 | m2 | This operation dereferences a pointer that may be $@. | deallocation.rs:70:23:70:24 | m2 | invalid |
10-
| deallocation.rs:95:5:95:31 | ...::write::<...> | deallocation.rs:70:23:70:24 | m2 | deallocation.rs:95:5:95:31 | ...::write::<...> | This operation dereferences a pointer that may be $@. | deallocation.rs:70:23:70:24 | m2 | invalid |
11-
| deallocation.rs:115:13:115:18 | my_ptr | deallocation.rs:112:14:112:19 | my_ptr | deallocation.rs:115:13:115:18 | my_ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:112:14:112:19 | my_ptr | invalid |
6+
| deallocation.rs:76:16:76:17 | m2 | deallocation.rs:70:3:70:21 | ...::dealloc | deallocation.rs:76:16:76:17 | m2 | This operation dereferences a pointer that may be $@. | deallocation.rs:70:3:70:21 | ...::dealloc | invalid |
7+
| deallocation.rs:81:16:81:17 | m2 | deallocation.rs:70:3:70:21 | ...::dealloc | deallocation.rs:81:16:81:17 | m2 | This operation dereferences a pointer that may be $@. | deallocation.rs:70:3:70:21 | ...::dealloc | invalid |
8+
| deallocation.rs:86:7:86:8 | m2 | deallocation.rs:70:3:70:21 | ...::dealloc | deallocation.rs:86:7:86:8 | m2 | This operation dereferences a pointer that may be $@. | deallocation.rs:70:3:70:21 | ...::dealloc | invalid |
9+
| deallocation.rs:90:7:90:8 | m2 | deallocation.rs:70:3:70:21 | ...::dealloc | deallocation.rs:90:7:90:8 | m2 | This operation dereferences a pointer that may be $@. | deallocation.rs:70:3:70:21 | ...::dealloc | invalid |
10+
| deallocation.rs:95:5:95:31 | ...::write::<...> | deallocation.rs:70:3:70:21 | ...::dealloc | deallocation.rs:95:5:95:31 | ...::write::<...> | This operation dereferences a pointer that may be $@. | deallocation.rs:70:3:70:21 | ...::dealloc | invalid |
11+
| deallocation.rs:115:13:115:18 | my_ptr | deallocation.rs:112:3:112:12 | ...::free | deallocation.rs:115:13:115:18 | my_ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:112:3:112:12 | ...::free | invalid |
1212
| deallocation.rs:130:14:130:15 | p1 | deallocation.rs:123:23:123:40 | ...::dangling | deallocation.rs:130:14:130:15 | p1 | This operation dereferences a pointer that may be $@. | deallocation.rs:123:23:123:40 | ...::dangling | invalid |
1313
| deallocation.rs:131:14:131:15 | p2 | deallocation.rs:124:21:124:42 | ...::dangling_mut | deallocation.rs:131:14:131:15 | p2 | This operation dereferences a pointer that may be $@. | deallocation.rs:124:21:124:42 | ...::dangling_mut | invalid |
1414
| deallocation.rs:132:14:132:15 | p3 | deallocation.rs:125:23:125:36 | ...::null | deallocation.rs:132:14:132:15 | p3 | This operation dereferences a pointer that may be $@. | deallocation.rs:125:23:125:36 | ...::null | invalid |
1515
| deallocation.rs:180:15:180:16 | p1 | deallocation.rs:176:3:176:25 | ...::drop_in_place | deallocation.rs:180:15:180:16 | p1 | This operation dereferences a pointer that may be $@. | deallocation.rs:176:3:176:25 | ...::drop_in_place | invalid |
16-
| deallocation.rs:189:29:189:30 | p3 | deallocation.rs:189:29:189:30 | p3 | deallocation.rs:189:29:189:30 | p3 | This operation dereferences a pointer that may be $@. | deallocation.rs:189:29:189:30 | p3 | invalid |
1716
| deallocation.rs:248:18:248:20 | ptr | deallocation.rs:242:3:242:25 | ...::drop_in_place | deallocation.rs:248:18:248:20 | ptr | This operation dereferences a pointer that may be $@. | deallocation.rs:242:3:242:25 | ...::drop_in_place | invalid |
1817
edges
1918
| deallocation.rs:20:3:20:21 | ...::dealloc | deallocation.rs:20:23:20:24 | [post] m1 | provenance | Src:MaD:3 MaD:3 |
@@ -23,13 +22,15 @@ edges
2322
| deallocation.rs:20:23:20:24 | [post] m1 | deallocation.rs:49:27:49:28 | m1 | provenance | |
2423
| deallocation.rs:37:35:37:36 | m1 | deallocation.rs:37:14:37:33 | ...::read::<...> | provenance | MaD:1 Sink:MaD:1 |
2524
| deallocation.rs:49:27:49:28 | m1 | deallocation.rs:49:5:49:25 | ...::write::<...> | provenance | MaD:2 Sink:MaD:2 |
26-
| deallocation.rs:70:23:70:24 | m2 | deallocation.rs:76:16:76:17 | m2 | provenance | |
27-
| deallocation.rs:70:23:70:24 | m2 | deallocation.rs:81:16:81:17 | m2 | provenance | |
28-
| deallocation.rs:70:23:70:24 | m2 | deallocation.rs:86:7:86:8 | m2 | provenance | |
29-
| deallocation.rs:70:23:70:24 | m2 | deallocation.rs:90:7:90:8 | m2 | provenance | |
30-
| deallocation.rs:70:23:70:24 | m2 | deallocation.rs:95:33:95:34 | m2 | provenance | |
25+
| deallocation.rs:70:3:70:21 | ...::dealloc | deallocation.rs:70:23:70:35 | [post] m2 as ... | provenance | Src:MaD:3 MaD:3 |
26+
| deallocation.rs:70:23:70:35 | [post] m2 as ... | deallocation.rs:76:16:76:17 | m2 | provenance | |
27+
| deallocation.rs:70:23:70:35 | [post] m2 as ... | deallocation.rs:81:16:81:17 | m2 | provenance | |
28+
| deallocation.rs:70:23:70:35 | [post] m2 as ... | deallocation.rs:86:7:86:8 | m2 | provenance | |
29+
| deallocation.rs:70:23:70:35 | [post] m2 as ... | deallocation.rs:90:7:90:8 | m2 | provenance | |
30+
| deallocation.rs:70:23:70:35 | [post] m2 as ... | deallocation.rs:95:33:95:34 | m2 | provenance | |
3131
| deallocation.rs:95:33:95:34 | m2 | deallocation.rs:95:5:95:31 | ...::write::<...> | provenance | MaD:2 Sink:MaD:2 |
32-
| deallocation.rs:112:14:112:19 | my_ptr | deallocation.rs:115:13:115:18 | my_ptr | provenance | |
32+
| deallocation.rs:112:3:112:12 | ...::free | deallocation.rs:112:14:112:40 | [post] my_ptr as ... | provenance | Src:MaD:8 MaD:8 |
33+
| deallocation.rs:112:14:112:40 | [post] my_ptr as ... | deallocation.rs:115:13:115:18 | my_ptr | provenance | |
3334
| deallocation.rs:123:6:123:7 | p1 | deallocation.rs:130:14:130:15 | p1 | provenance | |
3435
| deallocation.rs:123:23:123:40 | ...::dangling | deallocation.rs:123:23:123:42 | ...::dangling(...) | provenance | Src:MaD:4 MaD:4 |
3536
| deallocation.rs:123:23:123:42 | ...::dangling(...) | deallocation.rs:123:6:123:7 | p1 | provenance | |
@@ -51,6 +52,7 @@ models
5152
| 5 | Source: lang:core; crate::ptr::dangling_mut; pointer-invalidate; ReturnValue |
5253
| 6 | Source: lang:core; crate::ptr::drop_in_place; pointer-invalidate; Argument[0] |
5354
| 7 | Source: lang:core; crate::ptr::null; pointer-invalidate; ReturnValue |
55+
| 8 | Source: repo:https://github.com/rust-lang/libc:libc; ::free; pointer-invalidate; Argument[0] |
5456
nodes
5557
| deallocation.rs:20:3:20:21 | ...::dealloc | semmle.label | ...::dealloc |
5658
| deallocation.rs:20:23:20:24 | [post] m1 | semmle.label | [post] m1 |
@@ -60,14 +62,16 @@ nodes
6062
| deallocation.rs:44:6:44:7 | m1 | semmle.label | m1 |
6163
| deallocation.rs:49:5:49:25 | ...::write::<...> | semmle.label | ...::write::<...> |
6264
| deallocation.rs:49:27:49:28 | m1 | semmle.label | m1 |
63-
| deallocation.rs:70:23:70:24 | m2 | semmle.label | m2 |
65+
| deallocation.rs:70:3:70:21 | ...::dealloc | semmle.label | ...::dealloc |
66+
| deallocation.rs:70:23:70:35 | [post] m2 as ... | semmle.label | [post] m2 as ... |
6467
| deallocation.rs:76:16:76:17 | m2 | semmle.label | m2 |
6568
| deallocation.rs:81:16:81:17 | m2 | semmle.label | m2 |
6669
| deallocation.rs:86:7:86:8 | m2 | semmle.label | m2 |
6770
| deallocation.rs:90:7:90:8 | m2 | semmle.label | m2 |
6871
| deallocation.rs:95:5:95:31 | ...::write::<...> | semmle.label | ...::write::<...> |
6972
| deallocation.rs:95:33:95:34 | m2 | semmle.label | m2 |
70-
| deallocation.rs:112:14:112:19 | my_ptr | semmle.label | my_ptr |
73+
| deallocation.rs:112:3:112:12 | ...::free | semmle.label | ...::free |
74+
| deallocation.rs:112:14:112:40 | [post] my_ptr as ... | semmle.label | [post] my_ptr as ... |
7175
| deallocation.rs:115:13:115:18 | my_ptr | semmle.label | my_ptr |
7276
| deallocation.rs:123:6:123:7 | p1 | semmle.label | p1 |
7377
| deallocation.rs:123:23:123:40 | ...::dangling | semmle.label | ...::dangling |
@@ -84,7 +88,6 @@ nodes
8488
| deallocation.rs:176:3:176:25 | ...::drop_in_place | semmle.label | ...::drop_in_place |
8589
| deallocation.rs:176:27:176:28 | [post] p1 | semmle.label | [post] p1 |
8690
| deallocation.rs:180:15:180:16 | p1 | semmle.label | p1 |
87-
| deallocation.rs:189:29:189:30 | p3 | semmle.label | p3 |
8891
| deallocation.rs:242:3:242:25 | ...::drop_in_place | semmle.label | ...::drop_in_place |
8992
| deallocation.rs:242:27:242:29 | [post] ptr | semmle.label | [post] ptr |
9093
| deallocation.rs:248:18:248:20 | ptr | semmle.label | ptr |

rust/ql/test/query-tests/security/CWE-825/deallocation.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ pub fn test_ptr_drop(mode: i32) {
186186
}
187187

188188
let p3 = std::alloc::alloc(layout) as *mut Vec<i64>;
189-
std::ptr::drop_in_place((*p3).as_mut_ptr()); // $ SPURIOUS: Alert[rust/access-invalid-pointer]
189+
std::ptr::drop_in_place((*p3).as_mut_ptr()); // GOOD
190190
}
191191
}
192192

0 commit comments

Comments
 (0)