AIDL fuzzing

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

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 bir cc_fuzz girişi. İlgili içeriği oluşturmak için kullanılan cc_default modülünde service_fuzzer_defaults için gereken bağımlılıklar var fuzzService.
  • 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.