Fuzzing Rust didukung melalui crate libfuzzer-sys
, yang menyediakan
binding ke mesin fuzzing libFuzzer LLVM. Untuk informasi selengkapnya, lihat repositori libfuzzer-sys
serta halaman project libFuzzer LLVM.
Modul rust_fuzz
menghasilkan biner fuzzer yang memulai fuzzing saat
berjalan (mirip dengan modul cc_fuzz
). Karena fuzzer memanfaatkan mesin fuzzing
libFuzzer
, fuzzer dapat memerlukan sejumlah argumen untuk mengontrol fuzzing. Hal ini
dienumerasikan dalam dokumentasi libFuzzer.
Modul rust_fuzz
adalah ekstensi dari modul rust_binary
, sehingga memiliki
properti dan pertimbangan yang sama. Selain itu, keduanya menerapkan banyak
properti dan fungsi yang sama seperti modul cc_fuzz
.
Saat mem-build modul rust_fuzz
, flag --cfg fuzzing
akan ditampilkan yang dapat
digunakan untuk mendukung kompilasi bersyarat kode library guna meningkatkan fuzzing.
Menulis fuzzer Rust dasar
Anda dapat menentukan modul fuzz dalam file build Android.bp
dengan kode ini:
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",
}
File fuzzer.rs
berisi fuzzer sederhana:
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();
}
});
Di sini, fuzz_target!(|data: &[u8]| { /* fuzz using data here */ });
menentukan titik entri target fuzz yang dipanggil oleh mesin libFuzzer
. Argumen data
adalah
urutan byte yang disediakan oleh mesin libFuzzer
untuk dimanipulasi sebagai input
untuk melakukan fuzzing pada fungsi yang ditargetkan.
Dalam contoh fuzzer ini, hanya panjang data yang diperiksa untuk menentukan
apakah akan memanggil fungsi heap_oob
, yang pemanggilan-nya menghasilkan
pembacaan di luar batas. libFuzzer
adalah fuzzer yang dipandu cakupan, sehingga dengan cepat berkonvergensi pada
panjang yang bermasalah karena menentukan bahwa data 326 B pertama tidak
menghasilkan jalur eksekusi baru.
Temukan contoh ini, dalam hierarki, di tools/security/fuzzing/example_rust_fuzzer/.
Untuk melihat contoh fuzzer lain yang sedikit lebih kompleks (yang melakukan fuzzing pada dependensi
rustlib
) dalam hierarki, lihat legacy_blob_fuzzer.
Untuk panduan tentang cara menulis fuzzer Rust yang memahami struktur, lihat buku Rust Fuzz, dokumentasi resmi untuk project Rust Fuzz.