ফাজ মডিউল

মরিচা ফাজিং libfuzzer-sys ক্রেটের মাধ্যমে সমর্থিত, যা LLVM-এর libFuzer fuzzing ইঞ্জিনে বাইন্ডিং প্রদান করে। আরও তথ্যের জন্য, libfuzzer-sys সংগ্রহস্থলের পাশাপাশি LLVM libFuzzer প্রকল্প পৃষ্ঠা দেখুন।

rust_fuzz মডিউলটি একটি fuzzer বাইনারি তৈরি করে যা এটি চালানোর সময় অস্পষ্ট হতে শুরু করে ( cc_fuzz মডিউলের মতো)। যেহেতু fuzzer libFuzzer fuzzing ইঞ্জিন ব্যবহার করে, এটি fuzzing নিয়ন্ত্রণ করতে বেশ কিছু আর্গুমেন্ট নিতে পারে। এগুলি libFuzer ডকুমেন্টেশনে গণনা করা হয়েছে।

rust_fuzz মডিউল হল rust_binary মডিউলগুলির একটি এক্সটেনশন, এবং একই বৈশিষ্ট্য এবং বিবেচনাগুলি ভাগ করে নেয়। অতিরিক্তভাবে, তারা cc_fuzz মডিউলগুলির মতো একই বৈশিষ্ট্য এবং কার্যকারিতা প্রয়োগ করে।

rust_fuzz মডিউল তৈরি করার সময়, --cfg fuzzing পতাকা নির্গত হয় যা ফাজিং উন্নত করতে লাইব্রেরি কোডের শর্তসাপেক্ষ সংকলন সমর্থন করতে ব্যবহার করা যেতে পারে।

একটি মৌলিক মরিচা ফুজার লিখুন

আপনি এই কোড সহ একটি 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 ইঞ্জিন দ্বারা প্রদত্ত বাইটগুলির একটি ক্রম যা লক্ষ্যযুক্ত ফাংশনটি ফাজ করার জন্য ইনপুট হিসাবে ম্যানিপুলেট করা হয়।

এই উদাহরণ fuzzer-এ, heap_oob ফাংশন কল করতে হবে কিনা তা নির্ধারণ করতে শুধুমাত্র ডেটার দৈর্ঘ্য পরীক্ষা করা হয়, যার কলিংয়ের ফলে একটি সীমার বাইরে পড়া হয়। libFuzzer হল একটি কভারেজ-নির্দেশিত fuzzer, তাই এটি সমস্যাযুক্ত দৈর্ঘ্যে দ্রুত একত্রিত হয় কারণ এটি নির্ধারণ করে যে প্রথম 326 B ডেটার ফলে নতুন এক্সিকিউশন পাথ হবে না।

টুলস/সিকিউরিটি/ফজিং/উদাহরণ_রস্ট_ফুজার/ -এ, ইন-ট্রি, এই উদাহরণটি সন্ধান করুন। ইন-ট্রি আরেকটি fuzzer (যা rustlib নির্ভরতাকে ম্লান করে) এর একটু জটিল উদাহরণ দেখতে, দেখুন legacy_blob_fuzzer

কাঠামো-সচেতন রাস্ট ফাজার্স কীভাবে লিখতে হয় তার নির্দেশনার জন্য, রাস্ট ফাজ বইটি দেখুন, রাস্ট ফাজ প্রকল্পের অফিসিয়াল ডকুমেন্টেশন।