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

syzkaller - Kernel Fuzzer موجه بالتغطية

syzkaller - Kernel Fuzzer موجه بالتغطية

syzkaller هو kernel fuzzer غير مراقب موجه بالتغطية من Google. ينتج تسلسلات syscalls موصوفة باللغة إعلانية (syzlang) وينفذها داخل VMs ويستخدم kernel coverage (KCOV) لتوجيه الطفرة نحو الأكواد غير المستكشفة ويكتشف الأعطال عبر kernel sanitizers. يعمل بشكل مستمر بدون إدخال بشري وقد وجد آلاف أخطاء Linux kernel — نظام syzbot continuous-fuzzing مبني عليه. كما يدعم أنوية أخرى بما فيها BSDs و Fuchsia و Windows.

Fuzzing يوقع أنوية بالتصميم. تشغيل دائماً داخل VMs التخلصية أبداً على جهاز تهتم به.

المتطلبات

المتطلبملاحظة
Go toolchainلبناء syzkaller
Kernel sourceمبني مع KCOV و KASAN ومعلومات التصحيح
VM supportQEMU/KVM أو GCE أو الألواح المادية
Disk imageأدنى rootfs للضيف

البناء

git clone https://github.com/google/syzkaller
cd syzkaller && make
البرنامجالدور
syz-managerorchestrates VMs و corpus و التقارير
syz-fuzzerيعمل داخل الضيف ينتج البرامج
syz-executorينفذ برامج syscall في الضيف
syz-reproيقلل crash إلى reproducer
syz-prog2cتحويل برنامج syz إلى C

Kernel Config المطلوب

الخيارالغرض
CONFIG_KCOV=yتغطية الملاحظة (أساسي)
CONFIG_KASAN=yكشف أخطاء الذاكرة
CONFIG_DEBUG_INFO=yالتقارير المرمزة
CONFIG_KASAN_INLINE=yKASAN أسرع
CONFIG_FAULT_INJECTION=yاستكشف مسارات الخطأ
CONFIG_DEBUG_KMEMLEAK=yكشف التسرب (اختياري)

بدون KCOV الفuzzr أعمى — تغطية الملاحظة هي ما يجعلها فعالة بدلاً من عشوائية.

تكوين المدير

{
  "target": "linux/amd64",
  "http": "127.0.0.1:56741",
  "workdir": "/home/user/syzkaller/workdir",
  "kernel_obj": "/home/user/linux",
  "image": "/home/user/image/bullseye.img",
  "sshkey": "/home/user/image/bullseye.id_rsa",
  "syzkaller": "/home/user/syzkaller",
  "procs": 8,
  "type": "qemu",
  "vm": { "count": 4, "kernel": "/home/user/linux/arch/x86/boot/bzImage", "cpu": 2, "mem": 2048 }
}
./bin/syz-manager -config my.cfg
الحقلالغرض
targetOS/arch تحت الاختبار
kernel_objKernel build dir (للترمز)
image / sshkeyRootfs الضيف والوصول
procsprocesses fuzzing متوازي لكل VM
vm.countعدد VMs المتزامنة
httpعنوان لوحة المعلومات الويب

لوحة المعلومات الويب

المنظريعرض
Crashesعناوين crash الفريدة + العدد
Corpusالبرامج التي تساهم في التغطية
Coverageأي ملفات/أسطر kernel يتم الوصول إليها
Statsمعدل التنفيذ وصحة VM

التغطية هي الرقم الذي تراقبه: إذا وصلت إلى حد أقصى أن الفuzzr استنزف ما يمكن لوصفك syscall الوصول إليه.

syzlang (وصفات Syscall)

# مثال مبسط: صف هيكل حجة syscall
open(file ptr[in, filename], flags flags[open_flags], mode flags[open_mode]) fd
read(fd fd, buf buffer[out], count len[buf])

الأوصاف الجيدة هي التي تسمح لـ fuzzer ببناء برامج صالحة بما يكفي للوصول إلى أكواد عميقة. توسيع sys/linux/*.txt لـ subsystem تحت الاختبار غالباً ما تكون أعلى مساهمة ذات قيمة.

إعادة إنتاج الأعطال

الأمرالغرض
تلقائييعمل المدير syz-repro على new crashes
syz-repro -config my.cfg crash.logقلل يدويا
syz-prog2c -prog repro.syzانبعث reproducer C مستقل
C reproducerما تعلقه بتقرير bug

syzkaller مقابل فuzzers الأخرى

الجانبsyzkallerAFL++libFuzzer
الهدفOS kernels (syscalls)Userspace binariesفي-process libraries
الإدخالSyscall programsملفات/stdinbyte buffers
الملاحظةKCOVEdge coverageSanitizerCoverage
الأفضل للـKernel bug huntingعام binary fuzzingLibrary APIs

لأهداف userspace استخدم AFL++ أو honggfuzz; syzkaller غرض بناء لحد syscall kernel.

الموارد