فحص لغة تعريف واجهة نظام 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 تتضمّن إدخالاً في أداة التشويش ضمن عمليات ربط أدوات التشويش بالخدمات. يتحقّق اختبار ربط Fuzzer من أنّ كل خدمة في service_contexts تتضمّن أداة Fuzzer. إذا لم يتم العثور على أداة تشويش أو استثناء لخدمة جديدة، سيحدث خطأ في الإنشاء.

يمكن كتابة أداة تشويش تلقائية لخدمة C++ من خلال إضافة ما يلي (لا تتوفّر أدوات التشويش في Java وRust بعد):

  • إدخال cc_fuzz في Android.bp لتحديد وحدة التشويش تحتوي الوحدة cc_default service_fuzzer_defaults على عناصر تابعة مطلوبة لـ fuzzService.
  • يجب إضافة التبعيات الخاصة بالخدمة كمكتبة أو كمصادر.
  • ملف رئيسي ينشئ خدمتك ويطلب fuzzService

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