โมดูล Fuzz

การฟอกสนิมทำได้ผ่านลัง libfuzzer-sys ซึ่งจะเชื่อมโยงกับเครื่องมือฟองสนิมของ libFuzzer ของ LLVM ดูข้อมูลเพิ่มเติมได้ที่ที่เก็บ libfuzzer-sys และหน้าโปรเจ็กต์ LLVM libFuzzer

โมดูล rust_fuzz จะสร้างไบนารีของ Fuzzer ซึ่งจะเริ่มทำความแปรปรวนเมื่อเรียกใช้ (คล้ายกับโมดูล cc_fuzz) เนื่องจากเครื่องมือสร้างข้อมูลเท็จใช้ประโยชน์จากlibFuzzer เครื่องมือการสร้างข้อมูลเท็จ จึงใช้อาร์กิวเมนต์จํานวนหนึ่งเพื่อควบคุมการสร้างข้อมูลเท็จได้ ซึ่งมีการแจกแจงอยู่ในเอกสารประกอบของ libFuzzer

โมดูล rust_fuzz เป็นส่วนขยายของ rust_binary โมดูล จึงมีพร็อพเพอร์ตี้และข้อควรพิจารณาเดียวกัน นอกจากนี้ยังใช้พร็อพเพอร์ตี้และฟังก์ชันการทำงานต่างๆ แบบเดียวกับโมดูล cc_fuzz ด้วย

เมื่อสร้างโมดูล rust_fuzz จะมีการแฟล็ก --cfg fuzzing ซึ่งสามารถใช้เพื่อรองรับการคอมไพล์โค้ดไลบรารีแบบมีเงื่อนไขเพื่อปรับปรุงการกระจาย

เขียนโปรแกรม Rust fuzzer พื้นฐาน

คุณกำหนดโมดูล 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 มี Fuzzer พื้นฐาน:

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 ที่เรียกใช้โดยเครื่องมือ libFuzzer อาร์กิวเมนต์ data เป็นลำดับของไบต์ที่ได้จากเครื่องมือ libFuzzer ที่จะจัดการเป็นอินพุตเพื่อทำให้ฟังก์ชันเป้าหมายสับสน

ใน Fuzzer ตัวอย่างนี้ จะมีการตรวจสอบเฉพาะความยาวของข้อมูลเพื่อตัดสินว่าจะเรียกใช้ฟังก์ชัน heap_oob หรือไม่ ซึ่งเป็นการเรียกที่ส่งผลให้เกิดการอ่านนอกขอบเขต libFuzzer เป็นโปรแกรมสร้างข้อมูลเท็จที่แนะนำโดยความครอบคลุม จึงมุ่งเน้นที่ความยาวที่เป็นปัญหาได้อย่างรวดเร็วเนื่องจากพิจารณาว่าข้อมูล 326 B แรกไม่ได้ส่งผลให้เกิดเส้นทางการดําเนินการใหม่

ค้นหาตัวอย่างนี้ในแผนผังที่ tools/security/fuzzing/example_rust_fuzzer/ หากต้องการดูตัวอย่างที่ซับซ้อนขึ้นเล็กน้อยของ Fuzzer อื่น (ซึ่งทำให้การขึ้นต่อกันของ rustlib) ในแผนผัง โปรดดู legacy_blob_fuzzer

ดูคำแนะนำเกี่ยวกับวิธีเขียนโปรแกรม Fuzzer ของ Rust ที่คำนึงถึงโครงสร้างได้ที่หนังสือ Rust Fuzz ซึ่งเป็นเอกสารอย่างเป็นทางการสำหรับโปรเจ็กต์ Rust Fuzz