syzkaller - Cheatsheet de Fuzzer de Kernel Guiado por Cobertura
syzkaller é o fuzzer de kernel não supervisionado e guiado por cobertura do Google. Ele gera sequências de syscalls descritas por uma linguagem declarativa (syzlang), executa-as dentro de VMs, usa cobertura de kernel (KCOV) para orientar a mutação em direção ao código inexplorado, e detecta crashes via sanitizers de kernel. Ele é executado continuamente sem entrada humana e encontrou milhares de bugs de kernel Linux — o sistema de fuzzing contínuo syzbot é construído nele. Também suporta outros kernels, incluindo BSDs, Fuchsia e Windows.
Fuzzing quebra kernels por design. Sempre execute dentro de VMs descartáveis, nunca em uma máquina que você se importa.
Pré-requisitos
| Requisito | Nota |
|---|
| Toolchain Go | Para construir syzkaller |
| Código fonte do kernel | Construído com KCOV, KASAN e info de debug |
| Suporte VM | QEMU/KVM, GCE ou placas físicas |
| Imagem de disco | Um rootfs mínimo para o guest |
Construindo
git clone https://github.com/google/syzkaller
cd syzkaller && make
| Binary | Papel |
|---|
syz-manager | Orquestra VMs, corpus e relatórios |
syz-fuzzer | Executa dentro do guest, gera programas |
syz-executor | Executa programas de syscall no guest |
syz-repro | Minimiza um crash em um reprodutor |
syz-prog2c | Converte um programa syz em C |
Configuração de Kernel Necessária
| Opção | Propósito |
|---|
CONFIG_KCOV=y | Feedback de cobertura (essencial) |
CONFIG_KASAN=y | Detecção de erro de memória |
CONFIG_DEBUG_INFO=y | Relatórios simbolizados |
CONFIG_KASAN_INLINE=y | KASAN mais rápido |
CONFIG_FAULT_INJECTION=y | Explore caminhos de erro |
CONFIG_DEBUG_KMEMLEAK=y | Detecção de vazamento (opcional) |
Sem KCOV o fuzzer é cego — feedback de cobertura é o que o torna eficaz em vez de aleatório.
Configuração 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
| Campo | Propósito |
|---|
target | OS/arch sob teste |
kernel_obj | Diretório de build do kernel (para simbolização) |
image / sshkey | Rootfs do guest e acesso |
procs | Processos de fuzzing paralelos por VM |
vm.count | Número de VMs concorrentes |
http | Endereço do dashboard web |
O Dashboard Web
| View | Mostra |
|---|
| Crashes | Títulos de crash únicos + contagens |
| Corpus | Programas contribuindo cobertura |
| Coverage | Quais linhas/arquivos de kernel são alcançados |
| Stats | Taxa de exec, saúde de VM |
A cobertura é o número a observar: se um plateau, o fuzzer esgotou o que suas descrições de syscall podem alcançar.
syzlang (Descrições de Syscall)
# Exemplo simplificado: descreva a estrutura de argumento de um syscall
open(file ptr[in, filename], flags flags[open_flags], mode flags[open_mode]) fd
read(fd fd, buf buffer[out], count len[buf])
Boas descrições são o que permite ao fuzzer construir programas valid-enough para alcançar código profundo. Estender sys/linux/*.txt para um subsistema sub-testado é frequentemente a contribuição de maior valor.
Reproduzindo Crashes
| Comando | Propósito |
|---|
| Automático | O manager executa syz-repro em crashes novos |
syz-repro -config my.cfg crash.log | Minimiza manualmente |
syz-prog2c -prog repro.syz | Emite um reprodutor C independente |
| Reprodutor C | O que você anexa a um relatório de bug |
syzkaller vs Outros Fuzzers
| Aspecto | syzkaller | AFL++ | libFuzzer |
|---|
| Alvo | Kernels de SO (syscalls) | Binários userspace | Bibliotecas in-process |
| Input | Programas de syscall | Arquivos/stdin | Buffers de byte |
| Feedback | KCOV | Cobertura de borda | SanitizerCoverage |
| Melhor para | Caça de bug de kernel | Fuzzing binário geral | APIs de biblioteca |
Para alvo userspace use AFL++ ou honggfuzz; syzkaller é construído especificamente para a fronteira de syscall de kernel.
Recursos