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