Fuzzer, içe aktarma veya çağırarak uzak hizmet için bir istemci gibi davranır URL'yi oluşturun:
C++ API'sini kullanarak:
#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 kullanarak:
#![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 (Hizmet) 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.
Boşluk doldurucu oluşturma ve çalıştırma
Fuzzer'lar varsayılan olarak kapsam ile oluşturulur.
Bellek sorunlarını tespit etmek için aşağıdaki temizleyiciler önerilir.
hwaddress
dezenfektanlar yalnızca arm
mimarisinde çalışıyor:
SANITIZE_HOST=address SANITIZE_TARGET=hwaddress
libFuzzer
ile çalıştırıldığında, Android.bp
dosyasında bir dizin olan bir corpus belirtilebilir ve bu dizini fuzzer'a iletebilirsiniz. Biraz
fuzzers'lar Android.bp
dosyasında bir dictionary:
belirtir ve
bunu -dict path/to/dict
ile libFuzzer'a iletin. Örneğin,
diğer seçenekler için
resmi libFuzzer dokümanlarına göz atın.
Cihazda fuzzer'ları çalıştırmak için adb sync data
komutunu çalıştırın, ardından
adb shell data/fuzz/arch/name/name
.
Ana makinede fuzzer'ları çalıştırmak için
$ANDROID_HOST_OUT/fuzz/arch/name/name
Yeni veya mevcut hizmetler için fuzzer öner
Derleme sistemi, her AOSP bağlayıcı hizmetinde bir fuzzer girişi olup olmadığını kontrol eder
hizmet fuzzer bağlamaları ile değiştirin.
Bulanıklaştırma bağlama testi, service_contexts
içindeki her hizmetin bulanıklaştırıcısı olup olmadığını kontrol eder. Yeni bir hizmet için bir fuzzer veya istisna bulunamazsa derleme hatası vardır.
Aşağıdakiler eklenerek otomatik bir C++ hizmet fuzzer'ı yazılabilir (Java ve Rust fuzzer'ları henüz desteklenmemektedir):
- Fuzzer modülünü tanımlamak için
Android.bp
içinde bircc_fuzz
girişi. İlgili içeriği oluşturmak için kullanılancc_default
modülündeservice_fuzzer_defaults
için gereken bağımlılıklar varfuzzService
. - Hizmete özgü bağımlılıklar kitaplık veya kaynak olarak eklenmelidir.
- Hizmetinizi oluşturan ve
fuzzService
çağrısı yapan bir ana dosya
cc_fuzz
'ü kullanmayla ilgili ayrıntılı talimatlar için libFuzzer ile Fuzzing dokümanlarına bakın. Derleme hatasını çözmek için bağlamaları yeni hizmetle güncelleyin ve
daha iyi olabilir. Java veya Rust hizmetleri için fuzzer listesi boş olabilir.