
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 की त्वरित स्थापना के लिए releases देखें या brew install wuppiefuzz का उपयोग करें
आप docker build . -t wuppiefuzz:local के साथ डॉकर इमेज बना सकते हैं। इसका उपयोग करने के लिए, आपको अपने openapi spec वाला फ़ोल्डर माउंट करना होगा। जब आप स्थानीय रूप से चल रही सेवा (डॉकर में नहीं) को फ़ज़ कर रहे हों, तो आपको होस्ट नेटवर्किंग निर्दिष्ट करनी होगी:
docker run \
--network host \
-v ./fuzzing-folder:/fuzzing-folder \ # The folder will be populated with wuppiefuzz outputs
-w /fuzzing-folder \
wuppiefuzz:local fuzz --timeout 60 --report openapi.json
प्रोजेक्ट बनाने के लिए आपको निम्नलिखित निर्भरताएँ और टूलिंग स्थापित करनी होंगी:
sudo apt install -y build-essential pkg-config cmake # General build tools
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # Rust
WuppieFuzz चलाने से पहले, आपको अपना (इंस्ट्रुमेंटेड) लक्ष्य एप्लिकेशन शुरू करना होगा।
इसके अतिरिक्त, आपको 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 है, और classes निर्देशिका इस प्रकार देते हैं:
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 के साथ कवरेज रिपोर्ट उत्पन्न करने के लिए उपयोग की जाने वाली दो उदाहरण कॉन्फ़िग फ़ाइलें मिलेंगी।
जब आप --report फ़्लैग के साथ WuppieFuzz चलाते हैं, तो reports/ के अंदर एक उपनिर्देशिका बनाई जाती है जिसका नाम टाइमस्टैम्प होता है। सभी समर्थित कवरेज रिपोर्ट इस उपनिर्देशिका में लिखी जाती हैं। दो प्रकार की कवरेज रिपोर्ट हैं:
इसके अतिरिक्त, आपके फ़ज़िंग अभियान से संबंधित सभी अनुरोध जानकारी से एक डेटाबेस भरा जाता है। इस डेटाबेस को Grafana डैशबोर्ड के माध्यम से देखा और खोजा जा सकता है।
इनमें से प्रत्येक के बारे में अधिक जानकारी के लिए, इन निर्देशिकाओं में README देखें।
डिफ़ॉल्ट रूप से, WuppieFuzz अपनी C निर्भरताओं (OpenSSL, SQLite, Z3) को वेंडर करता है ताकि एक नियमित cargo build बिना किसी अतिरिक्त सेटअप के काम करे। विकास के दौरान तेज़ संकलन के लिए, आप सभी वेंडर की गई निर्भरताओं को अक्षम कर सकते हैं और इसके बजाय सिस्टम-स्थापित लाइब्रेरीज़ के विरुद्ध लिंक कर सकते हैं।
[!NOTE]
z3क्रेट के लिए Z3 4.15+ की आवश्यकता होती है, जो अधिकांश Linux वितरण पैकेज प्रबंधकों द्वारा भेजे जाने वाले संस्करण से नया है। संगत संस्करण प्राप्त करने के लिए Homebrew (brew install z3) के माध्यम से Z3 स्थापित करें।
अपने सिस्टम पर निम्नलिखित लाइब्रेरीज़ स्थापित करें:
Debian/Ubuntu:
sudo apt install libssl-dev libsqlite3-dev
brew install z3 # apt's libz3-dev is too old; use Homebrew instead