ה-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.
המלצה על כלי Fuzzing לשירותים חדשים או קיימים
מערכת ה-build בודקת אם לכל שירות AOSP binder יש רשומה של fuzzer ב-service fuzzer bindings.
בדיקת ה-binding של ה-Fuzzer בודקת שלכל שירות ב-service_contexts יש Fuzzer. אם לא נמצא fuzzer או חריג לשירות חדש, תופיע שגיאת build.
אפשר לכתוב כלי אוטומטי ל-fuzzing של שירות C++ על ידי הוספת הקוד הבא (עדיין אין תמיכה בכלי fuzzing של Java ו-Rust):
- רשומה של
cc_fuzzב-Android.bpכדי להגדיר את מודול ה-fuzzer. למודולcc_defaultservice_fuzzer_defaultsיש תלויות שנדרשות עבורfuzzService. - צריך להוסיף תלויות ספציפיות לשירות כספרייה או כמקורות.
- קובץ ראשי שבו מוגדר השירות ומתבצעת קריאה ל-
fuzzService
הוראות מפורטות לשימוש ב-cc_fuzz זמינות במסמכי התיעוד בנושא Fuzzing with libFuzzer. כדי לפתור את שגיאת הבנייה, צריך לעדכן את הקישורים עם השמות החדשים של השירות וה-fuzzer. בשירותי Java או Rust, רשימת ה-fuzzer יכולה להיות ריקה.