Zum Inhalt springen

syzkaller - Coverage-Guided Kernel Fuzzer Cheatsheet

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

AnforderungAnmerkung
Go-ToolchainUm syzkaller zu bauen
Kernel-QuellcodeGebaut mit KCOV, KASAN und Debug-Info
VM-UnterstützungQEMU/KVM, GCE oder physikalische Boards
Disk-ImageEin minimales Rootfs für den Guest

Bauen

git clone https://github.com/google/syzkaller
cd syzkaller && make
BinärdateiRolle
syz-managerOrchestriert VMs, Corpus und Reporting
syz-fuzzerLäuft im Guest, generiert Programme
syz-executorFührt Syscall-Programme im Guest aus
syz-reproMinimiert einen Crash zu einem Reproducer
syz-prog2cKonvertiere ein syz-Programm zu C

Erforderliche Kernel-Konfiguration

OptionZweck
CONFIG_KCOV=yCoverage-Rückmeldung (wesentlich)
CONFIG_KASAN=ySpeicherfehler-Erkennung
CONFIG_DEBUG_INFO=ySymbolisierte Reports
CONFIG_KASAN_INLINE=ySchnelleres KASAN
CONFIG_FAULT_INJECTION=yErkunde Fehlerpfade
CONFIG_DEBUG_KMEMLEAK=yLeck-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
FeldZweck
targetZu testendes OS/Arch
kernel_objKernel-Buildverzeichnis (für Symbolisierung)
image / sshkeyGuest-Rootfs und Zugriff
procsParallele Fuzzing-Prozesse pro VM
vm.countAnzahl gleichzeitiger VMs
httpWeb-Dashboard-Adresse

Das Web-Dashboard

AnsichtZeigt
CrashesEindeutige Crash-Titel + Zähler
CorpusProgramme, die Coverage beitragen
CoverageWelche Kernel-Dateien/Zeilen erreicht werden
StatsExec-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

BefehlZweck
AutomatischDer Manager läuft syz-repro bei neuen Crashes
syz-repro -config my.cfg crash.logMinimiere manuell
syz-prog2c -prog repro.syzEmit einen standalone C Reproducer
C ReproducerWas Sie einem Bug-Bericht anhängen

syzkaller vs andere Fuzzer

AspektsyzkallerAFL++libFuzzer
ZielOS-Kernel (Syscalls)Userspace-BinärdateienIn-Process-Bibliotheken
InputSyscall-ProgrammeDateien/stdinByte-Puffer
RückmeldungKCOVEdge-CoverageSanitizerCoverage
Bestes fürKernel-Bug-JagdAllgemeines Binary-FuzzingLibrary-APIs

Für Userspace-Ziele verwende AFL++ oder honggfuzz; syzkaller ist speziell für die Kernel-Syscall-Grenze gebaut.

Ressourcen