
WuppieFuzz v1.7.1
أداة فازر موجّهة بالتغطية لواجهات REST API، مطوّرة استنادًا إلى LibAFL
WuppieFuzz v1.7.1
طوّرت TNO أداة WuppieFuzz، وهي أداة اختبار تشويش (Fuzzer) لواجهات برمجة التطبيقات REST مبنية على توجيه التغطية (coverage-guided)، تم تطويرها فوق LibAFL، وتستهدف جمهورًا واسعًا من المستخدمين النهائيين، مع تركيز قوي على سهولة الاستخدام، وقابلية تفسير الثغرات المكتشفة، والنمطية. تدعم WuppieFuzz جميع أوضاع الاختبار الثلاثة (الصندوق الأسود، الصندوق الرمادي، والصندوق الأبيض).
[!NOTE]
للحصول على إرشادات سريعة ومتابعة خطوة بخطوة، يرجى اتباع البرنامج التعليمي!
التغطية الإعلامية
تم تسليط الضوء على WuppieFuzz في:
- مجلة مؤتمر ONE الإلكترونية 2024
- اختبر واجهات برمجة التطبيقات الخاصة بك بسهولة باستخدام أداة اختبار التشويش الجديدة من TNO لواجهات REST
- قائمة OpenAPI.tools: WuppieFuzz
- كشف ثغرات واجهات برمجة التطبيقات REST تلقائيًا باستخدام WuppieFuzz (Nordic APIs على YouTube)
- رادار تقنية Thoughtworks: 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.
التثبيت السريع
للتثبيت السريع لـ WuppieFuzz على أنظمة التشغيل الشائعة (MacOS،
Windows، Linux) انظر الإصدارات أو استخدم brew install wuppiefuzz
دليل مختصر
المتطلبات الأساسية للتطوير
لبناء المشروع، تحتاج إلى تثبيت التبعيات والأدوات التالية:
- build-essential
sudo apt install build-essential - pkg-config
sudo apt install pkg-config - Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
التشغيل
قبل تشغيل WuppieFuzz، يجب عليك بدء تشغيل تطبيق الهدف (المُجهز بأدوات القياس).
بالإضافة إلى ذلك، يجب تزويد WuppieFuzz بـ مواصفة OpenAPI حتى تعرف كيفية إنشاء طلباتها وتحويرها. للحصول على مساعدة حول وسائط سطر الأوامر، استخدم ما يلي:
$ cargo run -- --help # يعرض المساعدة حول المعلمات والأعلام المطلوبة
Usage: wuppiefuzz [OPTIONS] [OPENAPI_SPEC.YAML]
...
على سبيل المثال، لتشغيل WuppieFuzz ضد هدف Java مع إرفاق وكيل JaCoCo، تحدد ملف OpenAPI الخاص به (الذي يحتوي على عنوان URL الذي يعمل عليه الهدف في مواصفات API). بالإضافة إلى ذلك، تحدد أن تنسيق التغطية هو 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/ ستجد ملفي تكوين مثالين لاستخدامهما
لإنشاء تقارير التغطية باستخدام JaCoCo لرمز Java ولإنشاء تقارير
التغطية باستخدام LCOV لرمز Python.
التقارير
عند تشغيل WuppieFuzz مع العلم --report، يتم إنشاء دليل فرعي داخل
reports/ باسمه طابع زمني. تتم كتابة جميع تقارير التغطية المدعومة
في هذا الدليل الفرعي. هناك نوعان من تقارير التغطية:
- تغطية نقطة النهاية (endpoint coverage): يمكن إنشاؤها دائمًا لأنها تتطلب فقط مواصفة OpenAPI.
- تغطية الكود (code coverage): مدعومة حاليًا فقط لـ 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. قم بتثبيت Z3 عبر Homebrew (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 المستعارة
يتضمن المستودع أسماء مستعارة لـ cargo في .cargo/config.toml تقوم بالبناء باستخدام
--no-default-features، والربط بجميع مكتبات النظام:
cargo dev-build # البناء بدون تبعيات موردة
cargo dev-run -- <args> # التشغيل بدون تبعيات موردة
cargo dev-test # الاختبار بدون تبعيات موردة
إنشاء التوثيق
cargo doc --no-deps لإنشاء التوثيق من التعليقات في الكود
المصدري. ستكون الصفحة الرئيسية للتوثيق
target/doc/wuppiefuzz/index.html
