Testowanie z użyciem AIDL

Fuzzer działa jak klient usługi zdalnej, importując ją lub wywołując za pomocą wygenerowanego zastępnika:

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

Korzystanie z 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, metoda fuzzService jest wywoływana w fuzzerze i przyjmuje jako parametry wejściowe IBinder (Service) i dataProvider. Najpierw inicjuje losowy obiekt Parcel za pomocą dostawcy danych, a następnie wywołuje metodę transact w usłudze zdalnej, używając obiektu inputParcel, i w końcu uzyskuje odpowiedź w obiektie replyParcel.

Tworzenie i uruchamianie narzędzi do testowania losowości

Rozmywacze są tworzone domyślnie z funkcją pokrycia.

Aby wykryć problemy z pamięcią, zalecamy użycie tych narzędzi do sprawdzania kodu. hwaddress dezynfekujące działają tylko w architekturze arm:

SANITIZE_HOST=address SANITIZE_TARGET=hwaddress

Podczas uruchamiania narzędzia libFuzzer w pliku Android.bp można określić korpus, który jest katalogiem. Następnie można przekazać ten katalog do fuzzera. Niektóre zamazywacze określają też właściwość dictionary: w swoim pliku Android.bp, przekaż to do libFuzzer za pomocą -dict path/to/dict. Więcej opcji znajdziesz w oficjalnej dokumentacji libFuzzer.

Aby uruchomić zamazania na urządzeniu, uruchom adb sync data, a następnie adb shell data/fuzz/arch/name/name Aby uruchomić premie na hoście, uruchom polecenie $ANDROID_HOST_OUT/fuzz/arch/name/name

System kompilacji sprawdza, czy każda usługa tworzenia powiązań AOSP ma wpis za pomocą funkcji Fuzzer powiązania usługi Fuzzer. Test wiązania fuzzera sprawdza, czy każda usługa w service_contexts ma fuzzera. Jeśli nie uda się znaleźć fuzzera ani wyjątku dla nowej usługi, wystąpi błąd kompilacji.

Automatyczny fuzzer usługi w C++ można napisać, dodając te elementy (fuzzery w Javie i Rust nie są jeszcze obsługiwane):

  • Wpis cc_fuzz w Android.bp, który określa moduł rozmycia. Moduł service_fuzzer_defaults aplikacji cc_default ma zależności wymagane przez fuzzService
  • 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 tutaj Fuzz z libFuzzer dokumentacji. Aby rozwiązać problem z kompilacją, zaktualizuj powiązania, podając nowe nazwy usługi i fuzzera. W przypadku usług w Javie lub Rust lista fuzzera może być pusta.