Fuzzer działa jako klient usługi zdalnej, importując lub wywołując ją przy użyciu wygenerowanego namiaru:
Użycie interfejsu API języka 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;
}
Za pomocą interfejsu 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);
});
Platforma do ukrywania usług AIDL
Jak widać w przykładzie powyżej, funkcja fuzzService jest wywoływana w fuzzer i jako parametry wejściowe pobiera IBinder (Service) i dataProvider. Najpierw inicjuje losowy obiekt Parcel przy użyciu dostawcy danych i wywołuje metodę transakcji w usłudze zdalnej przy użyciu działki wejściowej, a na koniec przesyła odpowiedź do przesyłki zwrotnej.
Buduj i uruchamiaj sprężyny
Rozmywacze są tworzone domyślnie z funkcją pokrycia.
Do wykrywania problemów z pamięcią zalecamy poniższe środki dezynfekcyjne.
Środki do dezynfekcji hwaddress
działają tylko w architekturze arm
:
SANITIZE_HOST=address SANITIZE_TARGET=hwaddress
W przypadku uruchomienia kodu libFuzzer
w pliku Android.bp
można określić korpus będący katalogiem i przekazać ten katalog do aplikacji Fuzzer. Niektóre programy do czyszczenia określają też w swoim pliku Android.bp
element dictionary:
, który można przekazać do libFuzzer za pomocą polecenia -dict path/to/dict
. Więcej opcji znajdziesz w oficjalnej dokumentacji libFuzzer.
Aby uruchomić zamazania na urządzeniu, uruchom polecenie adb sync data
, a następnie
adb shell data/fuzz/arch/name/name
.
Aby uruchomić preparaty do rozmycia na hoście, uruchom polecenie $ANDROID_HOST_OUT/fuzz/arch/name/name
.
Zalecaj usługi rozmywające dla nowych lub istniejących usług
System kompilacji sprawdza, czy każda usługa powiązań AOSP ma wpis rozmycia w powiązaniach usługi fuzzer.
W ramach testu wiązania Fuzzer sprawdza się, czy każda usługa w service_contexts
ma rozmycie. Jeśli dla nowej usługi nie zostanie znaleziony filtr lub wyjątek, oznacza to błąd kompilacji.
Automatyczny mechanizm rozmywający usługi w języku C++ można utworzyć, dodając ten kod (rozmywacze Java i Rust nie są jeszcze obsługiwane):
- Wpis
cc_fuzz
wAndroid.bp
, który określa moduł rozmycia. Modułservice_fuzzer_defaults
usługicc_default
zawiera zależności wymagane przezfuzzService
. - Zależności zależne od usługi należy dodać jako bibliotekę lub jako źródła.
- Główny plik, który tworzy usługę i wywołuje
fuzzService
.
Szczegółowe instrukcje korzystania z cc_fuzz
znajdziesz w dokumentacji Fuzzing with libFuzzer. Aby naprawić błąd kompilacji, zaktualizuj powiązania przy użyciu nowej usługi i nazw zamazywania. W przypadku usług Java lub Rust lista zamazywania może być pusta.