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.