फ़ज़ मॉड्यूल

रस्ट फ़ज़िंग, libfuzzer-sys क्रेट के ज़रिए काम करता है. इससे ये सुविधाएं मिलती हैं बाइंडिंग. ज़्यादा जानकारी के लिए, libfuzzer-sys देखें रिपॉज़िटरी और एलएलवीएम libFazzer प्रोजेक्ट पेज भी.

rust_fuzz मॉड्यूल, फ़ज़र बाइनरी बनाता है, जो चलाएं (cc_fuzz मॉड्यूल की तरह). फ़ज़र, libFuzzer फ़ज़िंग इंजन का फ़ायदा लेता है. इसलिए, फ़ज़िंग को कंट्रोल करने के लिए, इसमें कई आर्ग्युमेंट लग सकते हैं. इनके बारे में libFuzzer दस्तावेज़ में बताया गया है.

rust_fuzz मॉड्यूल, rust_binary मॉड्यूल का एक्सटेंशन है और इस तरह का शेयर है एक जैसी प्रॉपर्टी और ज़रूरी बातें. साथ ही, ये कई ऐसी ही प्रॉपर्टी और फ़ंक्शन लागू करते हैं जो cc_fuzz मॉड्यूल करते हैं.

rust_fuzz मॉड्यूल बनाते समय, --cfg fuzzing फ़्लैग उत्सर्जित होता है. इसका इस्तेमाल, फ़ज़िंग को बेहतर बनाने के लिए लाइब्रेरी कोड के कंडीशनल कंपाइलेशन के साथ किया जा सकता है.

एक बुनियादी रस्ट फ़ज़र लिखें

इस कोड की मदद से, Android.bp बिल्ड फ़ाइल में फ़ज़ मॉड्यूल तय किया जा सकता है:

rust_fuzz {
    name: "example_rust_fuzzer",
    srcs: ["fuzzer.rs"],

    // Config for running the target on fuzzing infrastructure can be set under
    // fuzz_config. This shares the same properties as cc_fuzz's fuzz_config.
    fuzz_config: {
        fuzz_on_haiku_device: true,
        fuzz_on_haiku_host: false,
    },

    // Path to a corpus of sample inputs, optional. See https://llvm.org/docs/LibFuzzer.html#corpus
    corpus: ["testdata/*"],

    // Path to a dictionary of sample byte sequences, optional. See https://llvm.org/docs/LibFuzzer.html#dictionaries
    dictionary: "example_rust_fuzzer.dict",
}

fuzzer.rs फ़ाइल में एक सिंपल फ़ज़र है:

fn heap_oob() {
    let xs = vec![0, 1, 2, 3];
    let val = unsafe { *xs.as_ptr().offset(4) };
    println!("Out-of-bounds heap value: {}", val);
}

fuzz_target!(|data: &[u8]| {
    let magic_number = 327;
    if data.len() == magic_number {
        heap_oob();
    }
});

यहां fuzz_target!(|data: &[u8]| { /* fuzz using data here */ }); में फ़ज़-टारगेट एंट्री-पॉइंट, जिसे libFuzzer इंजन कॉल करता है. data आर्ग्युमेंट यह है इनपुट के तौर पर इस्तेमाल करने के लिए, libFuzzer इंजन से मिला बाइट का क्रम टारगेट किए गए फ़ंक्शन को फ़ज़ करने के लिए.

इस उदाहरण फ़ज़र में, सिर्फ़ डेटा की लंबाई की जांच करके तय किया जा सकता है कि heap_oob फ़ंक्शन को कॉल करना है या नहीं, जबकि कॉल करने पर पढ़ें. libFuzzer एक कवरेज-गाइडेड फ़ज़र है. इसलिए, यह समस्या वाली लंबाई पर तेज़ी से पहुंच जाता है, क्योंकि यह पता लगाता है कि डेटा के पहले 326 B से, नए एक्सीक्यूशन पाथ नहीं मिलते.

इस उदाहरण को ट्री में, tools/security/fuzzing/example_rust_fuzzer/ पर ढूंढें. एक अन्य फ़ज़र (जो rustlib को फ़ज़ करता है) का थोड़ा ज़्यादा जटिल उदाहरण देखने के लिए डिपेंडेंसी) इन-ट्री है, तो legacy_blob_fuzzer देखें.

स्ट्रक्चर अवेयर रस्ट फ़ज़र लिखने का तरीका जानने के लिए, रस्ट फ़ज़ बुक देखें. यह Rust Fuzz प्रोजेक्ट का आधिकारिक दस्तावेज़ है.