
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 do GitHub: 5.04a
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]
- o 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 o que é compilado em um harness de fuzzing é e permanecerá licenciado sob Apache 2.0.
Cada arquivo declara sua própria licença em seu 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 por meio de doação a 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 de Licença abaixo para detalhes.
Primeiros passos
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 os tutoriais, acesse docs/tutorials.md.
- Para lançamentos, consulte a
aba Releases e os
branches. Os melhores branches a usar são, no entanto,
stableoudev- dependendo da sua tolerância a riscos. Dê também uma olhada na lista de mudanças importantes no AFL++ e na lista de recursos. - Se você quiser usar o AFL++ em seu trabalho acadêmico, confira a página de artigos no site.
- Para citar nosso trabalho, consulte 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, baixe a imagem diretamente do Docker Hub (disponível tanto para x86_64 quanto para arm64):
docker pull aflplusplus/aflplusplus
docker run -ti -v /location/of/your/target:/src aflplusplus/aflplusplus
Esta imagem é publicada automaticamente quando ocorre um push para o branch estável
(consulte branches). Se você usar o comando acima, encontrará o
código-fonte de destino em /src no contêiner.
Nota: você também pode baixar 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 de alvos com o código-fonte disponível. Para ler sobre o processo em detalhes, consulte docs/fuzzing_in_depth.md.
Para aprender sobre fuzzing de outros alvos, consulte:
- Alvos somente binários: docs/fuzzing_binary-only_targets.md
- Serviços de rede: docs/best_practices.md#fuzzing-a-network-service
- Programas com GUI: docs/best_practices.md#fuzzing-a-gui-program
Início rápido passo a passo:
-
Compile o programa ou biblioteca que será alvo de 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 de sintaxe verbosa (SQL, HTTP, etc.), crie também um dicionário conforme descrito em dictionaries/README.md.
-
Se o programa lê de 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 mostrada em vermelho na interface do fuzzer consultando prontamente docs/afl-fuzz_approach.md#understanding-the-status-screen.
-
Você encontrará os crashes e hangs encontrados nos subdiretórios
crashes/ehangs/no diretório-o output_dir. Você pode reproduzir os crashes alimentando-os ao alvo, por exemplo, se o seu alvo estiver usando stdin:cat output_dir/crashes/id:000000,* | /path/to/tested/program [...program's cmdline...]Você pode gerar cores ou usar o 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 allowlists de instrumentação)
-
Não podemos enfatizar isso o suficiente - se você quer fazer fuzzing de forma eficaz, leia o documento docs/fuzzing_in_depth.md!
Contato
Dúvidas? 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 no nosso FAQ e nas Melhores Práticas.
- Melhor: junte-se ao servidor Zulip de Fuzzing!
Branches
Os seguintes branches existem: