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 support | QEMU/KVM أو GCE أو الألواح المادية |
| Disk image | أدنى rootfs للضيف |
البناء
git clone https://github.com/google/syzkaller
cd syzkaller && make
| البرنامج | الدور |
|---|
syz-manager | orchestrates 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=y | KASAN أسرع |
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
| الحقل | الغرض |
|---|
target | OS/arch تحت الاختبار |
kernel_obj | Kernel build dir (للترمز) |
image / sshkey | Rootfs الضيف والوصول |
procs | processes 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 الأخرى
| الجانب | syzkaller | AFL++ | libFuzzer |
|---|
| الهدف | OS kernels (syscalls) | Userspace binaries | في-process libraries |
| الإدخال | Syscall programs | ملفات/stdin | byte buffers |
| الملاحظة | KCOV | Edge coverage | SanitizerCoverage |
| الأفضل للـ | Kernel bug hunting | عام binary fuzzing | Library APIs |
لأهداف userspace استخدم AFL++ أو honggfuzz; syzkaller غرض بناء لحد syscall kernel.
الموارد