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

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 চালান।

বিল্ড সিস্টেম চেক করে যে প্রতিটি AOSP বাইন্ডার সার্ভিসের সার্ভিস ফুজার বাইন্ডিংয়ে একটি ফুজার এন্ট্রি আছে কিনা। Fuzzer বাইন্ডিং পরীক্ষা পরীক্ষা করে যে service_contexts এর প্রতিটি পরিষেবার একটি fuzzer আছে। যদি একটি নতুন পরিষেবার জন্য একটি fuzzer/ব্যতিক্রম পাওয়া না যায়, একটি বিল্ড ত্রুটি আছে।

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

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

cc_fuzz ব্যবহারের বিস্তারিত নির্দেশাবলীর জন্য, LibFuzer ডকুমেন্টেশনের সাথে Fuzzing দেখুন। বিল্ড ত্রুটি সমাধান করতে, নতুন পরিষেবা এবং ফুজার নামের সাথে বাইন্ডিং আপডেট করুন। Java/Rust পরিষেবার জন্য, fuzzer তালিকা খালি হতে পারে।