
AFLplusplus v5.03c
أداة الاختبار العشوائي afl++ هي نسخة afl مزودة بتصحيحات المجتمع، وترقية لـ qemu 5.1، وتغطية خالية من التصادم، وlaf-intel وredqueen محسَّنتين، وجداول طاقة AFLfast++، ومطفِّرات MOpt، ووضع unicorn_mode، وغير ذلك الكثير!
أمريكان فازي لوب بلس بلس (AFL++)
إصدار الإصدار: 5.03c
إصدار GitHub: 5.03c
المستودع: 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 الخاص بجوجل.
بناء وتثبيت AFL++
لتتوفر لديك AFL++ بسهولة مع كل شيء مُجمَّع، اسحب الصورة مباشرة من Docker Hub (متاحة لكل من x86_64 و arm64):
docker pull aflplusplus/aflplusplus
docker run -ti -v /location/of/your/target:/src aflplusplus/aflplusplus
تُنشر هذه الصورة تلقائياً عند حدوث push إلى الفرع المستقر (stable) (انظر الفروع). إذا استخدمت الأمر أعلاه، ستجد الكود المصدري لهدفك في /src داخل الحاوية.
ملاحظة: يمكنك أيضاً سحب aflplusplus/aflplusplus:dev وهي أحدث حالة تطويرية لـ AFL++.
لبناء AFL++ بنفسك - وهو ما نوصي به - تابع في docs/INSTALL.md.
بدء سريع: التشويش (Fuzzing) باستخدام 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, إلخ)، أنشئ قاموساً (dictionary) كما هو موضح في 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++ اسماً لملف مُنشأ تلقائياً لك. -
حقق في أي شيء يظهر باللون الأحمر في واجهة أداة التشويش بالاستعانة فوراً بـ docs/afl-fuzz_approach.md#understanding-the-status-screen.
-
ستجد الأعطال (crashes) والتعليقات (hangs) المكتشفة في المجلدات الفرعية
crashes/وhangs/داخل دليل-o output_dir. يمكنك إعادة تشغيل الأعطال بتغذيتها للهدف، مثلاً إذا كان هدفك يستخدم stdin:cat output_dir/crashes/id:000000,* | /path/to/tested/program [...program's cmdline...]يمكنك توليد ملفات core أو استخدام gdb مباشرة لمتابعة الأعطال.
-
لتحليل التغطية (coverage) للتشويش، نوصي بأدواتنا الشريكة cov-analysis (تقارير تغطية مبنية على المصدر من مجموعة تشويش) و fuzz-reachability (تحليل ثابت للوظائف التي يمكن لمنصة الاختبار الوصول إليها، لتمييز فجوات التغطية القابلة للتنفيذ عن الكود الميت ولتوليد قوائم السماح للأدوات (instrumentation allowlists))
-
لا يمكننا التأكيد بما فيه الكفاية - إذا كنت تريد التشويش بفعالية، اقرأ وثيقة 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 واقترحها!
لكل من يريد المساهمة (وإرسال طلبات السحب)، يرجى قراءة إرشادات المساهمة قبل التقديم.
شكر خاص
العديد من التحسينات على AFL الأصلي و AFL++ لم تكن ممكنة بدون الملاحظات وتقارير الأخطاء أو التصحيحات من مساهمينا.
شكراً لكم! (للأشخاص الذين يرسلون طلبات سحب - يرجى إضافة أنفسكم إلى هذه القائمة :-)
قائمة المساهمين
Jann Horn Hanno Boeck
Felix Groebert Jakub Wilk
Richard W. M. Jones Alexander Cherepanov
Tom Ritter Hovik Manucharyan
Sebastian Roschke Eberhard Mattes
Padraig Brady Ben Laurie
@dronesec Luca Barbato
Tobias Ospelt Thomas Jarosch
Martin Carpenter Mudge Zatko
Joe Zbiciak Ryan Govostes
Michael Rash William Robinet
Jonathan Gray Filipe Cabecinhas
Nico Weber Jodie Cunningham
Andrew Griffiths Parker Thompson
Jonathan Neuschaefer Tyler Nighswander
Ben Nagy Samir Aguiar
Aidan Thornton Aleksandar Nikolich
Sam Hakim Laszlo Szekeres
David A. Wheeler Turo Lamminen
Andreas Stieger Richard Godbee
Louis Dassy teor2345
Alex Moneger Dmitry Vyukov
Keegan McAllister Kostya Serebryany
Richo Healey Martijn Bogaard
rc0r Jonathan Foote
Christian Holler Dominique Pelle
Jacek Wielemborek Leo Barnes
Jeremy Barnes Jeff Trull
Guillaume Endignoux ilovezfs
Daniel Godas-Lopez Franjo Ivancic
Austin Seipp Daniel Komaromy
Daniel Binderman Jonathan Metzman
Vegard Nossum Jan Kneschke
Kurt Roeckx Marcel Boehme
Van-Thuan Pham Abhik Roychoudhury
Joshua J. Drake Toby Hutton
Rene Freingruber Sergey Davidoff
Sami Liedes Craig Young
Andrzej Jackowski Daniel Hodson
Nathan Voss Dominik Maier
Andrea Biondo Vincent Le Garrec
Khaled Yakdan Kuang-che Wu
Josephine Calliotte Konrad Welc
Thomas Rooijakkers David Carlier
Ruben ten Hove Joey Jiao
fuzzah @intrigus-lgtm
Yaakov Saxon Sergej Schumilo
Ziqiao Kong Ryan Berger
Sangjun Park Scott Guest
Fabian Keil @Jay-1409
Gergely Nagy
الاستشهاد
إذا استخدمت AFL++ في عمل علمي، فكر في الاستشهاد بورقتنا البحثية المقدمة في WOOT'20:
Andrea Fioraldi, Dominik Maier, Heiko Eißfeldt, and Marc Heuse. “AFL++: Combining incremental steps of fuzzing research”. In 14th USENIX Workshop on Offensive Technologies (WOOT 20). USENIX Association, Aug. 2020.
BibTeX
@inproceedings {AFLplusplus-Woot20,
author = {Andrea Fioraldi and Dominik Maier and Heiko Ei{\ss}feldt and Marc Heuse},
title = {{AFL++}: Combining Incremental Steps of Fuzzing Research},
booktitle = {14th {USENIX} Workshop on Offensive Technologies ({WOOT} 20)},
year = {2020},
publisher = {{USENIX} Association},
month = aug,
}
الرخصة
AFL++ مرخّص بموجب GNU AGPL-3.0-or-later. باختصار، يمكنك استخدام AFL++ بثلاث طرق:
-
مجاناً، بموجب AGPL-3.0-or-later: الخيار الافتراضي. استخدم وعدّل وشارك AFL++؛ إذا قمت بتشغيل نسخة معدلة كخدمة شبكة، تتطلب AGPL منك تقديم الكود المصدري المقابل لمستخدميك. النص الكامل: LICENSE.
-
لكل ملف، بموجب الرخصة في ترويسة الملف: يحتوي المشروع على ملفات بموجب
SPDX-License-Identifier: AGPL-3.0-or-laterوSPDX-License-Identifier: Apache-2.0. تحقق دائماً من ترويسة الملف الذي تستخدمه والتزم بالرخصة المذكورة هناك؛ الملفات الموسومة بـ Apache-2.0 يمكن إعادة استخدامها بشكل فردي بموجب رخصة Apache-2.0. (بعض ملفات الطرف الثالث المرفقة تحمل رخصاً أخرى، مثل إضافة GCC بموجب GPL-3.0-or-later وتمريرات LLVM SanitizerCoverage بموجب Apache-2.0-WITH-LLVM-exception — كل منها موسوم بمعرّف SPDX الخاص به.) لاحظ أن ثنائيafl-fuzzالمدمج يتضمن ملفات AGPL، لذا فإن البرنامج ككل هو AGPL. -
رخصة تجارية: اختيارية، للمنظمات التي لا يمكنها أو لا تريد الامتثال لـ AGPL. المشروع لا يتلقى أي أموال. بدلاً من ذلك تتبرع بمبلغ EUR 20,000 (€20,000) إلى إما EFF أو CCC وترسل إثباتاً بالبريد الإلكتروني إلى [email protected]؛ تصبح رخصتك سارية من تاريخ التبرع لمدة سنة واحدة (قابلة للتجديد بالتبرع مرة أخرى). الشروط الكاملة: LICENSE.COMMERCIAL.
مكونات الطرف الثالث المرفقة (مثل xxHash و t1ha و libFuzzer والوحدات الفرعية) تحتفظ برخصها الخاصة. للحصول على نظرة عامة كاملة بلغة بسيطة، انظر LICENSING.md.