Фаззер ведет себя как клиент удаленного сервиса, импортируя или вызывая его через сгенерированную заглушку:
Использование 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 (Service) и dataProvider в качестве входных параметров. Сначала он инициализирует случайный объект Parcel, используя поставщика данных, вызывает метод транзакции удаленной службы, используя входной пакет, и, наконец, помещает ответ в ответный пакет.
Создание и запуск фаззеров
По умолчанию фаззеры создаются с покрытием.
Следующие дезинфицирующие средства рекомендуются для обнаружения проблем с памятью. Дезинфицирующие средства hwaddress
работают только на архитектуре arm
:
SANITIZE_HOST=address SANITIZE_TARGET=hwaddress
При работе с libFuzzer
в файле Android.bp
можно указать корпус, который является каталогом, и передать этот каталог фаззеру. Некоторые фаззеры также указывают dictionary:
в своем файле Android.bp
, и вы можете передать его в libFuzzer с помощью -dict path/to/dict
. Дополнительные параметры см. в официальной документации libFuzzer .
Чтобы запустить фаззеры на устройстве, запустите adb sync data
, а затем adb shell data/fuzz/ arch / name / name
. Чтобы запустить фаззеры на хосте, запустите $ANDROID_HOST_OUT/ fuzz / arch / name / name
.
Рекомендовать фаззеры для новых или существующих сервисов
Система сборки проверяет, есть ли у каждой службы связывания AOSP запись фаззера в привязках фаззера службы . Тест привязки фаззера проверяет, что у каждого сервиса в service_contexts
есть фаззер. Если для новой службы не найден фаззер или исключение, значит, произошла ошибка сборки.
Автоматический фаззер сервисов C++ можно написать, добавив следующее (фазззеры Java и Rust пока не поддерживаются):
- Запись
cc_fuzz
вAndroid.bp
для определения модуля фаззера. Модульcc_default
service_fuzzer_defaults
имеет зависимости, необходимые дляfuzzService
. - Зависимости, специфичные для службы, следует добавлять в виде библиотеки или источников.
- Основной файл, который создает ваш сервис и вызывает
fuzzService
Подробные инструкции по использованию cc_fuzz
см. в документации Фаззинг с помощью libFuzzer . Чтобы устранить ошибку сборки, обновите привязки, указав новые имена службы и фаззера. Для сервисов Java или Rust список фаззера может быть пустым.