এআইডিএল ফাজিং

ফাজারটি জেনারেট করা স্টাবের মাধ্যমে রিমোট সার্ভিসটিকে ইম্পোর্ট বা ইনভোক করে তার ক্লায়েন্ট হিসেবে কাজ করে:

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;
}

রাস্ট এপিআই ব্যবহার করে:

#![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 গ্রহণ করে। এটি প্রথমে ডেটা প্রোভাইডার ব্যবহার করে একটি র‍্যান্ডম Parcel অবজেক্ট ইনিশিয়ালাইজ করে, ইনপুট পার্সেল ব্যবহার করে রিমোট সার্ভিসের transact মেথডকে কল করে এবং সবশেষে একটি রিপ্লাই পার্সেলের মধ্যে উত্তরটি গ্রহণ করে।

ফাজার তৈরি এবং চালান

ফাজারগুলো ডিফল্টভাবে কভারেজ সহ তৈরি করা হয়।

মেমরি সমস্যা খুঁজে বের করার জন্য নিম্নলিখিত স্যানিটাইজারগুলো সুপারিশ করা হয়। hwaddress স্যানিটাইজারগুলো শুধুমাত্র arm আর্কিটেকচারে চলে:

SANITIZE_HOST=address SANITIZE_TARGET=hwaddress

libFuzzer সাথে চালানোর সময়, Android.bp ফাইলে একটি কর্পাস (যা একটি ডিরেক্টরি) নির্দিষ্ট করা যেতে পারে এবং আপনি এই ডিরেক্টরিটি ফাজারে পাঠাতে পারেন। কিছু ফাজার তাদের 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 বাইন্ডার সার্ভিসের জন্য `service fuzzer bindings`- এ একটি ফাজার এন্ট্রি আছে কি না। ফাজার বাইন্ডিং টেস্টটি যাচাই করে যে service_contexts এর প্রতিটি সার্ভিসের একটি ফাজার আছে কি না। যদি কোনো নতুন সার্ভিসের জন্য ফাজার বা এক্সেপশন খুঁজে না পাওয়া যায়, তাহলে একটি বিল্ড এরর দেখা দেয়।

নিম্নলিখিতটি যোগ করে একটি স্বয়ংক্রিয় C++ সার্ভিস ফাজার লেখা যেতে পারে (জাভা এবং রাস্ট ফাজার এখনও সমর্থিত নয়):

  • ফাজার মডিউল সংজ্ঞায়িত করার জন্য Android.bp তে একটি cc_fuzz এন্ট্রি থাকে। cc_default মডিউল service_fuzzer_defaultsfuzzService জন্য প্রয়োজনীয় ডিপেন্ডেন্সিগুলো রয়েছে।
  • সার্ভিস-নির্দিষ্ট নির্ভরতাগুলো লাইব্রেরি অথবা সোর্স হিসেবে যোগ করা উচিত।
  • একটি প্রধান ফাইল যা আপনার সার্ভিস তৈরি করে এবং fuzzService কল করে।

cc_fuzz ব্যবহারের বিস্তারিত নির্দেশাবলীর জন্য, “ Fuzzing with libFuzzer ” ডকুমেন্টেশনটি দেখুন। বিল্ড এরর সমাধান করতে, নতুন সার্ভিস এবং ফাজারের নাম দিয়ে বাইন্ডিংগুলো আপডেট করুন। Java বা Rust সার্ভিসের ক্ষেত্রে, ফাজার তালিকাটি খালি থাকতে পারে।