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.