libfuzzer-workshop
Materiais do workshop "Modern fuzzing of C/C++ Projects".
A primeira versão do workshop foi apresentada na conferência de segurança ZeroNights'16.
Aviso legal
Este workshop foi originalmente desenvolvido em 2016. Atualmente (2021 e além), a parte prática do workshop pode não funcionar imediatamente, porque o libFuzzer evoluiu muito ao longo dos anos. A parte teórica do workshop ainda é um bom material de aprendizado, mas para as lições práticas é recomendado seguir a versão mais recente do libFuzzer tutorial.
Requisitos
- 2-3 horas do seu tempo
- Sistema operacional baseado em Linux
- Experiência com C/C++ (nada especial, mas você precisa ser capaz de ler, escrever e
compilar código C/C++)
- uma versão recente do compilador clang. Distribuições de
gerenciadores de pacotes são antigas demais e provavelmente não funcionarão
(o workshop se chama "moderno", certo?), você tem duas opções:
- faça checkout do repositório llvm e compile-o você mesmo. Para facilitar,
use o script checkout_build_install_llvm.sh, ele foi
testado em um Ubuntu 16.04 limpo
- uma VirtualBox VM com ambiente de trabalho está disponível,
credenciais:
fuzzer:zeronights
sudo apt-get install -y make autoconf automake libtool pkg-config zlib1g-dev
Não é necessária experiência com fuzzing.
Conteúdo
- Uma introdução a testes de fuzzing
- Um exemplo de fuzzing tradicional
- Fuzzing guiado por cobertura
- Escrevendo fuzzers (exemplos simples)
- Encontrando o Heartbleed (CVE-2014-0160)
- Encontrando o bug de $100.000 do c-ares (CVE-2016-5180)
- Como melhorar seu fuzzer
- Fuzzing do libxml2, aprendendo a melhorar o fuzzer e analisar o desempenho
- Fuzzing do libpng, aprendendo a importância do corpus de sementes e outras coisas
- Fuzzing do re2
- Fuzzing do pcre2
- Integração com Chromium e tarefa de casa
A maioria dos exemplos foi retirada do libFuzzer tutorial e do Fuzzer Test Suite.
Pré-requisitos
libFuzzer
Compilar o libFuzzer é extremamente fácil:
cd libFuzzer
Fuzzer/build.sh
O repositório do libFuzzer pode ser encontrado dentro do projeto compiler-rt do LLVM.
Links