Fuzzing com libFuzzer
Encontre falhas em casos extremos testando o seu código com libFuzzer
Fuzzing com libFuzzer é uma aula grátis de C++ Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C++ Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C++ Academy inclui 4 aulas no total.
Por que usar testes aleatórios
Testes aleatórios geram entradas aleatórias para encontrar falhas, travamentos e erros de segurança. As ferramentas modernas usam feedback de cobertura para evoluir entradas que exploram novos caminhos do código.
libFuzzer
libFuzzer faz parte do LLVM e integra-se aos sanitizadores. Escreva uma única função que faça testes aleatórios de um ponto de entrada; a estrutura gera as entradas.
Escrevendo um alvo de testes aleatórios
A assinatura é fixa: receba uma matriz de bytes e retorne 0.
#include <cstdint>
#include <cstddef>
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
parse_input(reinterpret_cast<const char*>(data), size);
return 0;
}Compilação para libFuzzer
Use Clang com a combinação -fsanitize=fuzzer,address. Faça a ligação diretamente — não é necessário usar main.
clang++ -g -O1 -fsanitize=fuzzer,address fuzz.cpp parser.cpp -o fuzz_target
./fuzz_targetMutação guiada por cobertura
libFuzzer acompanha quais caminhos do código cada entrada executa. Ele modifica as entradas promissoras para explorar caminhos mais profundos — de forma muito mais eficiente do que uma geração aleatória às cegas.
Um conjunto de entradas
Inicialize a ferramenta com um diretório de entradas conhecidamente interessantes. A ferramenta cria novas entradas modificando-as.
./fuzz_target corpus/Arquivos de dicionário
Forneça um dicionário de tokens comuns para acelerar a exploração de entradas com estrutura gramatical (HTML, JSON, mensagens de protocolo).
Combine com sanitizadores
Executar sob o AddressSanitizer transforma corrupções silenciosas em falhas imediatas que a ferramenta consegue detectar.
Desempenho
Um único núcleo pode realizar dezenas de milhares de execuções por segundo em alvos pequenos. Execute por horas ou dias; deixe a ferramenta rodando em segundo plano na integração contínua.
Reprodução de falhas
Quando libFuzzer encontra uma falha, salva a entrada no disco. Reproduza-a mais tarde para depurar.
./fuzz_target crash-abc123OSS-Fuzz
O OSS-Fuzz do Google executa continuamente ferramentas de testes aleatórios em projetos de código aberto e relata erros. Muitas bibliotecas conhecidas integram-se a ele.
AFL e Honggfuzz
Existem outras ferramentas de testes aleatórios:
- AFL/AFL++ — baseadas em processos, com aceleração por servidor de bifurcação
- Honggfuzz — oferece suporte a protocolos de rede
libFuzzer é a integração mais fácil com C++.
Quando usar testes aleatórios
Faça testes aleatórios em qualquer código que processe entradas não confiáveis:
- Analisadores (JSON, XML, protobuf)
- Decodificadores (imagem, áudio, vídeo)
- Manipuladores de protocolos de rede
- Qualquer código que leia dados externos
Verificação rápida
O que torna os testes guiados por cobertura mais eficazes do que testes puramente aleatórios?
Recapitulação
libFuzzer é uma ferramenta de testes aleatórios guiada por cobertura e integrada ao Clang. Escreva uma entrada LLVMFuzzerTestOneInput pequena, compile com -fsanitize=fuzzer,address e deixe a ferramenta procurar falhas. Combine-a com sanitizadores e conjuntos de entradas; faça testes aleatórios em qualquer código que processe entradas não confiáveis.
Perguntas Frequentes
A aula “Fuzzing com libFuzzer” é grátis?
Sim — o texto completo de “Fuzzing com libFuzzer” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C++ Academy, atualize para CoddyKit PRO. O curso de C++ Academy inclui 4 aulas no total.
O que vou aprender em “Fuzzing com libFuzzer”?
Encontre falhas em casos extremos testando o seu código com libFuzzer Você pratica C++ Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar C++ Academy?
Nenhuma experiência prévia é necessária. C++ Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.
Quanto tempo leva a aula “Fuzzing com libFuzzer”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de C++ Academy?
Sim. Cada aula de C++ Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Ferramentas de análise estática: clang-tidy, cppcheck
- Sanitizers: Address, Thread e UB Sanitizer
- Fuzzing com libFuzzer
- Integração contínua para projetos C++