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

फ़ज़र, इंपोर्ट या ट्रिगर करके रिमोट सेवा के लिए क्लाइंट की तरह काम करता है इसे जनरेट किए गए स्टब से चलाया जा सकता है:

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

Rust API का इस्तेमाल करके:

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

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

जैसा कि ऊपर दिए गए उदाहरण में दिखाया गया है, fuzzService को फ़ज़र में कॉल किया जाता है और वह IBinder (Service) और dataProvider को इस तरह से लेता है: इनपुट पैरामीटर. यह सबसे पहले डेटा का इस्तेमाल करके, किसी भी पार्सल ऑब्जेक्ट को शुरू करता है सेवा देने वाली कंपनी और इनपुट का इस्तेमाल करके, रिमोट सेवा पर लेन-देन के तरीके को कॉल करें की समीक्षा करें और आखिर में जवाब को जवाबी पार्सल में पाएं.

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

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

मेमोरी से जुड़ी समस्याओं का पता लगाने के लिए, ये सैनिटाइज़र इस्तेमाल करने का सुझाव दिया जाता है. 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++ सेवा के लिए अपने-आप काम करने वाला फ़ज़र लिखने के लिए, ये चीज़ें जोड़ें. फ़िलहाल, Java और Rust फ़ज़र काम नहीं करते:

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

cc_fuzz इस्तेमाल करने के बारे में ज़्यादा जानकारी के लिए, यह पढ़ें libFzzer के साथ फ़्लज़ करना दस्तावेज़. बिल्ड से जुड़ी गड़बड़ी को ठीक करने के लिए, नई सेवा और फ़ज़र के नामों के साथ बाइंडिंग अपडेट करें. Java या Rust सेवाओं के लिए, फ़ज़र की सूची खाली हो सकती है.