يتصرف 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، يمكن أن تكون القائمة الغامضة فارغة.