Salta ai contenuti

syzkaller - Fuzzer Kernel Guidato da Copertura

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

RequisitoNota
Toolchain GoPer costruire syzkaller
Sorgente kernelCostruito con KCOV, KASAN e informazioni di debug
Supporto VMQEMU/KVM, GCE o board fisici
Immagine di discoUn rootfs minimo per il guest

Costruzione

git clone https://github.com/google/syzkaller
cd syzkaller && make
BinarioRuolo
syz-managerOrchestra VM, corpus e reporting
syz-fuzzerViene eseguito dentro il guest, genera programmi
syz-executorEsegue programmi syscall nel guest
syz-reproMinimizza un crash in un reproducer
syz-prog2cConverte un programma syz in C

Configurazione del Kernel Richiesta

OpzioneScopo
CONFIG_KCOV=yFeedback di copertura (essenziale)
CONFIG_KASAN=yRilevamento di errori di memoria
CONFIG_DEBUG_INFO=yReport simbolizzati
CONFIG_KASAN_INLINE=yKASAN più veloce
CONFIG_FAULT_INJECTION=yEsplora i percorsi di errore
CONFIG_DEBUG_KMEMLEAK=yRilevamento 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
CampoScopo
targetOS/arch sotto test
kernel_objDirectory di build del kernel (per simbolizzazione)
image / sshkeyRootfs guest e accesso
procsProcessi di fuzzing paralleli per VM
vm.countNumero di VM concorrenti
httpIndirizzo del dashboard web

Il Dashboard Web

ViewMostra
CrashTitoli unici di crash + conteggi
CorpusProgrammi che contribuiscono alla copertura
CoperturaQuali linee/file del kernel sono raggiunti
StatisticheTasso 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

ComandoScopo
AutomaticoIl manager esegue syz-repro su nuovi crash
syz-repro -config my.cfg crash.logMinimizza manualmente
syz-prog2c -prog repro.syzEmetti un reproducer C autonomo
Reproducer CQuello che allega a un bug report

syzkaller vs Altri Fuzzer

AspettosyzkallerAFL++libFuzzer
TargetKernel del sistema operativo (syscall)Binari userspaceLibrerie in-process
InputProgrammi di syscallFile/stdinBuffer di byte
FeedbackKCOVCopertura edgeSanitizerCoverage
Migliore perRicerca di bug del kernelFuzzing binario generaleAPI di libreria

Per target userspace usa AFL++ o honggfuzz; syzkaller è costruito appositamente per il confine syscall del kernel.

Risorse