ระบบรองรับการทดสอบข้อบกพร่องแบบไม่ตั้งใจของ Rust ผ่านที่เก็บ libfuzzer-sys
ซึ่งให้การเชื่อมโยงกับเครื่องมือทดสอบข้อบกพร่องแบบไม่ตั้งใจ libFuzzer ของ LLVM ดูข้อมูลเพิ่มเติมได้ที่ที่เก็บlibfuzzer-sys และหน้าโปรเจ็กต์ LLVM libFuzzer
โมดูล rust_fuzz
จะสร้างไบนารีของโปรแกรมสร้างข้อมูลเท็จซึ่งจะเริ่มสร้างข้อมูลเท็จเมื่อเรียกใช้ (คล้ายกับโมดูล cc_fuzz
) เนื่องจากเครื่องมือสร้างข้อมูลเท็จใช้ประโยชน์จากlibFuzzer
เครื่องมือการสร้างข้อมูลเท็จ จึงใช้อาร์กิวเมนต์จํานวนหนึ่งเพื่อควบคุมการสร้างข้อมูลเท็จได้ ซึ่งระบุไว้ในเอกสารประกอบของ libFuzzer
โมดูล rust_fuzz
เป็นส่วนขยายของโมดูล rust_binary
จึงมีพร็อพเพอร์ตี้และข้อควรพิจารณาเดียวกัน นอกจากนี้ โมดูลเหล่านี้ยังใช้พร็อพเพอร์ตี้และฟังก์ชันการทำงานหลายอย่างเดียวกับโมดูล cc_fuzz
เมื่อสร้างโมดูล rust_fuzz
ระบบจะแสดง Flag --cfg fuzzing
ซึ่งสามารถใช้เพื่อรองรับการคอมไพล์แบบมีเงื่อนไขของโค้ดไลบรารีเพื่อปรับปรุงการทดสอบแบบไม่เจาะจง
เขียนโปรแกรมหาข้อบกพร่องพื้นฐานของ Rust
คุณกำหนดโมดูลการทดสอบแบบ Fuzz ในไฟล์บิลด์ Android.bp
ได้ด้วยรหัสนี้
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
มีโปรแกรมสร้างข้อมูลเท็จแบบง่าย
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();
}
});
ที่นี่ fuzz_target!(|data: &[u8]| { /* fuzz using data here */ });
จะกำหนดจุดเข้าใช้งาน fuzz-target ที่เรียกใช้โดยเครื่องมือ libFuzzer
อาร์กิวเมนต์ data
คือลำดับไบต์ที่ได้จากเครื่องมือ libFuzzer
เพื่อใช้จัดการเป็นอินพุตเพื่อสร้างความสับสนให้กับฟังก์ชันเป้าหมาย
ในตัวอย่างนี้ โปรแกรมสร้างข้อมูลเท็จจะตรวจสอบเฉพาะความยาวของข้อมูลเพื่อพิจารณาว่าจะเรียกใช้ฟังก์ชัน heap_oob
หรือไม่ ซึ่งการเรียกใช้จะส่งผลให้เกิดการอ่านที่อยู่นอกขอบเขต libFuzzer
เป็นโปรแกรมสร้างข้อมูลเท็จที่แนะนำโดยความครอบคลุม จึงมุ่งเน้นที่ความยาวที่เป็นปัญหาได้อย่างรวดเร็วเนื่องจากพิจารณาว่าข้อมูล 326 B แรกไม่ได้ส่งผลให้เกิดเส้นทางการดําเนินการใหม่
ค้นหาตัวอย่างนี้ในต้นไม้ที่ tools/security/fuzzing/example_rust_fuzzer/
หากต้องการดูตัวอย่างที่ซับซ้อนกว่าเล็กน้อยของโปรแกรมสร้างข้อมูลเท็จอีกตัวหนึ่ง (ซึ่งสร้างข้อมูลเท็จrustlib
dependency) ในต้นไม้ ให้ดู legacy_blob_fuzzer
ดูคำแนะนำเกี่ยวกับวิธีเขียนโปรแกรม Fuzzer ของ Rust ที่รับรู้โครงสร้างได้ที่หนังสือ Rust Fuzz ซึ่งเป็นเอกสารอย่างเป็นทางการสำหรับโปรเจ็กต์ Rust Fuzz