Фаззер выступает в роли клиента для удалённого сервиса, импортируя или вызывая его через сгенерированный заглушечный файл:
Использование 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;
}
Использование API Rust:
#![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, используя dataProvider, затем вызывает метод transact на удаленном сервисе, используя входной объект Parcel, и, наконец, получает ответ в виде объекта reply.
Соберите и запустите фаззеры.
Фаззеры по умолчанию создаются с учетом покрытия кода.
Для выявления проблем с памятью рекомендуются следующие средства проверки адресов. Средства проверки 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 Binder запись фаззера в разделе привязок фаззера сервиса . Тест привязки фаззера проверяет, есть ли фаззер у каждого сервиса в service_contexts . Если фаззер или исключение для нового сервиса не найдены, возникает ошибка сборки.
Автоматический фаззер для сервисов на C++ можно написать, добавив следующее (фаззеры для Java и Rust пока не поддерживаются):
- Запись
cc_fuzzвAndroid.bpдля определения модуля фаззера. Модульcc_defaultservice_fuzzer_defaultsимеет зависимости, необходимые дляfuzzService. - Зависимости, специфичные для конкретного сервиса, следует добавлять либо в виде библиотек, либо в виде исходных файлов.
- Основной файл, который создает ваш сервис и вызывает
fuzzService
Подробные инструкции по использованию cc_fuzz см. в документации по фаззингу с помощью libFuzzer . Для устранения ошибки сборки обновите привязки, указав новые имена сервиса и фаззера. Для сервисов Java или Rust список фаззеров может быть пустым.