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