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;
}

การใช้สนิม 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 จะถูกเรียกใน 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

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

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

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

สำหรับคำแนะนำโดยละเอียดเกี่ยวกับการใช้ cc_fuzz โปรดดูเอกสาร Fuzzing with libFuzzer หากต้องการแก้ไขข้อผิดพลาดของบิลด์ ให้อัปเดตการเชื่อมโยงด้วยบริการใหม่และชื่อ fuzzer สำหรับบริการ Java/Rust รายการ fuzzer สามารถเว้นว่างได้