AIDL Fuzzing,AIDL Fuzzing

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.

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 bir cc_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.