Fuzz modülleri

Pas fuzzing, LLVM'nin libFuzzer fuzzing motoruna bağlanma sağlayan libfuzzer-sys sandığı aracılığıyla desteklenir. Daha fazla bilgi için libfuzzer-sys deposunun yanı sıra LLVM libFuzzer proje sayfasına bakın.

rust_fuzz modülü, çalıştırıldığında fuzzing'e başlayan bir fuzzer ikili dosyası üretir ( cc_fuzz modüllerine benzer). Fuzzer, libFuzzer fuzzing motorunu kullandığından, fuzzing'i kontrol etmek için bir takım argümanlar gerekebilir. Bunlar libFuzzer belgelerinde sıralanmıştır.

rust_fuzz modülleri, rust_binary modüllerinin bir uzantısıdır ve bu nedenle aynı özellikleri ve hususları paylaşırlar. Ek olarak, cc_fuzz modülleriyle aynı özellik ve işlevlerin çoğunu uygularlar.

rust_fuzz modülleri oluştururken, --cfg fuzzing bayrağı yayılır ve bu, fuzzing'i iyileştirmek amacıyla kütüphane kodunun koşullu derlenmesini desteklemek için kullanılabilir.

Temel bir Rust fuzzer yazın

Bir Android.bp derleme dosyasında bir fuzz modülünü şu kodla tanımlayabilirsiniz:

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",
}

fuzzer.rs dosyası basit bir fuzzer içerir:

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();
    }
});

İşte fuzz_target!(|data: &[u8]| { /* fuzz using data here */ }); libFuzzer motoru tarafından çağrılan fuzz-hedefi giriş noktasını tanımlar. data argümanı, libFuzzer motoru tarafından hedeflenen fonksiyonun bulanıklaştırılması için girdi olarak değiştirilmek üzere sağlanan bir bayt dizisidir.

Bu örnek fuzzer'da, heap_oob işlevinin çağrılıp çağrılmayacağına karar vermek için yalnızca verinin uzunluğu kontrol edilir; bu işlevin çağrılması, sınırların dışında bir okumayla sonuçlanır. libFuzzer kapsama yönlendirmeli bir fuzzerdır, bu nedenle ilk 326 B verisinin yeni yürütme yollarıyla sonuçlanmadığını belirlediğinden sorunlu uzunluğa hızla yaklaşır.

Bu örneği ağaç içinde, Tools/security/fuzzing/example_rust_fuzzer/ konumunda bulun. Ağaçtaki başka bir fuzzer'ın ( rustlib bağımlılığını ortadan kaldıran) biraz daha karmaşık bir örneğini görüntülemek için, Legacy_blob_fuzzer'a bakın.

Yapıya duyarlı Rust fuzzer'ların nasıl yazılacağına dair rehberlik için Rust Fuzz projesinin resmi belgeleri olan Rust Fuzz kitabına bakın.