
LibAFL के ऊपर विकसित एक कवरेज-निर्देशित REST API फ़ज़र
# WuppieFuzz v1.8.0 <picture> <source media="(prefers-color-scheme: dark)" srcset="assets/WuppieFuzz-dark.svg"> <source media="(prefers-color-scheme: light)" srcset="assets/WuppieFuzz.svg"> <img alt="WuppieFuzz का लोगो।" src="https://raw.githubusercontent.com/tno-s3/wuppiefuzz/HEAD/assets/WuppieFuzz.svg" width="40%" min-width="250px" align="right"> </picture> TNO ने WuppieFuzz विकसित किया है, जो LibAFL के ऊपर विकसित एक कवरेज-गाइडेड REST API फ़ज़र है, जो अंतिम-उपयोगकर्ताओं के व्यापक दर्शकों को लक्षित करता है, जिसमें उपयोग में आसानी, खोजे गए दोषों की व्याख्या-क्षमता और मॉड्यूलरिटी पर विशेष ध्यान दिया गया है। WuppieFuzz परीक्षण की तीनों सेटिंग्स (ब्लैक बॉक्स, ग्रे बॉक्स और व्हाइट बॉक्स) का समर्थन करता है। > [!NOTE] > त्वरित, साथ-साथ चलने वाले मार्गदर्शन के लिए कृपया [ट्यूटोरियल](https://github.com/tno-s3/wuppiefuzz/blob/main/tutorial) का पालन करें! ## मीडिया कवरेज WuppieFuzz को इनमें प्रदर्शित किया गया है: - [The ONE Conference e-magazine 2024](https://emagazine.one-conference.nl/2024/finally-validate-your-publicly-exposed-interfaces-with-ease/) - [Test your APIs easily with TNO's new REST API fuzzer](https://www.tno.nl/en/newsroom/insights/2024/10/application-security-testing/) - [OpenAPI.tools listing: WuppieFuzz](https://openapi.tools/tools/wuppiefuzz) - [Automated REST API Vulnerability Detection with WuppieFuzz (Nordic APIs on YouTube)](https://www.youtube.com/watch?v=JcV9RUBvb2w) - [Thoughtworks Technology Radar: WuppieFuzz](https://www.thoughtworks.com/radar/tools/wuppiefuzz) ### वैज्ञानिक प्रकाशन यदि आप अकादमिक कार्य में WuppieFuzz का उद्धरण देना चाहते हैं, तो कृपया [CITATION.cff](https://github.com/tno-s3/wuppiefuzz/blob/main/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](https://github.com/tno-s3/wuppiefuzz/blob/main/LICENSE)। तृतीय-पक्ष लाइसेंस सूचनाएं [THIRD_PARTY_NOTICES](https://github.com/tno-s3/wuppiefuzz/blob/main/THIRD_PARTY_NOTICES) में सूचीबद्ध हैं। ## त्वरित इंस्टॉल लोकप्रिय ऑपरेटिंग सिस्टम (MacOS, Windows, Linux) के लिए WuppieFuzz की त्वरित स्थापना के लिए [releases](https://github.com/TNO-S3/WuppieFuzz/releases/) देखें या [`brew install wuppiefuzz`](https://formulae.brew.sh/formula/wuppiefuzz) का उपयोग करें ### Docker आप `docker build . -t wuppiefuzz:local` के साथ डॉकर इमेज बना सकते हैं। इसका उपयोग करने के लिए, आपको अपने openapi spec वाला फ़ोल्डर माउंट करना होगा। जब आप स्थानीय रूप से चल रही सेवा (डॉकर में नहीं) को फ़ज़ कर रहे हों, तो आपको होस्ट नेटवर्किंग निर्दिष्ट करनी होगी: ``` shell 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 ``` ### संक्षिप्त कैसे-करें [](https://www.youtube.com/watch?v=-oR4d9aXrqo) ## विकास के लिए पूर्वापेक्षाएँ प्रोजेक्ट बनाने के लिए आपको निम्नलिखित निर्भरताएँ और टूलिंग स्थापित करनी होंगी: ``` sudo apt install -y build-essential pkg-config cmake # General build tools curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # Rust ``` ## चलाएँ <picture> <img alt="WuppieFuzz कार्यरत।" src="https://raw.githubusercontent.com/tno-s3/wuppiefuzz/HEAD/assets/WuppieFuzz-action.jfif" width="40%" min-width="250px" align="right"> </picture> WuppieFuzz चलाने से पहले, आपको अपना (इंस्ट्रुमेंटेड) लक्ष्य एप्लिकेशन शुरू करना होगा। इसके अतिरिक्त, आपको WuppieFuzz को एक **OpenAPI-विनिर्देश** प्रदान करना होगा ताकि उसे पता हो कि उसके अनुरोधों को कैसे उत्पन्न और परिवर्तित करना है। कमांड लाइन तर्कों पर सहायता के लिए, निम्नलिखित का उपयोग करें: ```sh $ cargo run -- --help # shows help for required parameters and flags Usage: wuppiefuzz [OPTIONS] [OPENAPI_SPEC.YAML] ... ``` उदाहरण के लिए, JaCoCo एजेंट संलग्न Java लक्ष्य के विरुद्ध WuppieFuzz चलाने के लिए, आप उसकी OpenAPI फ़ाइल निर्दिष्ट करते हैं (जिसमें API विनिर्देश में वह URL होता है जिस पर लक्ष्य चल रहा है)। इसके अतिरिक्त, आप निर्दिष्ट करते हैं कि कवरेज प्रारूप JaCoCo है, और classes निर्देशिका इस प्रकार देते हैं: ```sh cargo run -- fuzz openapi.yaml --coverage-format jacoco --jacoco-class-dir ../Targets/app/target/classes/ ``` ## कॉन्फ़िगरेशन फ़ाइल यदि आप कमांड लाइन तर्कों के बजाय/के संयोजन में कॉन्फ़िगरेशन फ़ाइल का उपयोग करना चाहते हैं, तो आप `--config <CONFIG_FILE>` फ़्लैग का उपयोग कर सकते हैं। यदि आप कॉन्फ़िगरेशन फ़ाइल के संयोजन में कमांड लाइन तर्कों का उपयोग करते हैं, तो कमांड लाइन तर्कों को प्राथमिकता मिलती है। कॉन्फ़िगरेशन फ़ाइल एक yaml फ़ाइल होनी चाहिए और इसमें प्रत्येक कमांड लाइन तर्क के लिए एक पंक्ति होनी चाहिए जिसे आप निर्दिष्ट करना चाहते हैं, उदाहरण के लिए: ```yaml coverage_format: jacoco output_format: human-readable source_dir: "/swagger-petstore/src/main/java" jacoco_class_dir: "/swagger-petstore/target" timeout: 20 ``` इस मामले में एक उदाहरण रन कमांड हो सकता है: ```sh $ 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/` के अंदर एक उपनिर्देशिका बनाई जाती है जिसका नाम टाइमस्टैम्प होता है। सभी समर्थित कवरेज रिपोर्ट इस उपनिर्देशिका में लिखी जाती हैं। दो प्रकार की कवरेज रिपोर्ट हैं: 1. **एंडपॉइंट कवरेज**: यह हमेशा उत्पन्न की जा सकती है क्योंकि इसके लिए केवल OpenAPI-spec की आवश्यकता होती है। 2. **कोड कवरेज**: वर्तमान में केवल JaCoCo के लिए समर्थित है, लेकिन हम और अधिक का समर्थन करने का लक्ष्य रखते हैं। मुश्किल हिस्सा यह है कि इसके लिए कवरेज से स्रोत फ़ाइलों तक मैपिंग और इसका उपयोग करने वाली मजबूत रिपोर्ट जनरेशन की आवश्यकता होती है। इसके अतिरिक्त, आपके फ़ज़िंग अभियान से संबंधित सभी अनुरोध जानकारी से एक डेटाबेस भरा जाता है। इस डेटाबेस को Grafana डैशबोर्ड के माध्यम से देखा और खोजा जा सकता है। ## इस रिपॉजिटरी की संरचना - **assets**: लोगो, छवियाँ, आदि। - **coverage_agents**: विभिन्न लक्ष्यों पर कवरेज ट्रैकिंग के लिए कोड और निर्देश - **example_configs**: WuppieFuzz को कॉन्फ़िगर करने के लिए उदाहरण कॉन्फ़िगरेशन फ़ाइलें - **src**: WuppieFuzz का स्रोत कोड - **tutorial**: किसी विशिष्ट लक्ष्य को फ़ज़ करने और फ़ज़िंग परिणामों की व्याख्या करने के तरीके पर एक गहन और निम्न-स्तरीय ट्यूटोरियल - **dashboard**: फ़ज़िंग परिणामों और प्रदर्शन को ट्राइएज करने के लिए टूलिंग इनमें से प्रत्येक के बारे में अधिक जानकारी के लिए, इन निर्देशिकाओं में README देखें। ## विकास बिल्ड डिफ़ॉल्ट रूप से, WuppieFuzz अपनी C निर्भरताओं (OpenSSL, SQLite, Z3) को वेंडर करता है ताकि एक नियमित `cargo build` बिना किसी अतिरिक्त सेटअप के काम करे। विकास के दौरान तेज़ संकलन के लिए, आप सभी वेंडर की गई निर्भरताओं को अक्षम कर सकते हैं और इसके बजाय सिस्टम-स्थापित लाइब्रेरीज़ के विरुद्ध लिंक कर सकते हैं। > [!NOTE] > `z3` क्रेट के लिए Z3 4.15+ की आवश्यकता होती है, जो अधिकांश Linux वितरण पैकेज प्रबंधकों द्वारा भेजे जाने वाले संस्करण से नया है। संगत संस्करण प्राप्त करने के लिए [Homebrew](https://brew.sh/) (`brew install z3`) के माध्यम से Z3 स्थापित करें। ### सिस्टम निर्भरताएँ अपने सिस्टम पर निम्नलिखित लाइब्रेरीज़ स्थापित करें: **Debian/Ubuntu:** ```sh sudo apt install libssl-dev libsqlite3-dev brew install z3 # apt's libz3-dev is too old; use Homebrew instead ``` Linux पर, Homebrew एक गैर-मानक पथ पर स्थापित होता है। इसकी लाइब्रेरी निर्देशिका को अपने वातावरण में जोड़ें ताकि कंपाइलर और रनटाइम लिंकर Z3 ढूंढ सकें: ```sh 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+):** ```sh sudo dnf install openssl-devel sqlite-devel z3-devel ``` **macOS (Homebrew):** ```sh brew install openssl sqlite z3 ``` ### Cargo उपनाम रिपॉजिटरी में `.cargo/config.toml` में cargo उपनाम शामिल हैं जो `--no-default-features` के साथ बिल्ड करते हैं, सभी सिस्टम लाइब्रेरीज़ के विरुद्ध लिंक करते हुए: ```sh 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` होगा