Tính năng kiểm thử mờ trong Rust được hỗ trợ thông qua thùng libfuzzer-sys, cung cấp các liên kết đến công cụ kiểm thử mờ libFuzzer của LLVM. Để biết thêm thông tin, hãy xem kho lưu trữ libfuzzer-sys
cũng như trang dự án LLVM libFuzzer.
Mô-đun rust_fuzz tạo ra một tệp nhị phân kiểm thử mờ bắt đầu kiểm thử mờ khi chạy (tương tự như mô-đun cc_fuzz). Vì công cụ kiểm thử mờ tận dụng công cụ kiểm thử mờ libFuzzer, nên công cụ này có thể nhận một số đối số để kiểm soát việc kiểm thử mờ. Các đối số này được
liệt kê trong tài liệu libFuzzer.
Mô-đun rust_fuzz là phần mở rộng của mô-đun rust_binary và do đó, có cùng các thuộc tính và điểm cần cân nhắc. Ngoài ra, các mô-đun này triển khai nhiều thuộc tính và chức năng giống như mô-đun cc_fuzz.
Khi tạo mô-đun rust_fuzz, cờ --cfg fuzzing sẽ được phát ra. Cờ này có thể dùng để hỗ trợ quá trình biên dịch có điều kiện của mã thư viện nhằm cải thiện việc kiểm thử mờ.
Viết công cụ kiểm thử mờ cơ bản trong Rust
Bạn có thể xác định một mô-đun kiểm thử mờ trong tệp bản dựng Android.bp bằng mã này:
rust_fuzz {
name: "example_rust_fuzzer",
srcs: ["fuzzer.rs"],
// Config for running the target on fuzzing infrastructure can be set under
// fuzz_config. This shares the same properties as cc_fuzz's fuzz_config.
fuzz_config: {
fuzz_on_haiku_device: true,
fuzz_on_haiku_host: false,
},
// Path to a corpus of sample inputs, optional. See https://llvm.org/docs/LibFuzzer.html#corpus
corpus: ["testdata/*"],
// Path to a dictionary of sample byte sequences, optional. See https://llvm.org/docs/LibFuzzer.html#dictionaries
dictionary: "example_rust_fuzzer.dict",
}
Tệp fuzzer.rs chứa một công cụ kiểm thử mờ đơn giản:
fn heap_oob() {
let xs = vec![0, 1, 2, 3];
let val = unsafe { *xs.as_ptr().offset(4) };
println!("Out-of-bounds heap value: {}", val);
}
fuzz_target!(|data: &[u8]| {
let magic_number = 327;
if data.len() == magic_number {
heap_oob();
}
});
Ở đây, fuzz_target!(|data: &[u8]| { /* fuzz using data here */ }); xác định điểm nhập fuzz-target được công cụ libFuzzer gọi. Đối số data là một chuỗi byte do công cụ libFuzzer cung cấp để thao tác làm dữ liệu đầu vào nhằm kiểm thử mờ hàm được nhắm mục tiêu.
Trong công cụ kiểm thử mờ ví dụ này, chỉ có độ dài của dữ liệu được kiểm tra để xác định xem có gọi hàm heap_oob hay không. Việc gọi hàm này sẽ dẫn đến việc đọc ngoài phạm vi. libFuzzer là một công cụ kiểm thử mờ có hướng dẫn về phạm vi kiểm thử, vì vậy, công cụ này nhanh chóng hội tụ vào độ dài có vấn đề khi xác định rằng 326 B dữ liệu đầu tiên không dẫn đến các đường dẫn thực thi mới.
Tìm ví dụ này trong cây tại tools/security/fuzzing/example_rust_fuzzer/.
Để xem một ví dụ phức tạp hơn một chút về một công cụ kiểm thử mờ khác (kiểm thử mờ một rustlib
phần phụ thuộc) trong cây, hãy xem legacy_blob_fuzzer.
Để được hướng dẫn về cách viết công cụ kiểm thử mờ Rust có nhận biết cấu trúc, hãy xem Sách về kiểm thử mờ trong Rust, tài liệu chính thức cho dự án Kiểm thử mờ trong Rust.