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

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

استخدام واجهة برمجة التطبيقات C++ API:

#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 في دالة Fuzzer ويتم استخدامه في IBinder (Service) وdataProvider كمَعلمة إدخال. فهو يقوم أولاً بتهيئة كائن "طرد" عشوائي باستخدام موفر البيانات واستدعاء طريقة المعاملة على الخدمة البعيدة باستخدام حزمة الإدخال، وأخيرًا الحصول على الرد في حزمة الرد.

صمِّم ألعاب ضبابية وشغِّلها

يتم تصميم أجهزة الهبوط من أجل تغطية تلقائية.

يُنصح باستخدام مستحضرات التجميل التالية لاكتشاف مشاكل الذاكرة. لا يتم تشغيل تعقيمات hwaddress إلا على بنية arm التالية:

SANITIZE_HOST=address SANITIZE_TARGET=hwaddress

عند التشغيل باستخدام libFuzzer، يمكن تحديد مجموعة، وهي دليل، في ملف Android.bp، ويمكنك تمرير هذا الدليل إلى نظام fuzzer. تحدّد بعض كائنات Fuzzer أيضًا dictionary: في ملف Android.bp الخاص بهم، ويمكنك تمريرها إلى libFuzzer باستخدام -dict path/to/dict. لمزيد من الخيارات، راجِع مستندات libFuzzer الرسمية.

لتشغيل ألعاب Fuzzers على الجهاز، عليك تشغيل adb sync data ثم adb shell data/fuzz/arch/name/name. لتشغيل ملفات Fuzzers على المضيف، شغِّل $ANDROID_HOST_OUT/fuzz/arch/name/name.

يتحقّق نظام التصميم مما إذا كانت كل خدمة مجلد AOSP تحتوي على إدخال بديل في عمليات ربط FOSP. يتحقّق اختبار ربط Fuzzer من أنّ كل خدمة في service_contexts لها قيمة ضبابية. إذا لم يتم العثور على عنصر فوز أو استثناء لخدمة جديدة، هناك خطأ في الإصدار.

يمكن كتابة رمز زغب خدمة C++ تلقائيًا عن طريق إضافة ما يلي (لا تتوفر مفاتيح فك التشفير Java وRusters حتى الآن):

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

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