Fuzzing AIDL

Fuzzer AIDL

El fuzzer se comporta como un cliente para el servicio remoto al importarlo/invocarlo a través del stub generado:

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

Framework para fuzzear servicios AIDL

Como se muestra en el ejemplo anterior, se llama a fuzzService en el fuzzer y toma un IBinder (Servicio) y un proveedor de datos como parámetros de entrada. Primero inicializa un objeto Parcel aleatorio usando el proveedor de datos y llama al método de transacción en el servicio remoto usando el paquete de entrada y finalmente obtiene la respuesta en un paquete de respuesta.