Fuzz modülleri

Rust fuzzing, LLVM'nin libFuzzer fuzzing motoruna bağlamalar 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 bulanıklaştırma işlemine başlayan bir bulanıklaştırma ikilisi üretir (cc_fuzz modüllerine benzer şekilde). Fuzzer, libFuzzer fuzzing motorundan yararlandığı için fuzzing'i kontrol etmek için çeşitli argümanlar alabilir. Bunlar libFuzzer belgelerinde listelenmiştir.

rust_fuzz modülleri, rust_binary modüllerinin bir uzantısıdır ve bu nedenle aynı özelliklere ve hususlara sahiptir. Ayrıca, cc_fuzz modüllerinde kullanılan özelliklerin ve işlevlerin birçoğu bu modüllerde de kullanılır.

rust_fuzz modülleri oluşturulurken --cfg fuzzing işareti yayınlanır. Bu işaret, kitaplık kodunun koşullu derlenmesini desteklemek ve bulanıklaştırmayı iyileştirmek için kullanılabilir.

Temel bir Rust fuzzer'ı yazma

Aşağıdaki kodu kullanarak Android.bp derleme dosyasında bir fuzz modülü 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çeriyor:

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

Burada fuzz_target!(|data: &[u8]| { /* fuzz using data here */ });, libFuzzer motoru tarafından çağrılan fuzz-target giriş noktasını tanımlar. data bağımsız değişkeni, hedeflenen işlevi bulanıklaştırmak için giriş olarak işlenecek libFuzzer motoru tarafından sağlanan bir bayt dizisidir.

Bu örnekte, heap_oob işlevinin çağrılıp çağrılmayacağını belirlemek için yalnızca verilerin uzunluğu kontrol edilir. Bu işlevin çağrılması, sınırların dışında okumaya neden olur. libFuzzer, kapsama alanına göre yönlendirilen bir bulanıklaştırma aracıdır. Bu nedenle, verilerin ilk 326 baytının yeni yürütme yolları oluşturmadığını belirlediği için sorunlu uzunlukta hızlı bir şekilde birleşir.

Bu örneği ağaç içi olarak tools/security/fuzzing/example_rust_fuzzer/ konumunda bulabilirsiniz. Ağaç içi başka bir fuzzer'ın (rustlib bağımlılığını bulanıklaştırır) biraz daha karmaşık bir örneğini görmek için legacy_blob_fuzzer'a bakın.

Yapıdan haberdar Rust fuzzers'ı yazma ile ilgili rehberlik için Rust Fuzz projesinin resmi belgeleri olan Rust Fuzz kitabına bakın.