เบลอ 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);
});

เฟรมเวิร์กสำหรับทดสอบบริการ AIDL แบบไม่ระบุ

ดังที่แสดงในตัวอย่างข้างต้น ระบบจะเรียกใช้ fuzzService ในโปรแกรมสร้างข้อมูลเท็จและรับ IBinder (บริการ) และ dataProvider เป็นพารามิเตอร์อินพุต โดยจะเริ่มออบเจ็กต์ Parcel แบบสุ่มโดยใช้ผู้ให้บริการข้อมูล และเรียกเมธอด Transaction ในบริการระยะไกลโดยใช้ Parcel กับอินพุต และสุดท้ายได้รับการตอบกลับในแพ็กเก็ตตอบกลับ

สร้างและเรียกใช้โปรแกรมตรวจหาช่องโหว่

Fuzzers ได้รับการสร้างให้ครอบคลุมโดยค่าเริ่มต้น

เราขอแนะนําให้ใช้โปรแกรมตรวจสอบต่อไปนี้เพื่อค้นหาปัญหาเกี่ยวกับหน่วยความจํา hwaddress sanitizer จะทํางานในสถาปัตยกรรม arm เท่านั้น

SANITIZE_HOST=address SANITIZE_TARGET=hwaddress

เมื่อเรียกใช้กับ libFuzzer คุณสามารถระบุชุดข้อความซึ่งเป็นไดเรกทอรีในไฟล์ Android.bp และส่งไดเรกทอรีนี้ไปยังโปรแกรมตรวจหาช่องโหว่ได้ เครื่องมือตรวจหาข้อบกพร่องบางรายการยังระบุ dictionary: ในไฟล์ Android.bp ด้วย และคุณสามารถส่งค่านี้ไปยัง libFuzzer ได้ด้วย -dict path/to/dict ดูตัวเลือกเพิ่มเติมได้ในเอกสารประกอบอย่างเป็นทางการของ libFuzzer

หากต้องการเรียกใช้โปรแกรมตรวจหาช่องโหว่ในอุปกรณ์ ให้เรียกใช้ adb sync data แล้วตามด้วย adb shell data/fuzz/arch/name/name หากต้องการเรียกใช้โปรแกรมตรวจหาช่องโหว่ในโฮสต์ ให้เรียกใช้ $ANDROID_HOST_OUT/fuzz/arch/name/name

ระบบบิลด์จะตรวจสอบว่าบริการ Binder ของ AOSP ทุกรายการมีรายการ Fuzzer ในการเชื่อมโยง Fuzzer ของบริการหรือไม่ การทดสอบการเชื่อมโยง Fuzzer จะตรวจสอบว่าบริการทั้งหมดใน service_contexts มี Fuzzer หากไม่พบ Fuzzer หรือข้อยกเว้นสําหรับบริการใหม่ แสดงว่ามีข้อผิดพลาดในการสร้าง

คุณสามารถเขียนโปรแกรม Fuzzer บริการ C++ อัตโนมัติได้โดยเพิ่มรายการต่อไปนี้ (ระบบยังไม่รองรับ Fuzzer ของ Java และ Rust)

  • รายการ cc_fuzz ใน Android.bp เพื่อกำหนดโมดูล Fuzzer โมดูล cc_default service_fuzzer_defaults มีทรัพยากร Dependency ที่จำเป็นสำหรับ fuzzService
  • คุณควรเพิ่มการพึ่งพาเฉพาะบริการเป็นไลบรารีหรือแหล่งที่มา
  • ไฟล์หลักที่สร้างบริการและเรียกใช้ fuzzService

ดูวิธีการโดยละเอียดในการใช้ cc_fuzz ได้ที่เอกสารประกอบการทดสอบข้อบกพร่องด้วย libFuzzer หากต้องการแก้ไขข้อผิดพลาดในการสร้าง ให้อัปเดตการเชื่อมโยงด้วยบริการและชื่อโปรแกรมจำลองใหม่ สำหรับบริการ Java หรือ Rust รายการ Fuzzer จะว่างเปล่า