模糊測試器會透過產生的存根節點匯入或叫用遠端服務,並以用戶端的形式運作:
使用 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 物件,然後使用輸入的 Parcel 在遠端服務上呼叫 transact 方法,最後將回覆放入回覆 Parcel。
建構並執行模糊工具
根據預設,模糊不清。
建議使用下列清理器來找出記憶體問題。hwaddress
清理器僅可在 arm
架構上執行:
SANITIZE_HOST=address SANITIZE_TARGET=hwaddress
使用 libFuzzer
執行時 (也就是目錄),系統可能會指定
下的 Android.bp
檔案,將此目錄傳送給模糊程式。只有部分通知
模糊工具也會在其 Android.bp
檔案中指定 dictionary:
,而您可以
使用 -dict path/to/dict
將此字串傳遞至 libFuzzer。適用對象
請參閱
官方 libFuzzer 說明文件
如要在裝置上執行模糊測試器,請依序執行 adb sync data
和 adb shell data/fuzz/arch/name/name
。如要在主機上執行模糊測試工具,請執行 $ANDROID_HOST_OUT/fuzz/arch/name/name
。
為新服務或現有服務推薦模糊功能
建構系統會檢查每個 Android 開放原始碼計畫繫結器服務是否在
服務模糊繫結。
模糊繫結測試會檢查 service_contexts
中的每個服務都具有
模糊。如果在新服務中找不到模糊化或例外狀況,即會有建構
錯誤。
您可以透過新增下列程式碼 (Java 和 目前不支援 Rust 模糊測試器:
Android.bp
中的cc_fuzz
項目,用於定義模糊測試模組。cc_default
模組service_fuzzer_defaults
具有fuzzService
所需的依附元件。- 服務專屬的依附元件應新增為程式庫或來源。
- 建構服務並呼叫
fuzzService
的主要檔案
如需使用 cc_fuzz
的詳細操作說明,請參閱
使用 libFuzzer 執行模糊測試
說明文件。如要解決建構錯誤,請使用新的服務和模糊測試器名稱更新繫結。如果是 Java 或 Rust 服務,可將 fuzzer 清單設為空白。