ফাজার রিমোট পরিষেবার জন্য ক্লায়েন্ট হিসেবে কাজ করে। এটি জেনারেট করা স্টাবের মাধ্যমে পরিষেবাটি ইমপোর্ট বা ইনভোক করে:
C++ API ব্যবহার করে:
#include <fuzzbinder/libbinder_ndk_driver.h>
#include <fuzzer/FuzzedDataProvider.h>
#include <android-base/logging.h>
#include <android/binder_interface_utils.h>
using android::fuzzService;
using ndk::SharedRefBase;
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
auto binder = ndk::SharedRefBase::make<MyService>(...);
fuzzService(binder->asBinder().get(), FuzzedDataProvider(data, size));
return 0;
}
Rust API ব্যবহার করে:
#![allow(missing_docs)]
#![no_main]
#[macro_use]
extern crate libfuzzer_sys;
use binder::{self, BinderFeatures, Interface};
use binder_random_parcel_rs::fuzz_service;
fuzz_target!(|data: &[u8]| {
let service = BnTestService::new_binder(MyService, BinderFeatures::default());
fuzz_service(&mut service.as_binder(), data);
});
AIDL পরিষেবা ফাজ করার ফ্রেমওয়ার্ক
উপরে দেখানো উদাহরণে, fuzzService কে ফাজ্জারে কল করা হয় এবং এটি IBinder (পরিষেবা) ও dataProvider-কে ইনপুট প্যারামিটার হিসেবে নেয়। এটি প্রথমে data প্রোভাইডার ব্যবহার করে একটি র্যান্ডম Parcel অবজেক্ট ইনিশিয়ালাইজ করে এবং ইনপুট পার্সেল ব্যবহার করে রিমোট সার্ভিসে transact মেথড কল করে এবং অবশেষে reply পার্সেলের মধ্যে উত্তর পায়।
ফাজার তৈরি ও রান করা
ডিফল্ট হিসেবে কভারেজ সহ ফাজার তৈরি করা হয়।
মেমরি সংক্রান্ত সমস্যা খুঁজে বের করার জন্য নিম্নলিখিত স্যানিটাইজার ব্যবহার করার পরামর্শ দেওয়া হয়।
hwaddress স্যানিটাইজার শুধুমাত্র arm আর্কিটেকচারে চলে:
SANITIZE_HOST=address SANITIZE_TARGET=hwaddress
libFuzzer-এর সাথে রান করার সময়, একটি কর্পাস, যা একটি ডিরেক্টরি, Android.bp ফাইলে নির্দিষ্ট করা হতে পারে
এবং আপনি এই ডিরেক্টরি ফাজারে পাস করতে পারেন। কিছু
fuzzer তাদের Android.bp ফাইলে dictionary: নির্দিষ্ট করে এবং আপনি
-dict path/to/dict-এর মাধ্যমে libFuzzer-এ এটি পাস করতে পারবেন। আরও
বিকল্পের জন্য, অফিসিয়াল libFuzzer ডকুমেন্টেশন দেখুন।
ডিভাইসে ফাজার রান করাতে, adb sync data এবং তারপরে
adb shell data/fuzz/arch/name/name রান করান।
হোস্টে ফাজার চালানোর জন্য, $ANDROID_HOST_OUT/fuzz/arch/name/name চালান।
নতুন বা আগে থেকেই থাকা পরিষেবার জন্য ফাজার সাজেস্ট করা
বিল্ড সিস্টেম চেক করে দেখে যে প্রতিটি AOSP বাইন্ডার পরিষেবার
পরিষেবা ফাজার বাইন্ডিংয়ে কোনও ফাজার এন্ট্রি আছে কিনা।
Fuzzer বাইন্ডিং টেস্ট চেক করে দেখে যে service_contexts-এর প্রতিটি পরিষেবায়
fuzzer আছে কিনা। নতুন পরিষেবার জন্য কোনও ফাজার বা ব্যতিক্রম খুঁজে না পাওয়া গেলে, বিল্ড
এরর হয়।
নিম্নলিখিতগুলি যোগ করে একটি অটোমেটিক C++ সার্ভিস ফাজার লেখা যেতে পারে (Java এবং Rust ফাজার এখনও কাজ করে না):
- ফাজার মডিউলকে সংজ্ঞায়িত করতে
Android.bp-এ একটিcc_fuzzএন্ট্রি।cc_defaultমডিউলেরservice_fuzzer_defaultsউপরfuzzService-এর জন্য প্রয়োজনীয় নির্ভরশীলতা আছে। - পরিষেবা-নির্দিষ্ট নির্ভরতা লাইব্রেরি বা সোর্স হিসেবে যোগ করতে হবে।
- একটি মূল ফাইল যা আপনার পরিষেবা তৈরি করে এবং
fuzzServiceকল করে
cc_fuzz ব্যবহার করার ব্যাপারে বিস্তারিত নির্দেশাবলীর জন্য, libFuzzer-এর মাধ্যমে ফাজিং
ডকুমেন্টেশন দেখুন। বিল্ড সংক্রান্ত সমস্যার সমাধান করতে, নতুন পরিষেবা ও
ফাজার নামের সাথে বাইন্ডিং আপডেট করুন। Java বা Rust পরিষেবার ক্ষেত্রে, ফাজার তালিকা খালি থাকতে পারে।