syzkaller - Coverage-Guided Kernel Fuzzer Cheatsheet
syzkaller ist Googles unbeaufsichtigter, Coverage-gesteuerter Kernel-Fuzzer. Er generiert Sequenzen von Syscalls, die durch eine deklarative Sprache (syzlang) beschrieben werden, führt sie in VMs aus, nutzt Kernel-Coverage (KCOV), um Mutation zu erforschen, unexploriertem Code zu steuern, und erkennt Crashes via Kernel-Sanitizers. Er läuft kontinuierlich ohne menschliche Eingabe und hat Tausende von Linux-Kernel-Bugs gefunden — das syzbot Continuous-Fuzzing-System basiert darauf. Es unterstützt auch andere Kernel, einschließlich BSDs, Fuchsia und Windows.
Fuzzing crasht Kernel absichtlich. Führe immer in wegwerfbaren VMs aus, nie auf einem Machine, das dir wichtig ist.
Vorbedingungen
| Anforderung | Anmerkung |
|---|
| Go-Toolchain | Um syzkaller zu bauen |
| Kernel-Quellcode | Gebaut mit KCOV, KASAN und Debug-Info |
| VM-Unterstützung | QEMU/KVM, GCE oder physikalische Boards |
| Disk-Image | Ein minimales Rootfs für den Guest |
Bauen
git clone https://github.com/google/syzkaller
cd syzkaller && make
| Binärdatei | Rolle |
|---|
syz-manager | Orchestriert VMs, Corpus und Reporting |
syz-fuzzer | Läuft im Guest, generiert Programme |
syz-executor | Führt Syscall-Programme im Guest aus |
syz-repro | Minimiert einen Crash zu einem Reproducer |
syz-prog2c | Konvertiere ein syz-Programm zu C |
Erforderliche Kernel-Konfiguration
| Option | Zweck |
|---|
CONFIG_KCOV=y | Coverage-Rückmeldung (wesentlich) |
CONFIG_KASAN=y | Speicherfehler-Erkennung |
CONFIG_DEBUG_INFO=y | Symbolisierte Reports |
CONFIG_KASAN_INLINE=y | Schnelleres KASAN |
CONFIG_FAULT_INJECTION=y | Erkunde Fehlerpfade |
CONFIG_DEBUG_KMEMLEAK=y | Leck-Erkennung (optional) |
Ohne KCOV ist der Fuzzer blind — Coverage-Rückmeldung ist das, was ihn effektiv statt zufällig macht.
Manager-Konfiguration
{
"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
| Feld | Zweck |
|---|
target | Zu testendes OS/Arch |
kernel_obj | Kernel-Buildverzeichnis (für Symbolisierung) |
image / sshkey | Guest-Rootfs und Zugriff |
procs | Parallele Fuzzing-Prozesse pro VM |
vm.count | Anzahl gleichzeitiger VMs |
http | Web-Dashboard-Adresse |
Das Web-Dashboard
| Ansicht | Zeigt |
|---|
| Crashes | Eindeutige Crash-Titel + Zähler |
| Corpus | Programme, die Coverage beitragen |
| Coverage | Welche Kernel-Dateien/Zeilen erreicht werden |
| Stats | Exec-Rate, VM-Gesundheit |
Coverage ist die Zahl zum Beobachten: Wenn Sie ein Plateau erreicht, hat der Fuzzer ausgeschöpft, was deine Syscall-Beschreibungen erreichen können.
syzlang (Syscall-Beschreibungen)
# Vereinfachtes Beispiel: beschreibe eine Syscalls Argument-Struktur
open(file ptr[in, filename], flags flags[open_flags], mode flags[open_mode]) fd
read(fd fd, buf buffer[out], count len[buf])
Gute Beschreibungen ermöglichen es dem Fuzzer, plausible Programme zu bauen, um tiefe Code zu erreichen. Das Erweitern von sys/linux/*.txt für ein unter-getestetes Subsystem ist oft der höchste Wertbeitrag.
Crashes reproduzieren
| Befehl | Zweck |
|---|
| Automatisch | Der Manager läuft syz-repro bei neuen Crashes |
syz-repro -config my.cfg crash.log | Minimiere manuell |
syz-prog2c -prog repro.syz | Emit einen standalone C Reproducer |
| C Reproducer | Was Sie einem Bug-Bericht anhängen |
syzkaller vs andere Fuzzer
| Aspekt | syzkaller | AFL++ | libFuzzer |
|---|
| Ziel | OS-Kernel (Syscalls) | Userspace-Binärdateien | In-Process-Bibliotheken |
| Input | Syscall-Programme | Dateien/stdin | Byte-Puffer |
| Rückmeldung | KCOV | Edge-Coverage | SanitizerCoverage |
| Bestes für | Kernel-Bug-Jagd | Allgemeines Binary-Fuzzing | Library-APIs |
Für Userspace-Ziele verwende AFL++ oder honggfuzz; syzkaller ist speziell für die Kernel-Syscall-Grenze gebaut.
Ressourcen