تخطَّ إلى المحتوى

LibAFL - إطار عمل Fuzzing معياري

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
أضف LibAFLcargo 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_fridaDynamic instrumentation (binary-only)
libafl_nyxSnapshot-based VM fuzzing

Feedbacks

Feedbackمثير للاهتمام عندما
MaxMapFeedbackNew coverage edges hit
TimeFeedbackتغييرات وقت التنفيذ
CrashFeedbackTarget crashed (objective)
TimeoutFeedbackTarget hung (objective)
NewHashFeedbackNew unique crash stack
Combinatorsfeedback_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

الجانبLibAFLAFL++honggfuzz
النموذجبناء الخاص بكجاهز للتشغيلجاهز للتشغيل
الجهدعاليمنخفضمنخفض
المرونةإجماليقابل للتكوينقابل للتكوين
الأفضل للـأهداف غير عادية البحثثنائيات قياسيةبداية سريعة ملاحظة الأجهزة

ابدأ مع AFL++ أو honggfuzz; انتقل إلى LibAFL عندما الهدف input structure أو نموذج التنفيذ يهزمهما.

الموارد