فحص لغة تعريف واجهة نظام Android (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);
});

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