AIDL تشوش

يتصرف Fuzzer كعميل للخدمة عن بعد عن طريق استيراده/استدعاءه من خلال كعب الروتين الذي تم إنشاؤه:

باستخدام واجهة برمجة تطبيقات C++:

#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:

#![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 في Fuzzer ويستقبل IBinder (Service) وdataProvider كمعلمات إدخال. يقوم أولاً بتهيئة كائن طرد عشوائي باستخدام موفر البيانات واستدعاء أسلوب المعاملة على الخدمة البعيدة باستخدام طرد الإدخال، وأخيرًا الحصول على الرد في طرد الرد.

بناء وتشغيل الزغب

يتم تصميم Fuzzers بتغطية افتراضية.

يوصى باستخدام المطهرات التالية لاكتشاف مشكلات الذاكرة. معقمات hwaddress تعمل فقط على بنية arm :

SANITIZE_HOST=address SANITIZE_TARGET=hwaddress

عند التشغيل باستخدام libFuzzer ، قد يتم تحديد مجموعة، وهي دليل، في ملف Android.bp ، ويمكنك تمرير هذا الدليل إلى Fuzzer. تحدد بعض أدوات Fuzzers أيضًا dictionary: في ملف Android.bp الخاص بهم، ويمكنك تمرير هذا إلى libFuzzer باستخدام -dict path/to/dict . لمزيد من الخيارات، راجع وثائق libFuzzer الرسمية .

لتشغيل Fuzzers على الجهاز، قم بتشغيل adb sync data ثم adb shell data/fuzz/ arch / name / name . لتشغيل Fuzzers على المضيف، قم بتشغيل $ANDROID_HOST_OUT/ fuzz / arch / name / name .

يتحقق نظام البناء مما إذا كانت كل خدمة رابط AOSP تحتوي على إدخال ضبابي في روابط ضبابية الخدمة . يتحقق اختبار ربط Fuzzer من أن كل خدمة في service_contexts تحتوي على Fuzzer. إذا لم يتم العثور على خطأ/استثناء لخدمة جديدة، فهذا يعني وجود خطأ في البناء.

يمكن كتابة ضبابية خدمة C++ تلقائية عن طريق إضافة ما يلي (لا يتم دعم ضبابي Java وRust بعد):

  • إدخال cc_fuzz في Android.bp لتعريف وحدة Fuzzer. تحتوي الوحدة النمطية cc_default service_fuzzer_defaults على تبعيات مطلوبة لـ fuzzService .
  • يجب إضافة التبعيات الخاصة بالخدمة كمكتبة أو كمصادر.
  • الملف الرئيسي الذي يبني خدمتك ويستدعي fuzzService

للحصول على تعليمات تفصيلية حول استخدام cc_fuzz ، راجع وثائق Fuzzing with libFuzzer . لحل خطأ البناء، قم بتحديث الروابط باستخدام الخدمة الجديدة وأسماء الغموض. بالنسبة لخدمات Java/Rust، يمكن أن تكون القائمة الغامضة فارغة.