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

#![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` كـ معلَمات إدخال. في البداية، يتم تهيئة كائن `Parcel` عشوائي باستخدام موفِّر البيانات واستدعاء طريقة `transact` على الخدمة عن بُعد باستخدام حزمة الإدخال، وأخيرًا يتم الحصول على الردّ في حزمة الردّ.

إنشاء أدوات التشويه وتشغيلها

يتم إنشاء أدوات التشويه مع تغطية تلقائيًا.

يُنصح باستخدام أدوات التنظيف التالية لاكتشاف مشاكل الذاكرة. لا تعمل أدوات تنظيف 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_defaultservice_fuzzer_defaults التبعيات المطلوبة لـ fuzzService.
  • يجب إضافة التبعيات الخاصة بالخدمة كمكتبة أو كمصادر.
  • ملف رئيسي ينشئ خدمتك ويستدعي fuzzService

للحصول على تعليمات مفصّلة حول استخدام cc_fuzz، اطّلِع على مستندات التشويه باستخدام `libFuzzer`. لحلّ خطأ الإنشاء، عدِّل الروابط باستخدام أسماء الخدمة وأداة التشويه الجديدة. بالنسبة إلى خدمات Java أو Rust، يمكن أن تكون قائمة أدوات التشويه فارغة.