Fuzzer, oluşturulan saplama aracılığıyla uzak hizmeti içe veya çağırarak uzak hizmetin bir istemcisi gibi davranır:
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 (Service) ile dataProvider'ı alır. İlk olarak veri sağlayıcıyı kullanarak rastgele bir Parsel nesnesini 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'lar oluşturup çalıştırın
Fuzzer'lar varsayılan olarak kapsam ile oluşturulur.
Bellek sorunlarının tespit edilmesi için aşağıdaki dezenfektanlar önerilir.
hwaddress
dezenfektanlar yalnızca arm
mimarisinde çalışıyor:
SANITIZE_HOST=address SANITIZE_TARGET=hwaddress
libFuzzer
ile çalışırken Android.bp
dosyasında dizin olan bir topluluk belirtilebilir ve bu dizini fuzzer'a geçirebilirsiniz. Bazı fuzzer'lar Android.bp
dosyalarında bir dictionary:
belirtir ve bunu -dict path/to/dict
ile libFuzzer'a aktarabilirsiniz. Daha fazla seçenek için resmi libFuzzer belgelerine bakın.
Cihazda fuzzer'ları çalıştırmak için adb sync data
komutunu, ardından adb shell data/fuzz/arch/name/name
komutunu çalıştırın.
Ana makinede fuzzer'ları çalıştırmak için $ANDROID_HOST_OUT/fuzz/arch/name/name
komutunu çalıştırın.
Yeni veya mevcut hizmetler için fuzzer öner
Derleme sistemi, her AOSP bağlayıcı hizmetinin hizmet fuzzer bağlamalarında fuzzer girişi olup olmadığını kontrol eder.
Fuzzer bağlama testi, service_contexts
içindeki her hizmetin bir fuzzer'ı olup olmadığını kontrol eder. Yeni bir hizmet için fuzzer veya istisna bulunamazsa bir derleme hatası vardır.
Aşağıdakiler eklenerek otomatik bir C++ hizmeti fuzzer yazılabilir (Java ve pas fuzzer'ları henüz desteklenmemektedir):
- Fuzzer modülünü tanımlamak için
Android.bp
dilindecc_fuzz
girişi.service_fuzzer_defaults
adlıcc_default
modülündefuzzService
için gereken bağımlılıklar mevcut. - 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
kullanımıyla ilgili ayrıntılı talimatlar için libFuzzer ile Fuzzing belgelerine bakın. Derleme hatasını çözmek için bağlamaları yeni hizmetle ve fuzzer adlarıyla güncelleyin. Java veya Rust hizmetlerinde fuzzer listesi boş olabilir.