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

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

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 के साथ libFüz में पास कर सकते हैं. ज़्यादा विकल्पों के लिए, libFüz का आधिकारिक दस्तावेज़ देखें.

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

बिल्ड सिस्टम यह जांच करता है कि सेवा फ़ज़र बाइंडिंग में हर एओएसपी बाइंडर सेवा की फ़ज़र एंट्री है या नहीं. फ़ज़र बाइंडिंग टेस्ट से यह पता चलता है कि service_contexts में मौजूद हर सेवा में एक फ़ज़र है या नहीं. अगर नई सेवा के लिए कोई फ़ज़र या अपवाद नहीं मिलता है, तो बिल्ड से जुड़ी गड़बड़ी है.

C++ सर्विस फ़ज़र अपने-आप लागू होने के लिए, इनमें से कोई एक जोड़ें (Java और रस्ट फ़ज़र फ़िलहाल काम नहीं करते हैं):

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

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