מודולי Fuzz

פיזור חלודה נתמך דרך ארגז libfuzzer-sys , המספק כריכות למנוע ה-fuzzer libFuzzer של LLVM. למידע נוסף, עיין במאגר libfuzzer-sys וכן בדף הפרויקט של LLVM libFuzzer .

מודול rust_fuzz מייצר בינארי fuzzer שמתחיל לטשטש כאשר הוא מופעל (בדומה למודולי cc_fuzz ). מכיוון שה-fuzzer ממנף את מנוע ה-fuzzer libFuzzer , זה יכול לקחת מספר טיעונים כדי לשלוט ב-fuzzer. אלה רשומים בתיעוד libFuzzer .

מודולי rust_fuzz הם הרחבה של מודולי rust_binary , וככאלה חולקים את אותם מאפיינים ושיקולים. בנוסף, הם מיישמים רבים מאותם מאפיינים ופונקציונליות כמו מודולי cc_fuzz .

בעת בניית מודולי rust_fuzz , נפלט דגל ה- --cfg fuzzing אשר ניתן להשתמש בו כדי לתמוך בהידור מותנה של קוד הספרייה כדי לשפר את ה-fuzzing.

כתוב פוזר חלודה בסיסי

אתה יכול להגדיר מודול fuzz בקובץ Android.bp build עם הקוד הזה:

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

Here fuzz_target!(|data: &[u8]| { /* fuzz using data here */ }); מגדיר את נקודת הכניסה ל-fuzz-target שנקראת על ידי מנוע libFuzzer . ארגומנט data הוא רצף של בתים שסופק על ידי מנוע libFuzzer לעיבוד כקלט כדי לטשטש את הפונקציה הממוקדת.

ב-fuzzer לדוגמה זה, רק אורך הנתונים נבדק כדי לקבוע אם לקרוא לפונקציה heap_oob , שהקריאה שלה גורמת לקריאה מחוץ לתחום. libFuzzer הוא fuzzer מונחה כיסוי, כך שהוא מתכנס במהירות לאורך הבעייתי מכיוון שהוא קובע ש-326 B הראשונים של הנתונים אינם מביאים לנתיבי ביצוע חדשים.

אתר את הדוגמה הזו, בתוך העץ, ב- tools/security/fuzzing/example_rust_fuzzer/ . כדי להציג דוגמה קצת יותר מורכבת של fuzzer אחר (שמבלבל תלות rustlib ) בתוך העץ, ראה את legacy_blob_fuzzer .

לקבלת הדרכה כיצד לכתוב חומרי חלודה בעלי מודעות למבנה , עיין בספר Rust Fuzz , התיעוד הרשמי של פרויקט Rust Fuzz.