โปรแกรมสร้างข้อมูลที่ไม่ถูกต้องจะทํางานเป็นไคลเอ็นต์สําหรับบริการระยะไกลโดยการนําเข้าหรือเรียกใช้ผ่านสแต็บที่สร้างขึ้น
การใช้ 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 แบบสุ่มโดยใช้ผู้ให้บริการข้อมูล และเรียกใช้เมธอด transact ในบริการระยะไกลโดยใช้พาร์เซลอินพุต และสุดท้ายรับการตอบกลับไปยังพาร์เซลการตอบกลับ
สร้างและเรียกใช้โปรแกรมตรวจหาช่องโหว่
โปรแกรมสร้างข้อมูลเท็จจะสร้างขึ้นโดยครอบคลุมโดยค่าเริ่มต้น
เราขอแนะนําให้ใช้โปรแกรมตรวจสอบต่อไปนี้เพื่อค้นหาปัญหาเกี่ยวกับหน่วยความจํา
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 ของบริการหรือไม่
การทดสอบการเชื่อมโยงโปรแกรมสร้างข้อมูลเท็จจะตรวจสอบว่าบริการทุกรายการใน service_contexts
มีโปรแกรมสร้างข้อมูลเท็จ หากไม่พบ Fuzzer หรือข้อยกเว้นสําหรับบริการใหม่ แสดงว่ามีข้อผิดพลาดในการสร้าง
คุณสามารถเขียนโปรแกรม Fuzzer บริการ C++ อัตโนมัติได้โดยเพิ่มรายการต่อไปนี้ (ระบบยังไม่รองรับ Fuzzer ของ Java และ Rust)
- รายการ
cc_fuzz
ในAndroid.bp
เพื่อกำหนดโมดูล Fuzzercc_default
โมดูลservice_fuzzer_defaults
มีการขึ้นต่อกันที่จําเป็นสําหรับfuzzService
- คุณควรเพิ่มการพึ่งพาเฉพาะบริการเป็นไลบรารีหรือแหล่งที่มา
- ไฟล์หลักที่สร้างบริการและเรียก
fuzzService
ดูวิธีการโดยละเอียดในการใช้ cc_fuzz
ได้ที่เอกสารประกอบการทดสอบข้อบกพร่องด้วย libFuzzer หากต้องการแก้ไขข้อผิดพลาดในการสร้าง ให้อัปเดตการเชื่อมโยงด้วยบริการและชื่อโปรแกรมจำลองใหม่ สำหรับบริการ Java หรือ Rust รายการ Fuzzer อาจว่างเปล่าได้