एआईडीएल फ़ज़िंग

फ़ज़र जनरेट किए गए स्टब के माध्यम से इसे आयात/आह्वान करके दूरस्थ सेवा के लिए क्लाइंट के रूप में व्यवहार करता है:

C++ API का उपयोग करना:

#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;
}

रस्ट एपीआई का उपयोग करना:

#![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);
});

एआईडीएल सेवाओं को फ़ज़ करने के लिए रूपरेखा

जैसा कि ऊपर दिए गए उदाहरण में दिखाया गया है, फ़ज़सर्विस को फ़ज़र में कॉल किया जाता है और इनपुट पैरामीटर के रूप में एक IBinder (सेवा) और डेटाप्रोवाइडर को लेता है। यह पहले डेटा प्रदाता का उपयोग करके एक यादृच्छिक पार्सल ऑब्जेक्ट को प्रारंभ करता है और इनपुट पार्सल का उपयोग करके रिमोट सेवा पर लेनदेन विधि को कॉल करता है, और अंत में उत्तर पार्सल में उत्तर प्राप्त करता है।

फ़ज़र्स बनाएं और चलाएं

फ़ज़र्स डिफ़ॉल्ट रूप से कवरेज के साथ बनाए जाते हैं।

स्मृति समस्याओं का पता लगाने के लिए निम्नलिखित सैनिटाइज़र की सिफारिश की जाती है। hwaddress सैनिटाइज़र केवल arm आर्किटेक्चर पर चलते हैं:

SANITIZE_HOST=address SANITIZE_TARGET=hwaddress

libFuzzer के साथ चलते समय, एक कॉर्पस, जो एक निर्देशिका है, Android.bp फ़ाइल में निर्दिष्ट किया जा सकता है, और आप इस निर्देशिका को फ़ज़र में पास कर सकते हैं। कुछ फ़ज़र्स अपनी Android.bp फ़ाइल में एक dictionary: भी निर्दिष्ट करते हैं, और आप इसे -dict path/to/dict के साथ libFuzzer में पास कर सकते हैं। अधिक विकल्पों के लिए, आधिकारिक libFuzzer दस्तावेज़ देखें।

डिवाइस पर फ़ज़र्स चलाने के लिए, adb sync data और फिर adb shell data/fuzz/ arch / name / name चलाएँ। होस्ट पर फ़ज़र्स चलाने के लिए, $ANDROID_HOST_OUT/ fuzz / arch / name / name चलाएँ।

बिल्ड सिस्टम जाँचता है कि क्या प्रत्येक AOSP बाइंडर सेवा में सर्विस फ़ज़र बाइंडिंग में फ़ज़र प्रविष्टि है। फ़ज़र बाइंडिंग परीक्षण जाँचता है कि service_contexts में प्रत्येक सेवा में फ़ज़र है। यदि किसी नई सेवा के लिए फ़ज़र/अपवाद नहीं मिलता है, तो निर्माण त्रुटि है।

निम्नलिखित को जोड़कर एक स्वचालित C++ सेवा फ़ज़र लिखा जा सकता है (जावा और रस्ट फ़ज़र अभी तक समर्थित नहीं हैं):

  • फ़ज़र मॉड्यूल को परिभाषित करने के लिए Android.bp में एक cc_fuzz प्रविष्टि। cc_default मॉड्यूल service_fuzzer_defaults में fuzzService के लिए आवश्यक निर्भरताएँ हैं।
  • सेवा-विशिष्ट निर्भरताएँ लाइब्रेरी या स्रोतों के रूप में जोड़ी जानी चाहिए।
  • एक मुख्य फ़ाइल जो आपकी सेवा बनाती है और fuzzService कॉल करती है

cc_fuzz उपयोग करने पर विस्तृत निर्देशों के लिए, फ़ज़िंग विद libFuzzer दस्तावेज़ देखें। बिल्ड त्रुटि को हल करने के लिए, नई सेवा और फ़ज़र नामों के साथ बाइंडिंग को अपडेट करें। जावा/रस्ट सेवाओं के लिए, फ़ज़र सूची खाली हो सकती है।