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);
});
เฟรมเวิร์กสำหรับบริการ Fuzz AIDL
ดังที่ปรากฏในตัวอย่างข้างต้น fuzzService มีการเรียกใน Fuzzer และใช้ IBinder (Service) และ dataProvider เป็นพารามิเตอร์อินพุต โดยจะเริ่มออบเจ็กต์ Parcel แบบสุ่มโดยใช้ผู้ให้บริการข้อมูล และเรียกเมธอด Transaction ในบริการระยะไกลโดยใช้ Parcel กับอินพุต และสุดท้ายได้รับการตอบกลับในแพ็กเก็ตตอบกลับ
สร้างและเรียกใช้ Fuzzer
Fuzzers ได้รับการสร้างให้ครอบคลุมโดยค่าเริ่มต้น
ขอแนะนำให้ใช้เจลฆ่าเชื้อต่อไปนี้เพื่อตรวจหาปัญหาเกี่ยวกับหน่วยความจำ
ผลิตภัณฑ์ทำความสะอาด hwaddress
ใช้ได้ในสถาปัตยกรรมของ arm
เท่านั้น ได้แก่
SANITIZE_HOST=address SANITIZE_TARGET=hwaddress
เมื่อเรียกใช้ด้วย libFuzzer
ระบบอาจระบุคลังข้อมูลซึ่งเป็นไดเรกทอรีในไฟล์ Android.bp
และคุณจะส่งไดเรกทอรีนี้ไปยัง Fuzzer ได้ Fuzzer บางตัวยังระบุ dictionary:
ในไฟล์ Android.bp
ด้วย และคุณสามารถส่งไปยัง libFuzzer ด้วย -dict path/to/dict
ได้ ดูตัวเลือกเพิ่มเติมได้จากเอกสารของ libFuzzer อย่างเป็นทางการ
หากต้องการเรียกใช้ Fuzzer ในอุปกรณ์ ให้เรียกใช้ adb sync data
ตามด้วย adb shell data/fuzz/arch/name/name
หากต้องการเรียกใช้ Fuzzer บนโฮสต์ ให้เรียกใช้ $ANDROID_HOST_OUT/fuzz/arch/name/name
แนะนำบริการใหม่หรือบริการที่มีอยู่
ระบบบิลด์จะตรวจสอบว่าบริการ Bizzer ทั้งหมดของ AOSP มีรายการ Fuzzer ในการเชื่อมโยง Fuzzer ของบริการหรือไม่
การทดสอบการเชื่อมโยง Fuzzer จะตรวจสอบว่าบริการทั้งหมดใน service_contexts
มี Fuzzer หากไม่พบข้อผิดพลาดหรือข้อยกเว้นสำหรับบริการใหม่ แสดงว่ามีข้อผิดพลาดของบิลด์
คุณสามารถเขียนเครื่องมือ fuzzer บริการ C++ อัตโนมัติได้ด้วยการเพิ่มสิ่งต่อไปนี้ (ระบบยังไม่รองรับ Java และ Ruzzer ของ Ruzzer)
- รายการ
cc_fuzz
ในAndroid.bp
เพื่อกำหนดโมดูล Fuzzer โมดูลcc_default
service_fuzzer_defaults
มีทรัพยากร Dependency ที่จำเป็นสำหรับfuzzService
- ควรเพิ่มการอ้างอิงเฉพาะบริการเป็นไลบรารีหรือเป็นแหล่งที่มา
- ไฟล์หลักที่สร้างบริการและเรียกใช้
fuzzService
ดูวิธีใช้ cc_fuzz
โดยละเอียดได้ในเอกสารประกอบ Fuzzing with libFuzzer หากต้องการแก้ไขข้อผิดพลาดของบิลด์ ให้อัปเดตการเชื่อมโยงด้วยบริการและชื่อ Fuzzer ใหม่ สำหรับบริการ Java หรือ Rust รายการ Fuzzer จะว่างเปล่า