يتصرف أداة التشويش كعميل للخدمة البعيدة من خلال استيرادها أو استدعائها عبر رمز البرنامج الذي تم إنشاؤه:
استخدام واجهة برمجة التطبيقات 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 تتضمّن إدخالاً في أداة التشويش ضمن
عمليات ربط أدوات التشويش بالخدمات.
يتحقّق اختبار ربط Fuzzer من أنّ كل خدمة في service_contexts
تتضمّن أداة Fuzzer. إذا لم يتم العثور على أداة تشويش أو استثناء لخدمة جديدة، سيحدث خطأ في الإنشاء.
يمكن كتابة أداة تشويش تلقائية لخدمة C++ من خلال إضافة ما يلي (لا تتوفّر أدوات التشويش في Java وRust بعد):
- إدخال
cc_fuzz
فيAndroid.bp
لتحديد وحدة التشويش تحتوي الوحدةcc_default
service_fuzzer_defaults
على عناصر تابعة مطلوبة لـfuzzService
. - يجب إضافة التبعيات الخاصة بالخدمة كمكتبة أو كمصادر.
- ملف رئيسي ينشئ خدمتك ويطلب
fuzzService
للحصول على تعليمات تفصيلية حول استخدام cc_fuzz
، يُرجى الاطّلاع على مستند
التشويش باستخدام libFuzzer. لحلّ خطأ الإنشاء، عدِّل عمليات الربط باستخدام اسمَي الخدمة وFuzzer الجديدَين. بالنسبة إلى خدمات Java أو Rust، يمكن أن تكون قائمة أدوات فحص التشويش فارغة.