honggfuzz - Fuzzer موجه بالملاحظة والأمان
honggfuzz هو fuzzer موجه بالملاحظة والأمان من Google. معروف بأنه مباشر في توجيه هدف ففاز وsolid fuzzing متعدد العمليات ومتعدد الخيوط من الصندوق ويدعم كل من البرمجة الآلية و ملاحظة التغطية المادية (Intel BTS/PT) — هذا الأخير يسمح لك fuzzify ثنائيات لا يمكنك إعادة تجميعها. لديها سجل طويل من إيجاد الضعفيات الحقيقية في البرامج المستخدمة على نطاق واسع.
Fuzzing يمكن استهلاك كميات كبيرة من CPU والقرص. تشغيل على قدرة مخصصة وفي بيئة معزولة.
التثبيت
| المنصة | الأمر |
|---|
| Debian/Ubuntu | sudo apt install honggfuzz |
| من المصدر | git clone https://github.com/google/honggfuzz && make |
| macOS | brew install honggfuzz |
| التحقق | honggfuzz --help |
وضعين
| الوضع | الاستخدام |
|---|
| File-based | الهدف يقرأ ملف/stdin; honggfuzz يحور الإدخالات |
| Persistent | الهدف يكشف فuzz entry point; أسرع بكثير |
Fuzzing على أساس الملفات
# fuzz برنامج يأخذ وسيطة ملف
honggfuzz -i ./input_corpus -W ./workspace -- ./target ___FILE___
| العلم | الغرض |
|---|
-i DIR | دليل input corpus |
-W DIR | Workspace (crashes و stats) |
-o DIR | Output corpus |
___FILE___ | Placeholder يتم استبداله بملف الإدخال |
-s | تغذية الإدخال عبر stdin بدلاً من ذلك |
-t SECS | timeout لكل تشغيل |
-n N | عدد fuzzing threads المتزامنة |
الوضع الدائم (سريع)
#include <stdint.h>
#include <stddef.h>
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
parse_input(data, size); // your target function
return 0;
}
# Compile مع honggfuzz's clang wrapper ثم fuzz
hfuzz-clang -fsanitize=address fuzz_target.c -o fuzz_target
honggfuzz -i corpus -P -- ./fuzz_target
| العنصر | ملاحظة |
|---|
LLVMFuzzerTestOneInput | نفس entry point مثل libFuzzer — الأهداف محمولة |
-P | تفعيل الوضع الدائم |
hfuzz-clang / hfuzz-gcc | مغلفات المترجم التي تضيف البرمجة |
الوضع الدائم يتجنب بدء العملية لكل إدخال غالباً ما يعطي 10–100x أكثر عمليات في الثانية.
خيارات ملاحظة التغطية
| الآلية | العلم / المتطلب |
|---|
| برمجة البرمجيات | تجميع مع hfuzz-clang (الافتراضي والأفضل) |
| Intel BTS | --linux_perf_bts_edge (لا إعادة تجميع) |
| Intel PT | --linux_perf_ipt_block (لا إعادة تجميع) |
| عد التعليمات/الفروع | --linux_perf_instr و --linux_perf_branch |
ملاحظة الأجهزة هي المخرج للثنائيات الإغلاق المصدر — تحصل على ملاحظة التغطية بدون وصول الكود.
Sanitizers
# بناء مع ASan + UBSan لكشف crash أفضل
hfuzz-clang -fsanitize=address,undefined target.c -o target
| Sanitizer | يمسك |
|---|
| ASan | Buffer overflows و use-after-free |
| UBSan | السلوك غير المحدد |
| MSan | Uninitialized reads |
| LeakSanitizer | Memory leaks |
المراقبة والإخراج
| البند | حيث |
|---|
| Live stats | Terminal UI (execs/sec و coverage و crashes) |
| Crashes | WORKSPACE/*.fuzz files |
| التقرير | HONGGFUZZ.REPORT.TXT |
| Crash naming | يتضمن signal وfaulting address |
| العلم | التأثير |
|---|
-N N | التوقف بعد N iterations |
--exit_upon_crash | التوقف في أول crash |
-v | Verbose |
-Q | Quiet |
Triage Workflow
# 1) إعادة إنتاج crash
./target < WORKSPACE/SIGSEGV.PC.*.fuzz
# 2) احصل على stack trace تحت debugger
gdb --args ./target WORKSPACE/SIGSEGV.PC.*.fuzz
# 3) قلل الإدخال ثم قدم البلاغ مع reproducer
honggfuzz مقابل Fuzzers الأخرى
| الجانب | honggfuzz | AFL++ | libFuzzer | LibAFL |
|---|
| الإعداد | سهل جداً | سهل | سهل (في-process) | بناء الخاص بك |
| أهداف الكود المغلق | نعم (Intel PT/BTS) | QEMU mode | لا | نعم |
| Persistent mode | نعم | نعم | Native | نعم |
| الأفضل للـ | بداية سريعة ملاحظة أجهزة | منطقة العملاء الواسعة | Library APIs | Fuzzers مخصص |
قارن مع AFL++ للأوسع منطقة و LibAFL عندما تحتاج إلى بناء fuzzer مخصص.
الموارد