وحدات الزغب

يتم دعم تقنية Rust Fuzzing من خلال صندوق libfuzzer-sys ، الذي يوفر روابط لمحرك libFuzzer الخاص بـ LLVM. لمزيد من المعلومات، راجع مستودع libfuzzer-sys بالإضافة إلى صفحة مشروع LLVM libFuzzer .

تُنتج وحدة rust_fuzz ثنائيًا غامضًا يبدأ بالتشويش عند تشغيله (على غرار وحدات cc_fuzz ). نظرًا لأن التشويش يستفيد من محرك التشويش libFuzzer ، فقد يستغرق الأمر عددًا من الوسائط للتحكم في التشويش. تم تعدادها في وثائق libFuzzer .

وحدات rust_fuzz هي امتداد لوحدات rust_binary ، وبالتالي تشترك في نفس الخصائص والاعتبارات. بالإضافة إلى ذلك، فإنها تطبق العديد من الخصائص والوظائف نفسها التي تقوم بها وحدات cc_fuzz .

عند إنشاء وحدات rust_fuzz ، يتم إصدار علامة --cfg fuzzing والتي يمكن استخدامها لدعم التجميع الشرطي لرمز المكتبة لتحسين التشويش.

اكتب ضبابية الصدأ الأساسية

يمكنك تحديد وحدة 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 */ }); يحدد نقطة الدخول لهدف الزغب التي يستدعيها محرك libFuzzer . وسيطة data عبارة عن سلسلة من البايتات التي يوفرها محرك libFuzzer ليتم معالجتها كمدخل لتضليل الوظيفة المستهدفة.

في هذا المثال، يتم التحقق من طول البيانات فقط لتحديد ما إذا كان سيتم استدعاء وظيفة heap_oob ، والتي يؤدي استدعاءها إلى قراءة خارج الحدود. libFuzzer عبارة عن ضبابية موجهة بالتغطية، لذا فهي تتقارب بسرعة مع الطول الإشكالي لأنها تحدد أن أول 326 بايت من البيانات لا تؤدي إلى مسارات تنفيذ جديدة.

حدد موقع هذا المثال، داخل الشجرة، في Tools/security/fuzzing/example_rust_fuzzer/ . لعرض مثال أكثر تعقيدًا قليلًا لأداة Fuzzer أخرى (والتي تعمل على تشويش تبعية rustlib ) داخل الشجرة، راجع Legacy_blob_fuzzer .

للحصول على إرشادات حول كيفية كتابة Rust Fuzzers التي تراعي البنية ، راجع كتاب Rust Fuzz ، الوثائق الرسمية لمشروع Rust Fuzz.