Ir al contenido

syzkaller - Fuzzer de kernel guiado por cobertura

syzkaller - Fuzzer de kernel guiado por cobertura

syzkaller es el fuzzer de kernel no supervisado y guiado por cobertura de Google. Genera secuencias de syscalls descritas en un lenguaje declarativo (syzlang), las ejecuta dentro de VMs, usa cobertura de kernel (KCOV) para dirigir la mutación hacia código no explorado, y detecta crashes vía sanitizers del kernel. Se ejecuta continuamente sin entrada humana y ha encontrado miles de bugs del kernel Linux — el sistema de fuzzing continuo syzbot está construido sobre él. También soporta otros kernels incluyendo BSDs, Fuchsia y Windows.

El fuzzing crashes kernels por diseño. Siempre ejecuta dentro de VMs desechables, nunca en una máquina que te importe.

Prerequisitos

RequisitoNota
Toolchain GoPara compilar syzkaller
Fuente del kernelCompilado con KCOV, KASAN e info de debug
Soporte de VMQEMU/KVM, GCE o boards físicas
Imagen de discoUn rootfs mínimo para el guest

Compilando

git clone https://github.com/google/syzkaller
cd syzkaller && make
BinarioRol
syz-managerOrquesta VMs, corpus y reporte
syz-fuzzerSe ejecuta dentro del guest, genera programas
syz-executorEjecuta programas de syscalls en el guest
syz-reproMinimiza un crash en un reproductor
syz-prog2cConvierte un programa syz a C

Configuración de kernel requerida

OpciónPropósito
CONFIG_KCOV=yFeedback de cobertura (esencial)
CONFIG_KASAN=yDetección de errores de memoria
CONFIG_DEBUG_INFO=yReportes simbolizados
CONFIG_KASAN_INLINE=yKASAN más rápido
CONFIG_FAULT_INJECTION=yExplorar rutas de error
CONFIG_DEBUG_KMEMLEAK=yDetección de leak (opcional)

Sin KCOV el fuzzer está ciego — el feedback de cobertura es lo que lo hace efectivo en lugar de aleatorio.

Configuración de 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
CampoPropósito
targetOS/arch bajo test
kernel_objDirectorio de build del kernel (para simbolización)
image / sshkeyRootfs del guest y acceso
procsProcesos de fuzzing paralelos por VM
vm.countNúmero de VMs concurrentes
httpDirección del dashboard web

El dashboard web

VistaMuestra
CrashesTítulos únicos de crash + conteos
CorpusProgramas que contribuyen cobertura
CoverageQué líneas/archivos del kernel se alcanzan
StatsTasa de exec, salud de VM

Cobertura es el número a observar: si se meseta, el fuzzer ha agotado lo que tus descripciones de syscalls pueden alcanzar.

syzlang (Descripciones de syscalls)

# Ejemplo simplificado: describir la estructura de argumentos de 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])

Las buenas descripciones son lo que permite al fuzzer construir programas lo bastante válidos para alcanzar código profundo. Extender sys/linux/*.txt para un subsistema bajo-testeado es frecuentemente la contribución de mayor valor.

Reproduciendo crashes

ComandoPropósito
AutomáticoEl manager ejecuta syz-repro en crashes nuevos
syz-repro -config my.cfg crash.logMinimizar manualmente
syz-prog2c -prog repro.syzEmitir un reproductor C standalone
Reproductor CLo que adjuntas a un reporte de bug

syzkaller vs otros fuzzers

AspectosyzkallerAFL++libFuzzer
ObjetivoOS kernels (syscalls)Binarios userspaceLibrerías in-process
EntradaProgramas de syscallsArchivos/stdinBuffers de bytes
FeedbackKCOVCobertura de edgeSanitizerCoverage
Mejor paraBúsqueda de bugs del kernelFuzzing binario generalAPIs de librería

Para objetivos userspace usa AFL++ o honggfuzz; syzkaller está propósito-construido para el límite de syscall del kernel.

Recursos