syzkaller - Fuzzer Kernel Guidato da Copertura Cheatsheet
syzkaller è il fuzzer kernel non supervisionato guidato da copertura di Google. Genera sequenze di syscall descritte in un linguaggio dichiarativo (syzlang), le esegue dentro VM, usa copertura kernel (KCOV) per dirigere la mutazione verso il codice inesplorato e rileva arresti anomali via sanitizer del kernel. Viene eseguito continuamente senza input umano e ha trovato migliaia di bug del kernel Linux — il sistema di fuzzing continuo syzbot è costruito su di esso. Supporta anche altri kernel inclusi BSD, Fuchsia e Windows.
Il fuzzing fa crash i kernel per design. Esegui sempre dentro VM scartabili, mai su una macchina a cui tieni.
Prerequisiti
| Requisito | Nota |
|---|
| Toolchain Go | Per costruire syzkaller |
| Sorgente kernel | Costruito con KCOV, KASAN e informazioni di debug |
| Supporto VM | QEMU/KVM, GCE o board fisici |
| Immagine di disco | Un rootfs minimo per il guest |
Costruzione
git clone https://github.com/google/syzkaller
cd syzkaller && make
| Binario | Ruolo |
|---|
syz-manager | Orchestra VM, corpus e reporting |
syz-fuzzer | Viene eseguito dentro il guest, genera programmi |
syz-executor | Esegue programmi syscall nel guest |
syz-repro | Minimizza un crash in un reproducer |
syz-prog2c | Converte un programma syz in C |
Configurazione del Kernel Richiesta
| Opzione | Scopo |
|---|
CONFIG_KCOV=y | Feedback di copertura (essenziale) |
CONFIG_KASAN=y | Rilevamento di errori di memoria |
CONFIG_DEBUG_INFO=y | Report simbolizzati |
CONFIG_KASAN_INLINE=y | KASAN più veloce |
CONFIG_FAULT_INJECTION=y | Esplora i percorsi di errore |
CONFIG_DEBUG_KMEMLEAK=y | Rilevamento di leak (opzionale) |
Senza KCOV il fuzzer è cieco — il feedback di copertura è quello che lo rende efficace piuttosto che casuale.
Configurazione del Manager
{
"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
| Campo | Scopo |
|---|
target | OS/arch sotto test |
kernel_obj | Directory di build del kernel (per simbolizzazione) |
image / sshkey | Rootfs guest e accesso |
procs | Processi di fuzzing paralleli per VM |
vm.count | Numero di VM concorrenti |
http | Indirizzo del dashboard web |
Il Dashboard Web
| View | Mostra |
|---|
| Crash | Titoli unici di crash + conteggi |
| Corpus | Programmi che contribuiscono alla copertura |
| Copertura | Quali linee/file del kernel sono raggiunti |
| Statistiche | Tasso di exec, salute VM |
La copertura è il numero da osservare: se si stabilizza, il fuzzer ha esaurito quello che le tue descrizioni di syscall possono raggiungere.
syzlang (Descrizioni di Syscall)
# Esempio semplificato: descrivi la struttura dell''argomento di un syscall
open(file ptr[in, filename], flags flags[open_flags], mode flags[open_mode]) fd
read(fd fd, buf buffer[out], count len[buf])
Le buone descrizioni sono quello che consente al fuzzer di costruire programmi abbastanza validi per raggiungere il codice profondo. Estendere sys/linux/*.txt per un sottosistema sotto-testato è spesso il contributo di valore più alto.
Riproduzione di Crash
| Comando | Scopo |
|---|
| Automatico | Il manager esegue syz-repro su nuovi crash |
syz-repro -config my.cfg crash.log | Minimizza manualmente |
syz-prog2c -prog repro.syz | Emetti un reproducer C autonomo |
| Reproducer C | Quello che allega a un bug report |
syzkaller vs Altri Fuzzer
| Aspetto | syzkaller | AFL++ | libFuzzer |
|---|
| Target | Kernel del sistema operativo (syscall) | Binari userspace | Librerie in-process |
| Input | Programmi di syscall | File/stdin | Buffer di byte |
| Feedback | KCOV | Copertura edge | SanitizerCoverage |
| Migliore per | Ricerca di bug del kernel | Fuzzing binario generale | API di libreria |
Per target userspace usa AFL++ o honggfuzz; syzkaller è costruito appositamente per il confine syscall del kernel.
Risorse