Bulanıklaştırma aracı, oluşturulan stub aracılığıyla uzak hizmet için istemci 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 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ırmak için çerçeve
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
Bulanıklaştırma araçları varsayılan olarak kapsamla oluşturulur.
Bellek sorunlarının tespit edilmesi için aşağıdaki dezenfektanlar önerilir.
hwaddress
temizleyiciler yalnızca arm
mimarisinde çalışır:
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 dictionary:
de belirtir. Bu değeri -dict path/to/dict
ile libFuzzer'a iletebilirsiniz. Daha fazla seçenek için resmi libFuzzer belgelerine bakın.
Cihaz üzerinde fuzzer'ları çalıştırmak için adb sync data
'ü ve ardından adb shell data/fuzz/arch/name/name
'ü ç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 önerin
Derleme sistemi, her AOSP bağlayıcı hizmetinin hizmet hata ayıklama bağlamalarında bir hata ayıklama girişi olup olmadığını kontrol eder.
Bulanıklaştırma bağlama testi, service_contexts
içindeki her hizmetin bir bulanıklaştırıcıya sahip olup olmadığını kontrol eder. Yeni bir hizmet için bir fuzzer veya istisna bulunamadıysa derleme hatası vardır.
Aşağıdakiler eklenerek otomatik bir C++ hizmet fuzzer'ı yazılabilir (Java ve Rust fuzzer'ları henüz desteklenmemektedir):
Android.bp
modülünde, fuzzer modülünü tanımlamak için bircc_fuzz
girişi.cc_default
modülüservice_fuzzer_defaults
,fuzzService
için gerekli bağımlı öğelere sahiptir.- 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 ve fuzzer adlarıyla güncelleyin. Java veya Rust hizmetleri için fuzzer listesi boş olabilir.