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