fuzzer উৎপন্ন স্টাবের মাধ্যমে আমদানি বা আহ্বান করে দূরবর্তী পরিষেবার ক্লায়েন্ট হিসাবে আচরণ করে:
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;
}
মরিচা 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);
});
এআইডিএল পরিষেবাগুলিকে অস্পষ্ট করার জন্য কাঠামো৷
উপরের উদাহরণে যেমন দেখানো হয়েছে, fuzzService-কে fuzzer-এ বলা হয় এবং ইনপুট প্যারামিটার হিসাবে একটি IBinder (Service) এবং dataProvider গ্রহণ করে। এটি প্রথমে ডেটা প্রদানকারী ব্যবহার করে একটি র্যান্ডম পার্সেল অবজেক্ট শুরু করে এবং ইনপুট পার্সেল ব্যবহার করে রিমোট সার্ভিসে লেনদেন পদ্ধতিতে কল করে এবং অবশেষে একটি উত্তর পার্সেলে উত্তর পায়।
fuzzers নির্মাণ এবং চালানো
Fuzzers ডিফল্টভাবে কভারেজ সঙ্গে নির্মিত হয়.
নিম্নলিখিত স্যানিটাইজারগুলি মেমরি সমস্যাগুলি আবিষ্কার করার জন্য সুপারিশ করা হয়। hwaddress স্যানিটাইজারগুলি শুধুমাত্র arm আর্কিটেকচারে চলে:
SANITIZE_HOST=address SANITIZE_TARGET=hwaddress
libFuzzer সাথে চলার সময়, একটি কর্পাস, যা একটি ডিরেক্টরি, Android.bp ফাইলে নির্দিষ্ট করা যেতে পারে এবং আপনি এই ডিরেক্টরিটি fuzzer-এ পাঠাতে পারেন। কিছু fuzzers একটি dictionary: তাদের Android.bp ফাইলে, এবং আপনি এটি libFuzzer-এ -dict path/to/dict দিয়ে পাঠাতে পারেন। আরও বিকল্পের জন্য, অফিসিয়াল libFuzer ডকুমেন্টেশন দেখুন।
ডিভাইসে fuzzers চালানোর জন্য, adb sync data চালান এবং তারপর adb shell data/fuzz/ arch / name / name । হোস্টে fuzzers চালানোর জন্য, $ANDROID_HOST_OUT/ fuzz / arch / name / name চালান।
নতুন বা বিদ্যমান পরিষেবার জন্য fuzzers সুপারিশ
বিল্ড সিস্টেম চেক করে যে প্রতিটি AOSP বাইন্ডার সার্ভিসের সার্ভিস ফুজার বাইন্ডিংয়ে একটি ফুজার এন্ট্রি আছে কিনা। Fuzzer বাইন্ডিং পরীক্ষা পরীক্ষা করে যে service_contexts এর প্রতিটি পরিষেবার একটি fuzzer আছে। যদি একটি নতুন পরিষেবার জন্য একটি fuzzer বা ব্যতিক্রম পাওয়া না যায়, একটি বিল্ড ত্রুটি আছে.
একটি স্বয়ংক্রিয় C++ পরিষেবা ফুজার নিম্নলিখিত যোগ করে লেখা যেতে পারে (জাভা এবং মরিচা ফুজার এখনও সমর্থিত নয়):
- fuzzer মডিউল সংজ্ঞায়িত করতে
Android.bpএ একটিcc_fuzzএন্ট্রি।cc_defaultমডিউলservice_fuzzer_defaultsfuzzServiceজন্য প্রয়োজনীয় নির্ভরতা রয়েছে। - পরিষেবা-নির্দিষ্ট নির্ভরতা একটি লাইব্রেরি বা উত্স হিসাবে যোগ করা উচিত।
- একটি প্রধান ফাইল যা আপনার পরিষেবা তৈরি করে এবং
fuzzServiceকল করে
cc_fuzz ব্যবহারের বিস্তারিত নির্দেশাবলীর জন্য, LibFuzer ডকুমেন্টেশনের সাথে Fuzzing দেখুন। বিল্ড ত্রুটি সমাধান করতে, নতুন পরিষেবা এবং ফুজার নামের সাথে বাইন্ডিং আপডেট করুন। জাভা বা মরিচা পরিষেবার জন্য, ফুজার তালিকা খালি হতে পারে।