AIDL Fuzzing

ה-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;
}

שימוש ב-API של 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 נקרא ב-fuzzer ומקבל IBinder (Service) ו-dataProvider כפרמטרי קלט. הוא מאתחל תחילה אובייקט חבילה אקראי באמצעות ספק הנתונים וקורא לשיטת העסקאות בשירות המרוחק באמצעות חבילת הקלט, ולבסוף מקבל את התשובה לחבילת תשובה.

בנה והפעל fuzzers

Fuzzers בנויים עם כיסוי כברירת מחדל.

חומרי החיטוי הבאים מומלצים כדי לגלות בעיות זיכרון. חומרי חיטוי hwaddress פועלים רק על ארכיטקטורת arm :

SANITIZE_HOST=address SANITIZE_TARGET=hwaddress

כאשר פועלים עם libFuzzer , ייתכן שצוין קורפוס, שהוא ספריה, בקובץ Android.bp , ותוכל להעביר את הספרייה הזו ל-fuzzer. כמה fuzzers מציינים גם 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 .

מערכת ה-build בודקת אם לכל שירות AOSP קלסר יש ערך fuzzer ב- fuzzer של שירות . מבחן הקישור של Fuzzer בודק שלכל שירות ב- service_contexts יש Fuzzer. אם לא נמצא fuzzer/חריג עבור שירות חדש, ישנה שגיאת בנייה.

ניתן לכתוב fuzzer שירות C++ אוטומטי על ידי הוספת הדברים הבאים (טרם נתמכים ב-Java ו-Rust fuzzers):

  • ערך cc_fuzz ב- Android.bp כדי להגדיר את מודול ה-fuzzer. למודול cc_default service_fuzzer_defaults יש תלות הנדרשות עבור fuzzService .
  • יש להוסיף תלות ספציפיות לשירות כספרייה או כמקורות.
  • קובץ ראשי שבונה את השירות שלך וקורא fuzzService

להנחיות מפורטות על השימוש ב- cc_fuzz , עיין בתיעוד Fuzzing with libFuzzer . כדי לפתור שגיאת בנייה, עדכן את הקבצים עם השירות החדש ושמות ה-fuzzer. עבור שירותי Java/Rust, רשימת ה-fuzzer יכולה להיות ריקה.