
مولد اختبارات اختراق للصيغ الثنائية يعتمد على القوالب، يقوم بتوليد وتحليل مدخلات اختبار صالحة بسرعة عالية، مع تكامل مع AFL++ لاختبار الاختراق الموجه بالتغطية.
FormatFuzzer هو إطار عمل لتوليد وتحليل المدخلات الثنائية عالية الكفاءة وعالية الجودة.
يأخذ قالبًا ثنائيًا يصف تنسيق مدخل ثنائي وينتج ملفًا تنفيذيًا يقوم بإنتاج وتحليل التنسيق الثنائي المُعطى.
على سبيل المثال، من قالب ثنائي لـ GIF، يُنتج FormatFuzzer مولدًا لـ GIF - يُعرف أيضًا باسم مُدقق GIF.
المولدات التي ينتجها FormatFuzzer عالية الكفاءة، حيث تنتج آلاف المدخلات الصالحة في الثانية - وهذا يتناقض بشكل حاد مع المُدققات القائمة على الطفرات، حيث تكون الغالبية العظمى من المدخلات غير صالحة. المدخلات التي يولدها FormatFuzzer مستقلة عن البرنامج قيد الاختبار (أو في الواقع، أي برنامج)، لذا يمكنك استخدامها في الإعدادات ذات الصندوق الأسود أيضًا. ومع ذلك، يتكامل FormatFuzzer أيضًا مع AFL++ لإنتاج مدخلات صالحة تهدف أيضًا إلى أقصى تغطية. في تجاربنا، يتفوق نهج "أفضل عالَمَين" هذا على جميع الإعدادات الأخرى؛ انظر ورقتنا للتفاصيل.
القوالب الثنائية التي يستخدمها FormatFuzzer تأتي من 010 editor.
يوجد أكثر من 170 قالبًا ثنائيًا، والتي يمكن استخدامها مباشرة مع FormatFuzzer أو تعديلها لاستخدامه. خارج الصندوق، ينتج FormatFuzzer تنسيقات مثل AVI و BMP و GIF و JPG و MIDI و MP3 و MP4 و PCAP و PNG و WAV و ZIP؛ ونواصل توسيع هذه القائمة كل أسبوع.
المساهمون مرحب بهم! زر صفحة مشروع FormatFuzzer لتقديم الأفكار والمشكلات، أو إضافة طلبات السحب. للحصول على تفاصيل حول كيفية عمل FormatFuzzer وكيفية مقارنته، اقرأ ورقتنا لمزيد من المعلومات.
FormatFuzzer متاح من صفحة مشروع FormatFuzzer. يمكنك تنزيل وفك ضغط أحدث إصدار من صفحة الإصدارات.
للحصول على أحدث وأفضل الإصدارات، يمكنك أيضًا استنساخ مستودع git الخاص به:
git clone https://github.com/uds-se/FormatFuzzer.git
جميع الإجراءات الإضافية تتم في مجلده الرئيسي:
cd FormatFuzzer
لتشغيل FormatFuzzer، تحتاج إلى ما يلي:
getopt_long()) مثل clang أو gccpy010parser و six و intervaltreezlib (لدوال الضغط)boost (لدوال المجموع الاختباري)إذا كنت تخطط لتحرير نصوص البناء والتكوين (ملفات .ac و .am)، فستحتاج أيضًا إلى:
sudo apt install git g++ make automake python3-full zlib1g-dev libboost-dev
python3 -m venv ~/fuzz
source ~/fuzz/bin/activate
pip3 install py010parser six intervaltree
xcode-select --install
brew install python3 automake boost
pip3 install py010parser six intervaltree
على جميع الأنظمة، باستخدام pip:
pip install py010parser
pip install six
pip install intervaltree
ملاحظة: جميع أوامر البناء تتطلب منك أن تكون في نفس المجلد الذي يوجد به ملف README هذا. بناء مُدقق خارج هذا المجلد غير مدعوم بعد.
يوجد نص build.sh الذي يقوم بأتمتة جميع خطوات البناء.
ببساطة قم بتشغيل
./build.sh gif
لإنشاء مُدقق GIF.
يعمل هذا لجميع تنسيقات الملفات المتوفرة في templates/؛ إذا كان هناك ملف templates/FOO.bt، فإن ./build.sh FOO سيبني مُدققًا.
يوجد Makefile (المصدر في Makefile.am) الذي يقوم بأتمتة جميع خطوات البناء.
(يتطلب GNU make.)
أولاً قم بتشغيل
touch configure Makefile.in
ثم
./configure
ثم
make gif-fuzzer
لإنشاء مُدقق GIF.
يعمل هذا لجميع تنسيقات الملفات المتوفرة في templates/؛ إذا كان هناك ملف templates/FOO.bt، فإن make FOO-fuzzer سيبني مُدققًا.
إذا لم تعمل طريقة make أعلاه، أو إذا كنت تريد تحكمًا أكبر، فقد تضطر إلى المتابعة يدويًا.
قم بتشغيل مُجمّع ffcompile لتجميع القالب الثنائي إلى كود C++. يأخذ وسيطين: القالب الثنائي .bt، وملف .cpp C++ الذي سيتم إنشاؤه.
./ffcompile templates/gif.bt gif.cpp
استخدم الأوامر التالية لإنشاء مُدقق gif-fuzzer.
أولاً، قم بتجميع مُحرك سطر الأوامر العام:
g++ -c -I . -std=c++17 -g -O3 -Wall fuzzer.cpp
(-I . يشير إلى موقع ملف bt.h؛ -std=c++17 يحدد معيار C++.)
ثم، قم بتجميع المحلل/المُجمّع الثنائي:
g++ -c -I . -std=c++17 -g -O3 -Wall gif.cpp
أخيرًا، قم بربط المحلل/المُجمّع الثنائي مع مُحرك سطر الأوامر للحصول على ملف تنفيذي. إذا كنت تستخدم أي مكتبات إضافية (مثل -lz)، فتأكد من تحديدها هنا أيضًا.
g++ -O3 gif.o fuzzer.o -o gif-fuzzer -lz
يمكن تشغيل FormatFuzzer كمُحلل مستقل، أو مولد، أو مُطفر لتنسيقات محددة. بالإضافة إلى ذلك، يمكن استدعاؤه بواسطة مُدققات عامة مثل AFL++ لدمج هذه القدرات الخاصة بالتنسيق في عملية التدقيق (انظر القسم أدناه حول التكامل مع AFL++).
يأخذ المُدقق المُنشأ أمرًا كوسيط أول، متبوعًا بخيارات ووسائط لهذا الأمر.
الأمر الأكثر أهمية هو fuzz، لإنتاج المخرجات. وسائطه هي الملفات التي سيتم إنشاؤها بالتنسيق المناسب.
قم بتشغيل المولد كالتالي:
./gif-fuzzer fuzz output.gif
لإنشاء ملف ثنائي عشوائي output.gif، أو
./gif-fuzzer fuzz out1.gif out2.gif out3.gif
لإنشاء ثلاثة ملفات GIF: out1.gif و out2.gif و out3.gif.
لاحظ أن القالب gif.bt الذي نقدمه قد تم تحسينه بوظائف خاصة لتسهيل إنشاء ملفات صالحة. إذا كنت تستخدم ملفات .bt أصلية دون تعديلات، فقد تحصل على تحذيرات أثناء الإنشاء وقد تُنشئ ملفات غير صالحة.
يمكنك أيضًا تشغيل المُدقق كـ محلل للملفات الثنائية، باستخدام الأمر parse. هذا مفيد إذا كنت تريد اختبار دقة القالب الثنائي، أو إذا كنت تريد طفر مدخل (انظر 'ملفات القرار' أدناه).
لتشغيل المحلل، استخدم:
./gif-fuzzer parse input.gif
سترى رسائل خطأ إذا تعذر تحليل input.gif بنجاح.
أثناء التحليل، يمكنك أيضًا تخزين جميع قرارات التحليل (أي أي بدائل تحليل تم اتخاذها) في ملف قرار. هذا هو سلسلة من البايتات التي تُعدّد القرارات المتخذة.
كل بايت يمثل قرار تحليل واحد. قيمة بايت 0 تعني أنه تم اتخاذ البديل الأول، وقيمة بايت 1 تعني أنه تم اتخاذ البديل الثاني، وهكذا.
يمكنك إنشاء ملف قرار كهذا عند تحليل مدخل:
./gif-fuzzer parse --decisions input.dec input.gif
هنا، يقوم input.dec بتخزين القرارات المتخذة لتحليل input.gif.
يمكنك أيضًا استخدام ملف قرار كهذا عند إنشاء المدخلات. سيتخذ المُدقق بعد ذلك نفس القرارات تمامًا التي تم العثور عليها أثناء التحليل. الأمر التالي يُنشئ ملف GIF جديد باستخدام القرارات المحددة أثناء تحليل input.gif:
./gif-fuzzer fuzz --decisions input.dec input2.gif
إذا كان كل شيء يعمل بشكل جيد، يجب أن يكون كلا الملفين متطابقين:
cmp input.gif input2.gif
عن طريق تطويع ملف قرار (مثل استبدال بايتات فردية)، يمكنك إنشاء مدخلات مشابهة للملف الأصلي الذي تم تحليله. هذا مفيد للتفاعل مع استراتيجيات اختبار محددة ومُدققات مثل AFL، حيث يمكنك استخدام gif-fuzzer وما شابه ذلك كـ مُترجمين من ملفات القرار إلى ملفات ثنائية والعكس: سيقوم AFL بتطويع ملفات القرار، وسيعمل البرنامج قيد الاختبار على الملفات الثنائية المُترجمة. على عكس تطويع الملفات الثنائية مباشرة (كما يفعل AFL عادةً)، فإن هذا سيكون له ميزة وجود مدخلات صالحة دائمًا - وبالتالي التقدم بشكل أسرع نحو التغطية.
بالإضافة إلى المُدققات الخاصة بالتنسيق، مثل gif-fuzzer، يمكن أيضًا تجميع FormatFuzzer في مكتبات مشتركة خاصة بالتنسيق، مثل gif.so (لهذا، قم بتشغيل ./build.sh gif أو make gif.so).
يمكن تحميل هذه المكتبات المشتركة بواسطة مُدققات عامة، مثل AFL++.
لتشغيل AFL++ مع FormatFuzzer، ما عليك سوى اتباع التعليمات الموجودة على نسختنا المعدلة من AFL++. ندعم استراتيجيات تدقيق مختلفة، بما في ذلك:
AFL+FFMut: يُشغّل AFL++ باستخدام FormatFuzzer لتوفير طفرات ذكية خاصة بالتنسيق.
AFL+FFGen: يستخدم FormatFuzzer كمولد خاص بالتنسيق، بينما يُطوّع AFL++ بذور قراراته.