ה-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
.
ממליצים על fuzzers לשירותים חדשים/קיימים
מערכת ה-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 יכולה להיות ריקה.