LibAFL - إطار عمل Fuzzing معياري
LibAFL هو إطار عمل fuzzing وليس fuzzer. مكتوبة في Rust من قبل فريق AFL++ فإنها توفر كتل البناء القابلة للتركيب — observers و feedbacks و mutators و schedulers و stages و executors — التي تجمعها إلى fuzzer مكيف لهدفك. التحفيز هو أن fuzzers monolithic تعمل بشكل جيد على الأهداف التقليدية وسيئة على الأهداف غير العادية (بروتوكولات مخصصة و firmware مُحاكي و kernels و grammars) حيث تنتهي بمحاربة الأداة. مع LibAFL تبني بالضبط fuzzer يحتاجه الهدف وتحصل على scaling متعدد الأنوية مجاني.
بناء fuzzer هو عمل أكثر من تشغيل واحد. اصل إلى LibAFL عندما الأدوات خارج الرف لا تناسب فعلاً.
الإعداد
| الخطوة | الأمر |
|---|
| مشروع جديد | cargo new my_fuzzer && cd my_fuzzer |
| أضف LibAFL | cargo add libafl libafl_bolts |
| هدف البرمجة | cargo add libafl_targets (أو libafl_qemu و libafl_frida) |
| بناء | cargo build --release |
المفاهيم الأساسية
| المكون | الدور |
|---|
| الإدخال | ما يتم fuzzing (bytes و grammar tree و syscalls) |
| Observer | السجلات البيانات أثناء التشغيل (coverage map و timing) |
| Feedback | يقرر إذا كان التشغيل “مثيراً للاهتمام” |
| Objective | يقرر إذا كان التشغيل حل (crash) |
| Corpus | التخزين لإدخالات مثيرة للاهتمام |
| Mutator | يحول الإدخالات |
| Scheduler | يختار الإدخال التالي للتشغيل |
| Stage | مرحلة تطبق لكل إدخال (mutate و trim و calibrate) |
| Executor | يشغل الهدف مع إدخال |
Fuzzer الحد الأدنى (الشكل)
// مفهومي - انظر أمثلة LibAFL للأكواد الكاملة
let mut feedback = MaxMapFeedback::new(&edges_observer);
let mut objective = CrashFeedback::new();
let mut state = StdState::new(
StdRand::with_seed(current_nanos()),
InMemoryCorpus::new(),
OnDiskCorpus::new("./crashes")?,
&mut feedback,
&mut objective,
)?;
let scheduler = QueueScheduler::new();
let mut fuzzer = StdFuzzer::new(scheduler, feedback, objective);
let mut executor = InProcessExecutor::new(
&mut harness, tuple_list!(edges_observer), &mut fuzzer, &mut state, &mut mgr,
)?;
let mutator = StdScheduledMutator::new(havoc_mutations());
let mut stages = tuple_list!(StdMutationalStage::new(mutator));
fuzzer.fuzz_loop(&mut stages, &mut executor, &mut state, &mut mgr)?;
Executors (كيف يعمل الهدف)
| Executor | الاستخدام |
|---|
InProcessExecutor | الأسرع; harness في نفس العملية |
ForkserverExecutor | أسلوب AFL لـ external binaries |
CommandExecutor | تشغيل أمر خارجي لكل إدخال |
libafl_qemu | أهداف محاكاة / binary-only fuzzing |
libafl_frida | Dynamic instrumentation (binary-only) |
libafl_nyx | Snapshot-based VM fuzzing |
Feedbacks
| Feedback | مثير للاهتمام عندما |
|---|
MaxMapFeedback | New coverage edges hit |
TimeFeedback | تغييرات وقت التنفيذ |
CrashFeedback | Target crashed (objective) |
TimeoutFeedback | Target hung (objective) |
NewHashFeedback | New unique crash stack |
| Combinators | feedback_or! و feedback_and! للتركيب |
Mutators
| Mutator | يفعل |
|---|
havoc_mutations() | AFL-style طفرات عشوائية قياسية |
tokens_mutations() | إدراج القاموس/token |
| Grammar mutators | إنشاء يدرك البناء |
| Custom | تنفيذ الـ Mutator trait لنوع الإدخال |
أنواع الإدخال المخصص زائد mutators مخصص هم السبب الرئيسي للاختيار LibAFL — fuzzing بروتوكول أو AST بذكاء بدلاً من قلب bytes.
Scaling متعدد الأنوية
| الآلية | ملاحظة |
|---|
LlmpRestartingEventManager | انخفاض overhead رسائل بين الأنوية |
Launcher | تحديد fuzzer واحد لكل نوى بـ corpus مشترك |
| Corpus sync | الإدخالات المثيرة للاهتمام تنتشر عبر الحالات |
| Restarting | ينجو من أعطال عملية fuzzer |
LibAFL مقابل Fuzzers Ready-Made
| الجانب | LibAFL | AFL++ | honggfuzz |
|---|
| النموذج | بناء الخاص بك | جاهز للتشغيل | جاهز للتشغيل |
| الجهد | عالي | منخفض | منخفض |
| المرونة | إجمالي | قابل للتكوين | قابل للتكوين |
| الأفضل للـ | أهداف غير عادية البحث | ثنائيات قياسية | بداية سريعة ملاحظة الأجهزة |
ابدأ مع AFL++ أو honggfuzz; انتقل إلى LibAFL عندما الهدف input structure أو نموذج التنفيذ يهزمهما.
الموارد