ה-fuzzer מתנהג כלקוח של השירות המרוחק על ידי ייבוא או הפעלה שלו דרך הסטאב שנוצר:
באמצעות API של 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 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);
});
מסגרת ל-fuzzing של שירותי AIDL
כפי שאפשר לראות בדוגמה שלמעלה, fuzzService נקרא ב-fuzzer ומקבל ב-IBinder (Service) ו-dataProvider כ- בפרמטרים של הקלט. קודם כול, המערכת מאתחלת אובייקט Parcel אקראי באמצעות ספק הנתונים, קוראת לשיטה transact בשירות המרוחק באמצעות חבילה של קלט, ובסוף מקבלת את התשובה בחבילת תשובה.
בנייה והפעלה של fuzzers
כברירת מחדל, כלי ה-fuzzing נוצרים עם כיסוי.
מומלץ להשתמש בחומרי החיטוי הבאים כדי לזהות בעיות בזיכרון.
חומרי חיטוי של hwaddress
פועלים רק בארכיטקטורה arm
:
SANITIZE_HOST=address SANITIZE_TARGET=hwaddress
כשמריצים עם libFuzzer
, ניתן לציין קורפוס, שהוא ספרייה,
בקובץ Android.bp
, ואפשר להעביר את הספרייה הזו ל-fuzzer. במידה מסוימת
fuzzers מציינים גם dictionary:
בקובץ Android.bp
שלהם, ואפשר
להעביר אותה אל libFuzzer באמצעות -dict path/to/dict
. עבור
אפשרויות נוספות,
מסמכי תיעוד רשמיים של libFuzzer.
כדי להריץ כלי fuzzing במכשיר, מריצים את adb sync data
ואז את adb shell data/fuzz/arch/name/name
.
כדי להריץ כלי fuzzing במארח, מריצים את הפקודה $ANDROID_HOST_OUT/fuzz/arch/name/name
.
המלצה על fuzzers לשירותים חדשים או קיימים
מערכת ה-build בודקת אם לכל שירות binder של AOSP יש רשומת fuzzer
קישורי fuzzer.
הבדיקה של קישור Fuzzer מוודאת שלכל שירות ב-service_contexts
יש
מטושטש. אם לא נמצא fuzzer או חריגה בשירות חדש, יש שגיאה ב-build.
כדי לכתוב fuzzer אוטומטי לשירותים ב-C++, צריך להוסיף את הקוד הבא (עדיין אין תמיכה ב-fuzzers של Java ו-Rust):
- רשומת
cc_fuzz
ב-Android.bp
להגדרת מודול fuzzer. יחסי התלות הנדרשים שלcc_default
מודולservice_fuzzer_defaults
fuzzService
. - צריך להוסיף יחסי תלות ספציפיים לשירות כספרייה או כמקורות.
- קובץ ראשי שמרכיב את השירות וקורא ל-
fuzzService
הוראות מפורטות לשימוש ב-cc_fuzz
זמינות במאמר
מזעזע עם libFuzzer
התיעוד. כדי לפתור את שגיאת ה-build, מעדכנים את הקישורים בשמות החדשים של השירות וה-fuzzer. בשירותי Java או Rust, רשימת ה-fuzzer יכולה להיות ריקה.