Modul fuzz

Pembuangan karat didukung melalui crate libfuzzer-sys, yang menyediakan binding ke mesin fuzzing libFuzzer LLVM. Untuk informasi selengkapnya, lihat repositori libfuzzer-sys serta halaman project LLVM libFuzzer.

Modul rust_fuzz menghasilkan biner fuzzer yang mulai mengalami fuzzer saat dijalankan (mirip dengan modul cc_fuzz). Saat fuzzer memanfaatkan mesin fuzzing libFuzzer, perlu sejumlah argumen untuk mengontrol fuzzing. Semua ini dienumerasi dalam dokumentasi libFuzzer.

Modul rust_fuzz adalah ekstensi dari modul rust_binary, sehingga berbagi 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 masuk target fuzz yang dipanggil oleh mesin libFuzzer. Argumen data adalah urutan byte yang disediakan oleh mesin libFuzzer untuk dimanipulasi sebagai input untuk melakukan fuzz pada fungsi yang ditargetkan.

Dalam contoh fuzzer 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 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 menyamarkan dependensi rustlib) di dalam hierarki, lihat legacy_blob_fuzzer.

Untuk panduan cara menulis fuzzer Rust yang peka struktur, lihat buku Rust Fuzz, dokumentasi resmi untuk project Rust Fuzz.