Fuzzing Rust didukung melalui crate libfuzzer-sys
, yang menyediakan binding ke mesin fuzzing libFuzzer LLVM. Untuk mengetahui informasi selengkapnya, lihat repositori libfuzzer-sys dan halaman project LLVM libFuzzer.
Modul rust_fuzz
menghasilkan biner fuzzer yang mulai melakukan fuzzing saat dijalankan (mirip dengan modul cc_fuzz
). Karena fuzzer memanfaatkan mesin fuzzing libFuzzer
, fuzzer dapat menggunakan sejumlah argumen untuk mengontrol fuzzing. Hal ini
dijelaskan dalam dokumentasi libFuzzer.
Modul rust_fuzz
adalah ekstensi dari modul rust_binary
, dan oleh karena itu memiliki
properti dan pertimbangan yang sama. Selain itu, mereka menerapkan banyak properti dan fungsi yang sama seperti modul cc_fuzz
.
Saat membangun modul rust_fuzz
, tanda --cfg fuzzing
akan dikeluarkan 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 fuzz-target yang dipanggil oleh mesin libFuzzer
. Argumen data
adalah
urutan byte yang disediakan oleh mesin libFuzzer
untuk dimanipulasi sebagai input
untuk mem-fuzz fungsi yang ditargetkan.
Dalam fuzzer contoh ini, hanya panjang data yang diperiksa untuk menentukan
apakah akan memanggil fungsi heap_oob
, yang pemanggilannya menghasilkan pembacaan
di luar batas. libFuzzer
adalah fuzzer yang dipandu cakupan, sehingga dengan cepat menyatu pada panjang yang bermasalah karena menentukan bahwa 326 B data pertama tidak menghasilkan jalur eksekusi baru.
Temukan contoh ini, dalam struktur direktori, di tools/security/fuzzing/example_rust_fuzzer/.
Untuk melihat contoh yang sedikit lebih kompleks dari fuzzer lain (yang mem-fuzz dependensi rustlib
) dalam struktur direktori, lihat legacy_blob_fuzzer.
Untuk mengetahui panduan tentang cara menulis fuzzers Rust yang sadar struktur, lihat buku Rust Fuzz, dokumentasi resmi untuk project Rust Fuzz.