Fuzzer, oluşturulan saplama aracılığıyla uzak hizmetin içe aktarılması/çağırılması yoluyla uzak hizmet için bir istemci gibi davranır:
C++ API'sini 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'sini 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 yumuşatmaya yönelik çerçeve
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. İlk önce veri sağlayıcıyı kullanarak rastgele bir Parsel nesnesini başlatır ve giriş paketini kullanarak uzak hizmetteki transact yöntemini çağırır ve son olarak yanıtı bir yanıt paketine alır.
Fuzzer'ları oluşturun ve çalıştırın
Fuzzer'lar varsayılan olarak kapsama alanıyla oluşturulmuştur.
Bellek sorunlarını keşfetmek için aşağıdaki dezenfektanların kullanılması önerilir. hwaddress
dezenfektanları yalnızca arm
mimarisinde çalışır:
SANITIZE_HOST=address SANITIZE_TARGET=hwaddress
libFuzzer
ile çalışırken Android.bp
dosyasında bir dizin olan bir korpus belirtilebilir ve bu dizini fuzzer'a iletebilirsiniz. Bazı fuzzer'lar Android.bp
dosyasında bir dictionary:
de belirtirler ve bunu -dict path/to/dict
ile libFuzzer'a iletebilirsiniz. Daha fazla seçenek için resmi libFuzzer belgelerine bakın.
Fuzzer'ları cihazda çalıştırmak için, adb sync data
ve ardından adb shell data/fuzz/ arch / name / name
çalıştırın. Fuzzer'ları ana bilgisayarda çalıştırmak için $ANDROID_HOST_OUT/ fuzz / arch / name / name
çalıştırın.
Yeni/mevcut hizmetler için fuzzer'ların önerilmesi
Derleme sistemi, her AOSP bağlayıcı hizmetinin , hizmet fuzzer bağlamalarında bir fuzzer girişi olup olmadığını kontrol eder. Fuzzer bağlama testi, service_contexts
her hizmetin bir fuzzer'a sahip olup olmadığını kontrol eder. Yeni bir hizmet için fuzzer/istisna bulunamazsa bir derleme hatası vardır.
Otomatik bir C++ hizmeti fuzzer'ı aşağıdakiler eklenerek yazılabilir (Java ve Rust fuzzer'lar henüz desteklenmemektedir):
- Fuzzer modülünü tanımlamak için
Android.bp
bircc_fuzz
girişi.cc_default
modülüservice_fuzzer_defaults
fuzzService
için gerekli bağımlılıklara sahiptir. - Hizmete özgü bağımlılıklar kitaplık veya kaynak olarak eklenmelidir.
- Hizmetinizi oluşturan ve
fuzzService
çağıran bir ana dosya
cc_fuzz
kullanımına ilişkin ayrıntılı talimatlar için libFuzzer ile Fuzzing belgelerine bakın. Derleme hatasını çözmek için bağlamaları yeni hizmet ve fuzzer adlarıyla güncelleyin. Java/Rust hizmetleri için fuzzer listesi boş olabilir.