يتصرّف أداة التشويه كعميل للخدمة عن بُعد من خلال استيرادها أو استدعائها من خلال رمز الاستدعاء الذي تم إنشاؤه:
استخدام واجهة برمجة تطبيقات 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` في أداة التشويه ويتم إدخال `IBinder` (الخدمة) و`dataProvider` كـ معلَمات إدخال. في البداية، يتم تهيئة كائن `Parcel` عشوائي باستخدام موفِّر البيانات واستدعاء طريقة `transact` على الخدمة عن بُعد باستخدام حزمة الإدخال، وأخيرًا يتم الحصول على الردّ في حزمة الردّ.
إنشاء أدوات التشويه وتشغيلها
يتم إنشاء أدوات التشويه مع تغطية تلقائيًا.
يُنصح باستخدام أدوات التنظيف التالية لاكتشاف مشاكل الذاكرة.
لا تعمل أدوات تنظيف hwaddress إلا على بنية arm:
SANITIZE_HOST=address SANITIZE_TARGET=hwaddress
عند التشغيل باستخدام libFuzzer، يمكن تحديد مجموعة بيانات، وهي دليل، في ملف Android.bp، ويمكنك تمرير هذا الدليل إلى أداة التشويه. تحدّد بعض
أدوات التشويه أيضًا dictionary: في ملف Android.bp، ويمكنك
تمريرها إلى `libFuzzer` باستخدام -dict path/to/dict. لمزيد
من الخيارات، اطّلِع على
مستندات `libFuzzer` الرسمية.
لتشغيل أدوات التشويه على الجهاز، شغِّل adb sync data ثم
adb shell data/fuzz/arch/name/name.
لتشغيل أدوات التشويه على المضيف، شغِّل
$ANDROID_HOST_OUT/fuzz/arch/name/name.
أدوات التشويه المقترَحة للخدمات الجديدة أو الحالية
يتحقّق نظام التصميم مما إذا كانت كل خدمة ربط في AOSP تتضمّن إدخال أداة تشويه في
روابط أداة تشويه الخدمة.
يتحقّق اختبار ربط أداة التشويه من أنّ كل خدمة في service_contexts تتضمّن أداة تشويه. إذا لم يتم العثور على أداة تشويه أو استثناء لخدمة جديدة، سيحدث خطأ في الإنشاء.
يمكن كتابة أداة تشويه تلقائية لخدمة C++ من خلال إضافة ما يلي (لا تتوفّر بعد أدوات تشويه Java وRust):
- إدخال
cc_fuzzفيAndroid.bpلتحديد وحدة أداة التشويه تتضمّن وحدةcc_defaultservice_fuzzer_defaultsالتبعيات المطلوبة لـfuzzService. - يجب إضافة التبعيات الخاصة بالخدمة كمكتبة أو كمصادر.
- ملف رئيسي ينشئ خدمتك ويستدعي
fuzzService
للحصول على تعليمات مفصّلة حول استخدام cc_fuzz، اطّلِع على
مستندات التشويه باستخدام
`libFuzzer`. لحلّ خطأ الإنشاء، عدِّل الروابط باستخدام أسماء الخدمة وأداة التشويه الجديدة. بالنسبة إلى خدمات Java أو Rust، يمكن أن تكون قائمة أدوات التشويه فارغة.