عدم محاذاة واجهة برمجة التطبيقات AIDL

يتصرّف أداة التدقيق العشوائي كعميل للخدمة البعيدة من خلال استيرادها أو استدعاؤها من خلال الرمز البرمجي الذي تم إنشاؤه:

باستخدام واجهة برمجة التطبيقات 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، يمكن أن تكون قائمة أداة البحث عن الأخطاء العشوائية فارغة.