العودة إلى التحديثات
New releaseSep 4, 2026

AFLplusplus v5.03c

أداة الاختبار العشوائي afl++ هي نسخة afl مزودة بتصحيحات المجتمع، وترقية لـ qemu 5.1، وتغطية خالية من التصادم، وlaf-intel وredqueen محسَّنتين، وجداول طاقة AFLfast++، ومطفِّرات MOpt، ووضع unicorn_mode، وغير ذلك الكثير!

مشاركة

أمريكان فازي لوب بلس بلس (AFL++)

AFL++ logo

إصدار الإصدار: 5.03c

إصدار GitHub: 5.03c

المستودع: https://github.com/AFLplusplus/AFLplusplus

AFL++ يُصان بواسطة:

طُوّر في الأصل بواسطة 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.

لتتعلم عن تشويش أهداف أخرى، انظر:

بدء سريع خطوة بخطوة:

  1. قم بتجميع البرنامج أو المكتبة المراد تشويشها باستخدام afl-cc. طريقة شائعة للقيام بذلك هي:

    CC=/path/to/afl-cc CXX=/path/to/afl-c++ ./configure --disable-shared
    make clean all
    
  2. احصل على ملف إدخال صغير لكن صالح وذو معنى للبرنامج. عند تشويش صيغ مطولة (SQL, HTTP, إلخ)، أنشئ قاموساً (dictionary) كما هو موضح في dictionaries/README.md أيضاً.

  3. إذا كان البرنامج يقرأ من 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++ اسماً لملف مُنشأ تلقائياً لك.

  4. حقق في أي شيء يظهر باللون الأحمر في واجهة أداة التشويش بالاستعانة فوراً بـ docs/afl-fuzz_approach.md#understanding-the-status-screen.

  5. ستجد الأعطال (crashes) والتعليقات (hangs) المكتشفة في المجلدات الفرعية crashes/ و hangs/ داخل دليل -o output_dir. يمكنك إعادة تشغيل الأعطال بتغذيتها للهدف، مثلاً إذا كان هدفك يستخدم stdin:

    cat output_dir/crashes/id:000000,* | /path/to/tested/program [...program's cmdline...]
    

    يمكنك توليد ملفات core أو استخدام gdb مباشرة لمتابعة الأعطال.

  6. لتحليل التغطية (coverage) للتشويش، نوصي بأدواتنا الشريكة cov-analysis (تقارير تغطية مبنية على المصدر من مجموعة تشويش) و fuzz-reachability (تحليل ثابت للوظائف التي يمكن لمنصة الاختبار الوصول إليها، لتمييز فجوات التغطية القابلة للتنفيذ عن الكود الميت ولتوليد قوائم السماح للأدوات (instrumentation allowlists))

  7. لا يمكننا التأكيد بما فيه الكفاية - إذا كنت تريد التشويش بفعالية، اقرأ وثيقة docs/fuzzing_in_depth.md!

التواصل

أسئلة؟ مخاوف؟ تقارير أخطاء؟

الفروع

توجد الفروع التالية:

  • 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,
}

zread Ask DeepWiki

الرخصة

AFL++ مرخّص بموجب GNU AGPL-3.0-or-later. باختصار، يمكنك استخدام AFL++ بثلاث طرق:

  1. مجاناً، بموجب AGPL-3.0-or-later: الخيار الافتراضي. استخدم وعدّل وشارك AFL++؛ إذا قمت بتشغيل نسخة معدلة كخدمة شبكة، تتطلب AGPL منك تقديم الكود المصدري المقابل لمستخدميك. النص الكامل: LICENSE.

  2. لكل ملف، بموجب الرخصة في ترويسة الملف: يحتوي المشروع على ملفات بموجب 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.

  3. رخصة تجارية: اختيارية، للمنظمات التي لا يمكنها أو لا تريد الامتثال لـ AGPL. المشروع لا يتلقى أي أموال. بدلاً من ذلك تتبرع بمبلغ EUR 20,000 (€20,000) إلى إما EFF أو CCC وترسل إثباتاً بالبريد الإلكتروني إلى [email protected]؛ تصبح رخصتك سارية من تاريخ التبرع لمدة سنة واحدة (قابلة للتجديد بالتبرع مرة أخرى). الشروط الكاملة: LICENSE.COMMERCIAL.

مكونات الطرف الثالث المرفقة (مثل xxHash و t1ha و libFuzzer والوحدات الفرعية) تحتفظ برخصها الخاصة. للحصول على نظرة عامة كاملة بلغة بسيطة، انظر LICENSING.md.

الفئات