בדיקת fuzz של AIDL

ה-fuzzer מתנהג כלקוח של השירות המרוחק על ידי ייבוא או הפעלה שלו דרך ה-stub שנוצר:

באמצעות 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);
});

Framework to fuzz AIDL services

כפי שמוצג בדוגמה שלמעלה, הפונקציה fuzzService נקראת ב-fuzzer ומקבלת IBinder (Service) ו-dataProvider כפרמטרים של קלט. הוא מאתחל אובייקט Parcel אקראי באמצעות ספק הנתונים, קורא לשיטת הטרנזקציה בשירות המרוחק באמצעות חבילת הקלט, ולבסוף מקבל את התשובה בחבילת תשובה.

יצירה והרצה של כלי fuzzing

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

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

SANITIZE_HOST=address SANITIZE_TARGET=hwaddress

כשמריצים עם libFuzzer, אפשר לציין קורפוס, שהוא ספרייה, בקובץ Android.bp, ולהעביר את הספרייה הזו ל-fuzzer. חלק מכלי ה-fuzzing מציינים גם 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 binder יש רשומה של fuzzer ב-service fuzzer bindings. בדיקת ה-binding של ה-Fuzzer בודקת שלכל שירות ב-service_contexts יש Fuzzer. אם לא נמצאים כלי fuzzing או חריגים לשירות חדש, תופיע שגיאת build.

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

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

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