Fuzzer, oluşturulan saplama aracılığıyla içe aktararak veya çağırarak uzak hizmetin istemcisi gibi davranır:
C++ API'yi kullanma:
#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'yi kullanma:
#![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 hizmetlerini bulanıklaştırma çerçevesi
Yukarıdaki örnekte gösterildiği gibi, fuzzService, Fuzzer'da çağrılır ve giriş parametreleri olarak bir IBinder (Service) ve dataProvider alır. Öncelikle veri sağlayıcıyı kullanarak rastgele bir Parcel nesnesi başlatır, giriş paketini kullanarak uzak hizmette işlem yöntemini çağırır ve son olarak yanıtı bir yanıt paketine alır.
Fuzzer oluşturma ve çalıştırma
Fuzzers, varsayılan olarak kapsamla oluşturulur.
Aşağıdaki temizleyiciler, bellek sorunlarını tespit etmek için önerilir.
hwaddress
temizleyiciler yalnızca arm
mimarisinde çalışır:
SANITIZE_HOST=address SANITIZE_TARGET=hwaddress
libFuzzer
ile çalıştırıldığında, Android.bp
dosyasında bir dizin olan bir gövde belirtilebilir ve bu dizini fuzzer'a iletebilirsiniz. Bazı fuzzing araçları, Android.bp
dosyalarında dictionary:
de belirtir ve bunu -dict path/to/dict
ile libFuzzer'a iletebilirsiniz. Daha fazla seçenek için resmi libFuzzer belgelerine bakın.
Cihazda fuzzers çalıştırmak için adb sync data
ve ardından adb shell data/fuzz/arch/name/name
komutunu çalıştırın.
Ana makinede fuzzers çalıştırmak için $ANDROID_HOST_OUT/fuzz/arch/name/name
komutunu çalıştırın.
Yeni veya mevcut hizmetler için fuzzing araçları önerin
Derleme sistemi, her AOSP bağlayıcı hizmetinin service fuzzer bindings içinde bir fuzzer girişi olup olmadığını kontrol eder.
Fuzzer bağlama testi, service_contexts
içindeki her hizmetin bir Fuzzer'ı olduğunu kontrol eder. Yeni bir hizmet için fuzzer veya istisna bulunamazsa derleme hatası oluşur.
Aşağıdakiler eklenerek otomatik bir C++ hizmeti fuzzer'ı yazılabilir (Java ve Rust fuzzer'ları henüz desteklenmemektedir):
- Fuzzing modülünü tanımlamak için
Android.bp
içindecc_fuzz
girişi.cc_default
modülüservice_fuzzer_defaults
,fuzzService
için gerekli bağımlı öğelere sahip. - Hizmete özgü bağımlılıklar, kitaplık veya kaynak olarak eklenmelidir.
- Hizmetinizi oluşturan ve
fuzzService
işlevini çağıran bir ana dosya
cc_fuzz
kullanımıyla ilgili ayrıntılı talimatlar için Fuzzing with libFuzzer (libFuzzer ile bulanıklaştırma) dokümanlarına bakın. Derleme hatasını gidermek için bağlamaları yeni hizmet ve fuzzing aracı adlarıyla güncelleyin. Java veya Rust hizmetleri için bulanıklaştırma testi listesi boş olabilir.