AIDL fuzzing

Fuzzer, oluşturulan saplama aracılığıyla içe aktararak veya çağırarak uzak hizmet için istemci gibi davranır:

C++ API'yi 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'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ırma çerçevesi

Yukarıdaki örnekte gösterildiği gibi, fuzzService, Fuzzer'da çağrılır ve giriş parametreleri olarak IBinder (Service) ile 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.

Fuzzer oluşturma ve çalıştırma

Fuzzer'lar varsayılan olarak kapsamla oluşturulur.

Bellek sorunlarını keşfetmek için aşağıdaki temizleyiciler önerilir. hwaddress temizleyiciler yalnızca arm mimarisinde çalışır:

SANITIZE_HOST=address SANITIZE_TARGET=hwaddress

libFuzzer ile çalıştırıldığında, Android.bp dosyasında bir dizin olan bir gövde belirtilebilir ve bu dizini fuzzer'a iletebilirsiniz. Bazı fuzz test araçları, dictionary: dosyalarında Android.bp da belirtir ve bunu -dict path/to/dict ile libFuzzer'a iletebilirsiniz. Daha fazla seçenek için resmi libFuzzer belgelerine bakın.

Cihazda fuzzing araçlarını çalıştırmak için adb sync data ve ardından adb shell data/fuzz/arch/name/name komutunu çalıştırın. Ana makinede fuzzers çalıştırmak için $ANDROID_HOST_OUT/fuzz/arch/name/name komutunu çalıştırın.

Derleme sistemi, her AOSP bağlayıcı hizmetinin service fuzzer bindings içinde bir bulanıklaştırma testi girişi olup olmadığını kontrol eder. Fuzzer bağlama testi, service_contexts içindeki her hizmetin bir Fuzzer'ı olduğunu kontrol eder. Yeni bir hizmet için fuzzer veya istisna bulunamazsa derleme hatası oluşur.

Aşağıdakiler eklenerek otomatik bir C++ hizmeti fuzzer'ı yazılabilir (Java ve Rust fuzzer'ları henüz desteklenmemektedir):

  • Fuzzing modülünü tanımlamak için Android.bp içinde cc_fuzz girişi. cc_default modülü service_fuzzer_defaults, fuzzService için gerekli bağımlılıklara sahip.
  • Hizmete özgü bağımlılıklar, kitaplık veya kaynak olarak eklenmelidir.
  • Hizmetinizi oluşturan ve fuzzService işlevini çağıran bir ana dosya

cc_fuzz kullanımıyla ilgili ayrıntılı talimatlar için Fuzzing with libFuzzer dokümanına bakın. Derleme hatasını gidermek için bağlamaları yeni hizmet ve fuzzing aracı adlarıyla güncelleyin. Java veya Rust hizmetleri için bulanıklaştırma testi listesi boş olabilir.