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