
LibAFL के ऊपर विकसित एक कवरेज-निर्देशित REST API फ़ज़र
TNO ने WuppieFuzz विकसित किया है, जो LibAFL के ऊपर विकसित एक कवरेज-निर्देशित REST API फ़ज़र है, जो अंतिम उपयोगकर्ताओं की व्यापक श्रेणी को लक्षित करता है, जिसमें उपयोग में आसानी, खोजी गई खामियों की व्याख्यात्मकता और मॉड्यूलरिटी पर मजबूत जोर दिया गया है। WuppieFuzz परीक्षण की तीनों स्थितियों (ब्लैक बॉक्स, ग्रे बॉक्स और व्हाइट बॉक्स) का समर्थन करता है।
[!NOTE]
त्वरित, साथ चलने वाले मार्गदर्शन के लिए कृपया ट्यूटोरियल देखें!
WuppieFuzz इनमें प्रदर्शित किया गया है:
यदि आप शैक्षणिक कार्य में WuppieFuzz का उल्लेख करना चाहते हैं, तो कृपया CITATION.cff में सूचीबद्ध पसंदीदा प्रकाशन का उपयोग करें:
Rooijakkers, T., Nijsten, A., Daniele, C., Weitenberg, E., Groenewegen, R., & Melissen, A. (2026). WuppieFuzz: Coverage-Guided, Stateful REST API Fuzzing. In Proceedings of the 12th International Conference on Information Systems Security and Privacy (ICISSP), Volume 2, 221-231. SciTePress. https://doi.org/10.5220/0000217100004061
WuppieFuzz Apache-2.0 के अंतर्गत लाइसेंस प्राप्त है; LICENSE देखें।
तृतीय-पक्ष लाइसेंस सूचनाएँ THIRD_PARTY_NOTICES में सूचीबद्ध हैं।
लोकप्रिय ऑपरेटिंग सिस्टम (MacOS, Windows, Linux) के लिए WuppieFuzz की त्वरित स्थापना हेतु रिलीज़ देखें या brew install wuppiefuzz का उपयोग करें।
प्रोजेक्ट बनाने के लिए आपको निम्नलिखित निर्भरताएँ और टूलिंग स्थापित करनी होंगी
sudo apt install build-essentialsudo apt install pkg-configcurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shWuppieFuzz चलाने से पहले, आपको अपना (इंस्ट्रूमेंटेड) लक्ष्य अनुप्रयोग प्रारंभ करना होगा।
इसके अतिरिक्त, आपको WuppieFuzz को एक OpenAPI-विनिर्देश प्रदान करना होगा ताकि वह जान सके कि अपने अनुरोधों को कैसे उत्पन्न और परिवर्तित करना है। कमांड लाइन तर्कों के लिए सहायता हेतु, निम्नलिखित का उपयोग करें:
$ cargo run -- --help # shows help for required parameters and flags
Usage: wuppiefuzz [OPTIONS] [OPENAPI_SPEC.YAML]
...
उदाहरण के लिए, JaCoCo एजेंट संलग्न किसी Java लक्ष्य के विरुद्ध WuppieFuzz चलाने के लिए, आप उसकी OpenAPI फ़ाइल निर्दिष्ट करते हैं (जिसमें API विनिर्देश में लक्ष्य जिस URL पर चल रहा है वह शामिल होता है)। इसके अतिरिक्त, आप निर्दिष्ट करते हैं कि कवरेज प्रारूप JaCoCo है, और क्लासेस निर्देशिका इस प्रकार देते हैं:
cargo run -- fuzz openapi.yaml --coverage-format jacoco --jacoco-class-dir ../Targets/app/target/classes/
यदि आप कमांड लाइन तर्कों के बजाय/साथ में कॉन्फ़िगरेशन फ़ाइल का उपयोग करना चाहते हैं, तो आप --config <CONFIG_FILE> फ़्लैग का उपयोग कर सकते हैं। यदि आप कॉन्फ़िगरेशन फ़ाइल के साथ कमांड लाइन तर्कों का उपयोग करते हैं, तो कमांड लाइन तर्कों को प्राथमिकता दी जाती है।
कॉन्फ़िगरेशन फ़ाइल एक yaml फ़ाइल होनी चाहिए और इसमें प्रत्येक कमांड लाइन तर्क के लिए एक पंक्ति होनी चाहिए जिसे आप निर्दिष्ट करना चाहते हैं, उदाहरण के लिए:
coverage_format: jacoco
output_format: human-readable
source_dir: "/swagger-petstore/src/main/java"
jacoco_class_dir: "/swagger-petstore/target"
timeout: 20
इस स्थिति में एक उदाहरण रन कमांड हो सकता है:
$ cargo run -- fuzz --config=config.yaml --report --coverage-host=localhost:6300 --timeout=10 ./openapi.yaml
यह पंक्ति कमांड लाइन और कॉन्फ़िगरेशन फ़ाइल के तर्कों को संयोजित करेगी। चूँकि --timeout फ़्लैग दोनों में निर्दिष्ट है, कमांड लाइन में निर्दिष्ट टाइमआउट (10 सेकंड) को प्राथमिकता दी जाएगी।
example_configs/ निर्देशिका में आपको दो उदाहरण कॉन्फ़िग फ़ाइलें मिलेंगी, जिनका उपयोग Java कोड के लिए JaCoCo के साथ कवरेज रिपोर्ट उत्पन्न करने और Python कोड के लिए LCOV के साथ कवरेज रिपोर्ट उत्पन्न करने हेतु किया जा सकता है।
जब आप WuppieFuzz को --report फ़्लैग के साथ चलाते हैं, तो reports/ के अंदर एक उपनिर्देशिका बनाई जाती है जिसका नाम टाइमस्टैम्प होता है। सभी समर्थित कवरेज रिपोर्ट(ें) इस उपनिर्देशिका में लिखी जाती हैं। कवरेज रिपोर्ट दो प्रकार की होती हैं:
इसके अलावा, आपके फ़ज़िंग अभियान से संबंधित सभी अनुरोध जानकारी से एक डेटाबेस भरा जाता है। इस डेटाबेस को Grafana डैशबोर्ड के माध्यम से विज़ुअलाइज़ और एक्सप्लोर किया जा सकता है।
इनमें से प्रत्येक के बारे में अधिक जानकारी के लिए, इन निर्देशिकाओं में README देखें।
डिफ़ॉल्ट रूप से, WuppieFuzz अपनी C निर्भरताओं (OpenSSL, SQLite, Z3) को वेंडर करता है, ताकि एक सामान्य cargo build बिना किसी अतिरिक्त सेटअप के काम करे। विकास के दौरान तेज़ संकलन के लिए, आप सभी वेंडर की गई निर्भरताओं को अक्षम कर सकते हैं और इसके बजाय सिस्टम-स्थापित लाइब्रेरियों से लिंक कर सकते हैं।
[!NOTE]
z3क्रेट को Z3 4.15+ की आवश्यकता होती है, जो अधिकांश Linux वितरण पैकेज प्रबंधकों द्वारा वितरित संस्करण से नया है। संगत संस्करण पाने के लिए Homebrew के माध्यम से Z3 स्थापित करें (brew install z3)।
अपने सिस्टम पर निम्नलिखित लाइब्रेरियाँ स्थापित करें:
Debian/Ubuntu:
sudo apt install libssl-dev libsqlite3-dev
brew install z3 # apt's libz3-dev is too old; use Homebrew instead
Linux पर, Homebrew एक गैर-मानक पथ पर स्थापित होता है। इसकी लाइब्रेरी निर्देशिका को अपने पर्यावरण में जोड़ें ताकि कंपाइलर और रनटाइम लिंकर Z3 को ढूंढ सकें:
eval "$(brew shellenv)"
export LIBRARY_PATH="$(brew --prefix z3)/lib:$LIBRARY_PATH"
export LD_LIBRARY_PATH="$(brew --prefix z3)/lib:$LD_LIBRARY_PATH"
[!TIP] उपरोक्त पंक्तियों को स्थायी बनाने के लिए उन्हें अपनी
~/.bashrcया~/.zshrcमें जोड़ें।
Fedora (42+):
sudo dnf install openssl-devel sqlite-devel z3-devel
macOS (Homebrew):
brew install openssl sqlite z3
रिपॉज़िटरी में .cargo/config.toml में कार्गो उपनाम शामिल हैं जो --no-default-features के साथ बिल्ड करते हैं, सभी सिस्टम लाइब्रेरियों से लिंक करते हैं:
cargo dev-build # build without vendored dependencies
cargo dev-run -- <args> # run without vendored dependencies
cargo dev-test # test without vendored dependencies
cargo doc --no-deps स्रोत कोड में टिप्पणियों से दस्तावेज़ीकरण उत्पन्न करने के लिए। दस्तावेज़ीकरण का मुख्य पृष्ठ target/doc/wuppiefuzz/index.html होगा।