Fuzzing-101
Estrutura
- Exercício 1: Xpdf, CVE-2019-13288, 120 minutos, Afl-clang-fast, Afl-fuzz, GDB
- Exercício 2: libexif, CVE-2009-3895, CVE-2012-2836, 6 horas, Afl-clang-lto, biblioteca de fuzz, Eclipse IDE
- Exercício 3: TCPdump, CVE-2017-13028, 4 horas, ASan, Sanitizers
- Exercício 4: LibTIFF, CVE-2016-9297, 3 horas, cobertura de código, LCOV
- Exercício 5: Libxml2, CVE-2017-9048, 3 horas, dicionário, paralelização básica, fuzzing de argumentos de linha de comando
- Exercício 6: GIMP, CVE-2016-4994, bug bônus, 7 horas, fuzzing persistente, fuzzing de aplicações interativas
- Exercício 7: VLC media player, CVE-2019-14776, 6 horas, instrumentação parcial, harness de fuzzing
- Exercício 8: Adobe Reader, 8 horas, fuzzing de aplicações de código fechado, instrumentação com QEMU
- Exercício 9: 7-Zip, CVE-2016-2334, 8 horas, WinAFL, fuzzing de aplicações Windows
- Exercício 10 (desafio final): Google Chrome / V8, CVE-2019-5847, 8 horas, Fuzzilli, fuzzing de engine JavaScript
Changelog
- 14 de fevereiro de 2022: correção do erro de digitação em 'wget' no Exercício 5
- 25 de novembro de 2021: atualização e correções no Exercício 3
Para quem é este curso?
- Pessoas que querem aprender os fundamentos de fuzzing
- Pessoas que querem encontrar vulnerabilidades em projetos de software reais
Requisitos
- Sistema Linux e conexão com a internet necessários
- Conhecimentos básicos de Linux recomendados
- Todos os exercícios foram testados no Ubuntu 20.04.2 LTS
- Este curso usa AFL++, um novo fork do AFL de Michał "lcamtuf" Zalewski
O que é fuzzing?
- Teste de fuzz (ou fuzzing): técnica automatizada de teste de software que fornece entradas aleatórias/modificadas a um programa e monitora exceções/falhas
- AFL, libFuzzer e HonggFuzz são exemplos de fuzzers bem-sucedidos em aplicações reais
- Fuzzer evolutivo baseado em cobertura: coleta e compara dados de cobertura de código para selecionar entradas que encontram novos caminhos de execução
Fuzzer evolutivo baseado em cobertura
- Evolutivo: abordagem meta-heurística inspirada em algoritmos evolutivos, que encontra novas falhas por meio da evolução e mutação de um subconjunto inicial (seeds)
- Baseado em cobertura: coleta e compara dados de cobertura de código para selecionar entradas que encontram novos caminhos de execução
Agradecimentos
- Pessoas que ajudaram: Xavier RENE-CORAIL, Alan Vivona, Jason White, Octavio Gianatiempo, van Hauser, Marc Poulhiès, Xu Hanyu, tclan126, epi052, Jeremias Gomes
Contato
- Se precisar de ajuda ou tiver sugestões, participe do canal
#fuzzing no GitHub Security Lab Slack
Resumo do GN⁺
- Este curso é útil para aprender os conceitos básicos de fuzzing e encontrar vulnerabilidades em software real
- É possível aprender técnicas de fuzzing por meio de vários casos reais usando ferramentas como AFL++
- O fuzzing desempenha um papel importante no fortalecimento da estabilidade e da segurança do software, e este curso oferece uma abordagem prática para isso
- Ferramentas com funcionalidades semelhantes incluem libFuzzer e HonggFuzz
1 comentários
Opiniões no Hacker News
O texto do link leva cerca de 11 minutos para ler, e a diferença em relação à abordagem do golang é interessante
Há curiosidade sobre técnicas para orientar o fuzzing de forma mais eficaz
É surpreendente que Heartbleed não esteja na lista
Uma opinião agradecendo pelo compartilhamento