Fuzzer berperilaku sebagai klien untuk layanan jarak jauh dengan mengimpor/memanggilnya melalui stub yang dihasilkan:
Menggunakan API C++:
#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;
}
Menggunakan API Karat:
#![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);
});
Kerangka kerja untuk mengaburkan layanan AIDL
Seperti yang ditunjukkan pada contoh di atas, fuzzService dipanggil di fuzzer dan menggunakan IBinder (Layanan) dan dataProvider sebagai parameter input. Pertama-tama menginisialisasi objek Parcel acak menggunakan penyedia data dan memanggil metode transaksi pada layanan jarak jauh dengan menggunakan input parsel, dan terakhir mendapatkan balasan ke dalam parsel balasan.
Bangun dan jalankan fuzzer
Fuzzer dibuat dengan cakupan secara default.
Pembersih berikut direkomendasikan untuk mengatasi masalah memori. pembersih hwaddress
hanya berjalan pada arsitektur arm
:
SANITIZE_HOST=address SANITIZE_TARGET=hwaddress
Saat dijalankan dengan libFuzzer
, korpus, yang merupakan direktori, dapat ditentukan dalam file Android.bp
, dan Anda dapat meneruskan direktori ini ke fuzzer. Beberapa fuzzer juga menentukan dictionary:
dalam file Android.bp
mereka, dan Anda dapat meneruskannya ke libFuzzer dengan -dict path/to/dict
. Untuk opsi lebih lanjut, lihat dokumentasi resmi libFuzzer .
Untuk menjalankan fuzzer di perangkat, jalankan adb sync data
lalu adb shell data/fuzz/ arch / name / name
. Untuk menjalankan fuzzer di host, jalankan $ANDROID_HOST_OUT/ fuzz / arch / name / name
.
Merekomendasikan fuzzer untuk layanan baru/yang sudah ada
Sistem pembangunan memeriksa apakah setiap layanan pengikat AOSP memiliki entri fuzzer dalam pengikatan fuzzer layanan . Tes pengikatan Fuzzer memeriksa apakah setiap layanan di service_contexts
memiliki fuzzer. Jika fuzzer/pengecualian tidak ditemukan untuk layanan baru, ada kesalahan build.
Fuzzer layanan C++ otomatis dapat ditulis dengan menambahkan yang berikut (fuzzer Java dan Rust belum didukung):
- Entri
cc_fuzz
diAndroid.bp
untuk mendefinisikan modul fuzzer. Modulcc_default
service_fuzzer_defaults
memiliki dependensi yang diperlukan untukfuzzService
. - Ketergantungan khusus layanan harus ditambahkan sebagai perpustakaan atau sebagai sumber.
- File utama yang membangun layanan Anda dan memanggil
fuzzService
Untuk petunjuk detail tentang penggunaan cc_fuzz
, lihat dokumentasi Fuzzing dengan libFuzzer . Untuk mengatasi kesalahan build, perbarui pengikatan dengan layanan baru dan nama fuzzer. Untuk layanan Java/Rust, daftar fuzzer boleh kosong.