
AFLplusplus v5.03c
AFL++ é um fuzzer de última geração, e #1 em benchmarks. Originalmente era baseado no AFL. Hoje vem com qemu 5.1, cobertura livre de colisões, laf-intel & redqueen aprimorados, power schedules do AFLfast++, mutadores MOpt, unicorn_mode, e muito mais!
American Fuzzy Lop plus plus (AFL++)
Versão de lançamento: 5.03c
Versão GitHub: 5.03c
Repositório: https://github.com/AFLplusplus/AFLplusplus
O AFL++ é mantido por:
- Marc "van Hauser" Heuse [email protected]
- Dominik Maier [email protected]
- Andrea Fioraldi [email protected]
- Heiko "hexcoder-" Eissfeldt [email protected]
- frida_mode é mantido por @Worksbutnottested
Originalmente desenvolvido por Michal "lcamtuf" Zalewski.
O AFL++ é um fork superior ao AFL do Google - mais velocidade, mais e melhores mutações, mais e melhor instrumentação, suporte a módulos personalizados, etc.
O AFL++ é licenciado sob a AGPL-3.0-or-later, e também contém arquivos sob a Licença Apache-2.0.
Tudo compilado em um harness de fuzzing é e permanecerá licenciado sob Apache 2.0.
Cada arquivo declara sua própria licença no cabeçalho SPDX-License-Identifier — essa
é a licença que você deve seguir para aquele arquivo.
Uma licença comercial opcional está disponível para organizações que
não podem usar a AGPL (obtida através de doação para uma boa causa — o projeto e seus
mantenedores não recebem dinheiro).
Consulte LICENSING.md para uma visão geral em linguagem simples e a
seção Licença abaixo para detalhes.
Começando
Aqui estão algumas informações para você começar:
- Para uma visão geral da documentação do AFL++ e um guia gráfico muito útil, visite docs/README.md.
- Para começar com tutoriais, acesse docs/tutorials.md.
- Para lançamentos, consulte a
aba Releases e
branches. As melhores branches para usar são, no entanto,
stableoudev- dependendo da sua tolerância a risco. Dê também uma olhada na lista de mudanças importantes no AFL++ e na lista de recursos. - Se você deseja usar o AFL++ para seu trabalho acadêmico, consulte a página de artigos no site.
- Para citar nosso trabalho, veja a seção Citar.
- Para comparações, use a configuração
aflplusplusdo fuzzbench, ou useafl-clang-fastcomAFL_LLVM_CMPLOG=1. Você pode encontrar a configuração padrão doaflplusplusno fuzzbench do Google.
Compilando e instalando o AFL++
Para ter o AFL++ facilmente disponível com tudo compilado, puxe a imagem diretamente do Docker Hub (disponível para x86_64 e arm64):
docker pull aflplusplus/aflplusplus
docker run -ti -v /location/of/your/target:/src aflplusplus/aflplusplus
Esta imagem é publicada automaticamente quando um push para a branch stable acontece
(veja branches). Se você usar o comando acima, encontrará o código-fonte
do seu alvo em /src no contêiner.
Nota: você também pode puxar aflplusplus/aflplusplus:dev, que é o estado de
desenvolvimento mais atual do AFL++.
Para compilar o AFL++ você mesmo - o que recomendamos - continue em docs/INSTALL.md.
Início rápido: Fuzzing com AFL++
NOTA: Antes de começar, leia sobre os riscos de bom senso do fuzzing.
Este é um início rápido para fazer fuzzing em alvos com código-fonte disponível. Para ler sobre o processo em detalhes, consulte docs/fuzzing_in_depth.md.
Para aprender sobre fuzzing em outros tipos de alvos, veja:
- Alvos somente binários: docs/fuzzing_binary-only_targets.md
- Serviços de rede: docs/best_practices.md#fuzzing-a-network-service
- Programas GUI: docs/best_practices.md#fuzzing-a-gui-program
Início rápido passo a passo:
-
Compile o programa ou biblioteca a ser submetido a fuzzing usando
afl-cc. Uma forma comum de fazer isso seria:CC=/path/to/afl-cc CXX=/path/to/afl-c++ ./configure --disable-shared make clean all -
Obtenha um arquivo de entrada pequeno, mas válido, que faça sentido para o programa. Ao fazer fuzzing em sintaxe verbosa (SQL, HTTP, etc.), crie também um dicionário conforme descrito em dictionaries/README.md.
-
Se o programa lê da entrada padrão (stdin), execute
afl-fuzzassim:./afl-fuzz -i seeds_dir -o output_dir -- \ /path/to/tested/program [...program's cmdline...]Para adicionar um dicionário, adicione
-x /path/to/dictionary.txtao afl-fuzz.Se o programa recebe entrada de um arquivo, você pode colocar
@@na linha de comando do programa; o AFL++ colocará um nome de arquivo gerado automaticamente ali para você. -
Investigue qualquer coisa exibida em vermelho na interface do fuzzer consultando prontamente docs/afl-fuzz_approach.md#understanding-the-status-screen.
-
Você encontrará crashes e hangs nos subdiretórios
crashes/ehangs/no diretório-o output_dir. Você pode reproduzir os crashes alimentando-os ao alvo, por exemplo, se seu alvo usa stdin:cat output_dir/crashes/id:000000,* | /path/to/tested/program [...program's cmdline...]Você pode gerar core dumps ou usar gdb diretamente para acompanhar os crashes.
-
Para análise de cobertura do seu fuzzing, recomendamos nossas ferramentas parceiras cov-analysis (relatórios de cobertura baseados em código-fonte a partir de um corpus de fuzzing) e fuzz-reachability (análise estática de quais funções um harness pode alcançar, para distinguir lacunas de cobertura acionáveis de código morto e gerar listas de permissão de instrumentação)
-
Não podemos enfatizar o suficiente - se você quer fazer fuzzing de forma eficaz, leia o documento docs/fuzzing_in_depth.md!
Contato
Perguntas? Preocupações? Relatórios de bugs?
- Os contribuidores podem ser contatados via (por exemplo, criando uma issue - mas apenas para defeitos do AFL++!): https://github.com/AFLplusplus/AFLplusplus.
- Dê uma olhada em nosso FAQ e Melhores Práticas.
- Melhor: junte-se ao servidor Fuzzing Zulip!
Branches
As seguintes branches existem: