
AFLplusplus v5.03c
AFL++ هو أداة fuzzing متقدمة، وتحتل المرتبة الأولى في المعايير القياسية. كان في الأصل مبنيًا على AFL. اليوم يأتي مع qemu 5.1، وتغطية خالية من التعارض، وlaf-intel & redqueen المحسّنين، وجداول طاقة AFLfast++، وmutators MOpt، وunicorn_mode، والكثير غير ذلك!
American Fuzzy Lop plus plus (AFL++)
إصدار الإصدار: 5.03c
إصدار GitHub: 5.04a
المستودع: https://github.com/AFLplusplus/AFLplusplus
يتم صيانة AFL++ بواسطة:
- Marc "van Hauser" Heuse [email protected]
- Dominik Maier [email protected]
- Andrea Fioraldi [email protected]
- Heiko "hexcoder-" Eissfeldt [email protected]
- يتم صيانة frida_mode بواسطة @Worksbutnottested
تم تطويره في الأصل بواسطة Michal "lcamtuf" Zalewski.
AFL++ هو تفرع (fork) متفوق على AFL من Google - سرعة أكبر، وطفرات (mutations) أكثر وأفضل، وأدوات تتبع (instrumentation) أكثر وأفضل، ودعم وحدات مخصصة، وغير ذلك.
AFL++ مرخّص بموجب AGPL-3.0-or-later، ويحتوي أيضاً على ملفات بموجب ترخيص Apache-2.0.
كل ما يتم تجميعه في أداة اختبار (fuzzing harness) هو وسيبقى مرخّصاً بموجب Apache 2.0.
يحدد كل ملف ترخيصه الخاص في ترويسته SPDX-License-Identifier — وهذا
هو الترخيص الذي يجب عليك اتباعه لذلك الملف.
يتوفر ترخيص تجاري اختياري للمؤسسات التي
لا يمكنها استخدام AGPL (يُحصل عليه بالتبرع لقضية نبيلة — لا يتلقى المشروع
والقائمون عليه أي أموال).
راجع LICENSING.md للحصول على نظرة عامة بلغة واضحة و
قسم الترخيص أدناه للحصول على التفاصيل.
البدء
إليك بعض المعلومات لتبدأ بها:
- للحصول على نظرة عامة على وثائق AFL++ ودليل رسومي مفيد جداً، يرجى زيارة docs/README.md.
- للبدء مع الدروس التعليمية، انتقل إلى docs/tutorials.md.
- بالنسبة للإصدارات، راجع
علامة تبويب الإصدارات و
الفروع. أفضل الفروع لاستخدامها، مع ذلك، هي
stableأوdev- اعتماداً على مدى تحمّلك للمخاطر. ألقِ نظرة أيضاً على قائمة التغييرات المهمة في AFL++ وقائمة الميزات. - إذا كنت ترغب في استخدام AFL++ في عملك الأكاديمي، تحقق من صفحة الأوراق البحثية على الموقع.
- لاقتباس عملنا، راجع قسم الاقتباس.
- للمقارنات، استخدم إعداد
aflplusplusفي fuzzbench، أو استخدمafl-clang-fastمعAFL_LLVM_CMPLOG=1. يمكنك العثور على التكوين الافتراضي لـaflplusplusعلى fuzzbench الخاص بـ Google.
بناء وتثبيت AFL++
للحصول على AFL++ بسهولة مع كل شيء مُجمّعاً، اسحب الصورة مباشرة من Docker Hub (متاحة لكل من x86_64 وarm64):
docker pull aflplusplus/aflplusplus
docker run -ti -v /location/of/your/target:/src aflplusplus/aflplusplus
تُنشر هذه الصورة تلقائيًا عند حدوث دفع إلى الفرع المستقر
(انظر الفروع). إذا استخدمت الأمر أعلاه، فستجد
الشيفرة المصدرية الهدف في /src داخل الحاوية.
ملاحظة: يمكنك أيضًا سحب aflplusplus/aflplusplus:dev وهو أحدث
حالة تطوير لـ AFL++.
لبناء AFL++ بنفسك - وهو ما نوصي به - تابع في docs/INSTALL.md.
البدء السريع: التشويش باستخدام AFL++
ملاحظة: قبل أن تبدأ، يُرجى القراءة عن المخاطر البديهية للتشويش.
هذا دليل بدء سريع لتشويش الأهداف المتوفرة شيفرتها المصدرية. لقراءة تفاصيل العملية، انظر docs/fuzzing_in_depth.md.
لمعرفة كيفية تشويش أهداف أخرى، انظر:
- الأهداف الثنائية فقط: docs/fuzzing_binary-only_targets.md
- خدمات الشبكة: docs/best_practices.md#fuzzing-a-network-service
- برامج واجهة المستخدم الرسومية: docs/best_practices.md#fuzzing-a-gui-program
دليل البدء السريع خطوة بخطوة:
-
ترجم البرنامج أو المكتبة المراد تشويشها باستخدام
afl-cc. من الطرق الشائعة للقيام بذلك:CC=/path/to/afl-cc CXX=/path/to/afl-c++ ./configure --disable-shared make clean all -
احصل على ملف إدخال صغير لكنه صالح وذو معنى بالنسبة للبرنامج. عند اختبار الصيغ اللفظية المطوّلة (SQL، HTTP، إلخ)، أنشئ قاموسًا كما هو موضح في dictionaries/README.md، أيضًا.
-
إذا كان البرنامج يقرأ من stdin، شغّل
afl-fuzzهكذا:./afl-fuzz -i seeds_dir -o output_dir -- \ /path/to/tested/program [...program's cmdline...]لإضافة قاموس، أضف
-x /path/to/dictionary.txtإلى afl-fuzz.إذا كان البرنامج يستقبل المدخلات من ملف، يمكنك وضع
@@في سطر أوامر البرنامج؛ سيقوم AFL++ بوضع اسم ملف مُولَّد تلقائيًا هناك نيابةً عنك. -
تحقّق من أي شيء يظهر باللون الأحمر في واجهة المُدخِّل (fuzzer UI) بالرجوع فورًا إلى docs/afl-fuzz_approach.md#understanding-the-status-screen.
-
ستجد حالات الانهيار والتعليق المكتشفة في الدليلين الفرعيين
crashes/وhangs/داخل دليل-o output_dir. يمكنك إعادة تشغيل حالات الانهيار عبر تمريرها إلى الهدف، على سبيل المثال إذا كان هدفك يستخدم stdin:cat output_dir/crashes/id:000000,* | /path/to/tested/program [...program's cmdline...]يمكنك توليد cores أو استخدام gdb مباشرة لمتابعة الأعطال.
-
لتحليل التغطية الخاص بعملية الـ fuzzing الخاصة بك، نوصي بأدوات شركائنا cov-analysis (تقارير التغطية المستندة إلى المصدر من مجموعة fuzzing) و fuzz-reachability (تحليل ساكن للدوال التي يمكن للـ harness الوصول إليها، لتمييز فجوات التغطية القابلة للتنفيذ عن الكود الميت وتوليد قوائم سماح للـ instrumentation)
-
لا يمكننا التأكيد على هذا بما فيه الكفاية - إذا كنت تريد تنفيذ fuzzing بفعالية، فاقرأ مستند docs/fuzzing_in_depth.md!
التواصل
أسئلة؟ مخاوف؟ تقارير أخطاء؟
- يمكن الوصول إلى المساهمين عبر (على سبيل المثال، عن طريق إنشاء issue - ولكن فقط لعيوب AFL++!): https://github.com/AFLplusplus/AFLplusplus.
- ألقِ نظرة على الأسئلة الشائعة وأفضل الممارسات.
- الأفضل: انضم إلى خادم Fuzzing Zulip!
الفروع
توجد الفروع التالية:
- release: أحدث إصدار
- stable: الحالة المستقرة من AFL++ - تتم مزامنتها من dev من وقت لآخر عندما نكون راضين عن استقرارها. هذا هو الفرع الافتراضي.
- dev: حالة التطوير من AFL++ - أحدث ما توصلنا إليه وقد تصادف نسخة لا تُترجم أو تحتوي على خطأ. نقبل فقط طلبات السحب (PRs) لفرع 'dev'!
- (أي فرع آخر): فروع تجريبية للعمل على ميزات محددة أو اختبار وظائف أو تغييرات جديدة.
المساعدة مطلوبة
اطّلع على قائمة issues الخاصة بنا مع وسم "help wanted". يمكن أن تكون هذه طريقتك لدعم AFL++ والمساهمة فيه - وسّعه ليفعل شيئًا رائعًا. إذا كانت لديك أفكار أخرى - فقط أنشئ issue واقترحها!
لكل من يريد المساهمة (وإرسال طلبات السحب)، يُرجى قراءة إرشادات المساهمة قبل الإرسال.