Modul bulu halus

Fuzzing karat didukung melalui peti libfuzzer-sys , yang menyediakan pengikatan ke mesin fuzzing libFuzzer LLVM. Untuk informasi lebih lanjut, lihat repositori libfuzzer-sys serta halaman proyek libFuzzer LLVM .

Modul rust_fuzz menghasilkan biner fuzzer yang mulai kabur saat dijalankan (mirip dengan modul cc_fuzz ). Karena fuzzer memanfaatkan mesin fuzzing libFuzzer , diperlukan sejumlah argumen untuk mengontrol fuzzing. Ini disebutkan dalam dokumentasi libFuzzer .

Modul rust_fuzz adalah perpanjangan dari modul rust_binary , dan dengan demikian memiliki properti dan pertimbangan yang sama. Selain itu, mereka mengimplementasikan banyak properti dan fungsionalitas yang sama seperti modul cc_fuzz .

Saat membuat modul rust_fuzz , flag --cfg fuzzing dikeluarkan yang dapat digunakan untuk mendukung kompilasi kode perpustakaan bersyarat untuk meningkatkan fuzzing.

Tulis fuzzer Rust dasar

Anda dapat mendefinisikan 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 */ }); mendefinisikan titik masuk target fuzz yang dipanggil oleh mesin libFuzzer . Argumen data adalah urutan byte yang disediakan oleh mesin libFuzzer untuk dimanipulasi sebagai masukan untuk mengaburkan fungsi yang ditargetkan.

Dalam contoh fuzzer ini, hanya panjang data yang diperiksa untuk menentukan apakah fungsi heap_oob akan dipanggil, pemanggilan tersebut akan 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, di dalam pohon, di tools/security/fuzzing/example_rust_fuzzer/ . Untuk melihat contoh yang sedikit lebih kompleks dari fuzzer lain (yang menghilangkan ketergantungan rustlib ) di dalam pohon, lihat legacy_blob_fuzzer .

Untuk panduan tentang cara menulis Rust fuzzer yang sadar struktur , lihat buku Rust Fuzz , dokumentasi resmi untuk proyek Rust Fuzz.