libfuzzer-sys ক্রেটের মাধ্যমে রাস্ট ফাজিং সমর্থিত, যা LLVM-এর libFuzzer ফাজিং ইঞ্জিনের বাইন্ডিং প্রদান করে। আরও তথ্যের জন্য, libfuzzer-sys রিপোজিটরি এবং LLVM libFuzzer প্রজেক্ট পেজ দেখুন।
rust_fuzz মডিউলটি একটি ফাজার বাইনারি তৈরি করে, যা রান করলে ফাজিং শুরু করে ( cc_fuzz মডিউলগুলোর মতোই)। যেহেতু ফাজারটি libFuzzer ফাজিং ইঞ্জিন ব্যবহার করে, তাই ফাজিং নিয়ন্ত্রণের জন্য এটি বেশ কিছু আর্গুমেন্ট নিতে পারে। এগুলোর বিস্তারিত libFuzzer ডকুমেন্টেশনে উল্লেখ করা আছে।
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 ফাইলটিতে একটি সাধারণ ফাজার রয়েছে:
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 একটি কভারেজ-গাইডেড ফাজার, তাই এটি দ্রুত সমস্যাযুক্ত দৈর্ঘ্যের দিকে অগ্রসর হয়, কারণ এটি নির্ধারণ করে যে ডেটার প্রথম ৩২৬ বাইট কোনো নতুন এক্সিকিউশন পাথ তৈরি করে না।
এই উদাহরণটি ট্রি-এর মধ্যে tools/security/fuzzing/example_rust_fuzzer/ -এ খুঁজুন। ট্রি-এর মধ্যে অন্য একটি ফাজারের (যা একটি rustlib ডিপেন্ডেন্সি ফাজ করে) কিছুটা বেশি জটিল উদাহরণ দেখতে, legacy_blob_fuzzer দেখুন।
কীভাবে স্ট্রাকচার-অ্যাওয়ার রাস্ট ফাজার লিখতে হয় , সে বিষয়ে নির্দেশনার জন্য রাস্ট ফাজ প্রজেক্টের অফিশিয়াল ডকুমেন্টেশন ‘রাস্ট ফাজ বুক’ দেখুন।