Pular para o conteúdo

syzkaller - Cheatsheet de Fuzzer de Kernel Guiado por Cobertura

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

RequisitoNota
Toolchain GoPara construir syzkaller
Código fonte do kernelConstruído com KCOV, KASAN e info de debug
Suporte VMQEMU/KVM, GCE ou placas físicas
Imagem de discoUm rootfs mínimo para o guest

Construindo

git clone https://github.com/google/syzkaller
cd syzkaller && make
BinaryPapel
syz-managerOrquestra VMs, corpus e relatórios
syz-fuzzerExecuta dentro do guest, gera programas
syz-executorExecuta programas de syscall no guest
syz-reproMinimiza um crash em um reprodutor
syz-prog2cConverte um programa syz em C

Configuração de Kernel Necessária

OpçãoPropósito
CONFIG_KCOV=yFeedback de cobertura (essencial)
CONFIG_KASAN=yDetecção de erro de memória
CONFIG_DEBUG_INFO=yRelatórios simbolizados
CONFIG_KASAN_INLINE=yKASAN mais rápido
CONFIG_FAULT_INJECTION=yExplore caminhos de erro
CONFIG_DEBUG_KMEMLEAK=yDetecçã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
CampoPropósito
targetOS/arch sob teste
kernel_objDiretório de build do kernel (para simbolização)
image / sshkeyRootfs do guest e acesso
procsProcessos de fuzzing paralelos por VM
vm.countNúmero de VMs concorrentes
httpEndereço do dashboard web

O Dashboard Web

ViewMostra
CrashesTítulos de crash únicos + contagens
CorpusProgramas contribuindo cobertura
CoverageQuais linhas/arquivos de kernel são alcançados
StatsTaxa 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

ComandoPropósito
AutomáticoO manager executa syz-repro em crashes novos
syz-repro -config my.cfg crash.logMinimiza manualmente
syz-prog2c -prog repro.syzEmite um reprodutor C independente
Reprodutor CO que você anexa a um relatório de bug

syzkaller vs Outros Fuzzers

AspectosyzkallerAFL++libFuzzer
AlvoKernels de SO (syscalls)Binários userspaceBibliotecas in-process
InputProgramas de syscallArquivos/stdinBuffers de byte
FeedbackKCOVCobertura de bordaSanitizerCoverage
Melhor paraCaça de bug de kernelFuzzing binário geralAPIs de biblioteca

Para alvo userspace use AFL++ ou honggfuzz; syzkaller é construído especificamente para a fronteira de syscall de kernel.

Recursos