
AFLplusplus v5.03c
O fuzzer afl++ é o afl com patches da comunidade, atualização para qemu 5.1, cobertura livre de colisões, laf-intel & redqueen aprimorados, escalonamentos de potência 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:
- release: o lançamento mais recente
- stable: estado estável do AFL++ - é sincronizada a partir da dev de tempos em tempos quando estamos satisfeitos com sua estabilidade. Esta é a branch padrão.
- dev: estado de desenvolvimento do AFL++ - ponta de lança e você pode pegar um checkout que não compila ou que tem um bug. Só aceitamos PRs (pull requests) para a branch 'dev'!
- (qualquer outra): branches experimentais para trabalhar em recursos específicos ou testar novas funcionalidades ou mudanças.
Ajuda necessária
Confira nossa lista de issues com a tag "help wanted". Esta pode ser sua forma de apoiar e contribuir com o AFL++ - estendê-lo para fazer algo legal. Se você tiver outras ideias - basta criar uma issue e propô-la!
Para todos que desejam contribuir (e enviar pull requests), leia por favor nossas diretrizes de contribuição antes de enviar.
Agradecimentos especiais
Muitas das melhorias ao AFL original e ao AFL++ não seriam possíveis sem feedback, relatórios de bugs ou patches de nossos contribuidores.
Obrigado! (Para pessoas que enviam pull requests - por favor, adicionem-se a esta lista :-)
Lista de contribuidores
Jann Horn Hanno Boeck
Felix Groebert Jakub Wilk
Richard W. M. Jones Alexander Cherepanov
Tom Ritter Hovik Manucharyan
Sebastian Roschke Eberhard Mattes
Padraig Brady Ben Laurie
@dronesec Luca Barbato
Tobias Ospelt Thomas Jarosch
Martin Carpenter Mudge Zatko
Joe Zbiciak Ryan Govostes
Michael Rash William Robinet
Jonathan Gray Filipe Cabecinhas
Nico Weber Jodie Cunningham
Andrew Griffiths Parker Thompson
Jonathan Neuschaefer Tyler Nighswander
Ben Nagy Samir Aguiar
Aidan Thornton Aleksandar Nikolich
Sam Hakim Laszlo Szekeres
David A. Wheeler Turo Lamminen
Andreas Stieger Richard Godbee
Louis Dassy teor2345
Alex Moneger Dmitry Vyukov
Keegan McAllister Kostya Serebryany
Richo Healey Martijn Bogaard
rc0r Jonathan Foote
Christian Holler Dominique Pelle
Jacek Wielemborek Leo Barnes
Jeremy Barnes Jeff Trull
Guillaume Endignoux ilovezfs
Daniel Godas-Lopez Franjo Ivancic
Austin Seipp Daniel Komaromy
Daniel Binderman Jonathan Metzman
Vegard Nossum Jan Kneschke
Kurt Roeckx Marcel Boehme
Van-Thuan Pham Abhik Roychoudhury
Joshua J. Drake Toby Hutton
Rene Freingruber Sergey Davidoff
Sami Liedes Craig Young
Andrzej Jackowski Daniel Hodson
Nathan Voss Dominik Maier
Andrea Biondo Vincent Le Garrec
Khaled Yakdan Kuang-che Wu
Josephine Calliotte Konrad Welc
Thomas Rooijakkers David Carlier
Ruben ten Hove Joey Jiao
fuzzah @intrigus-lgtm
Yaakov Saxon Sergej Schumilo
Ziqiao Kong Ryan Berger
Sangjun Park Scott Guest
Fabian Keil @Jay-1409
Gergely Nagy
Citar
Se você usar o AFL++ em trabalho científico, considere citar nosso artigo apresentado no WOOT'20:
Andrea Fioraldi, Dominik Maier, Heiko Eißfeldt, and Marc Heuse. “AFL++: Combining incremental steps of fuzzing research”. In 14th USENIX Workshop on Offensive Technologies (WOOT 20). USENIX Association, Aug. 2020.
BibTeX
@inproceedings {AFLplusplus-Woot20,
author = {Andrea Fioraldi and Dominik Maier and Heiko Ei{\ss}feldt and Marc Heuse},
title = {{AFL++}: Combining Incremental Steps of Fuzzing Research},
booktitle = {14th {USENIX} Workshop on Offensive Technologies ({WOOT} 20)},
year = {2020},
publisher = {{USENIX} Association},
month = aug,
}
Licença
O AFL++ é licenciado sob a GNU AGPL-3.0-or-later. Em resumo, você pode usar o AFL++ de três formas:
-
Gratuito, sob a AGPL-3.0-or-later: o padrão. Use, modifique e compartilhe o AFL++; se você executar uma versão modificada como um serviço de rede, a AGPL exige que você ofereça aos seus usuários o código-fonte correspondente. Texto completo: LICENSE.
-
Por arquivo, sob a licença em seu cabeçalho: o projeto contém arquivos sob
SPDX-License-Identifier: AGPL-3.0-or-latereSPDX-License-Identifier: Apache-2.0. Sempre verifique o cabeçalho do arquivo que você usa e siga a licença declarada ali; arquivos marcados como Apache-2.0 podem ser reutilizados individualmente sob a Licença Apache-2.0. (Alguns arquivos de terceiros incluídos possuem outras licenças, por exemplo, o plugin GCC sob GPL-3.0-or-later e os passes LLVM SanitizerCoverage sob Apache-2.0-WITH-LLVM-exception — cada um marcado por seu próprio identificador SPDX.) Observe que o binário combinadoafl-fuzzinclui arquivos AGPL, portanto o programa como um todo é AGPL. -
Licença comercial: opcional, para organizações que não podem ou não desejam cumprir a AGPL. O projeto não recebe dinheiro. Em vez disso, você doa EUR 20.000 (€20.000) para a EFF ou o CCC e envia por e-mail a prova para [email protected]; sua licença entra em vigor a partir da data da doação por um ano (renovável mediante nova doação). Termos completos: LICENSE.COMMERCIAL.
Componentes de terceiros incluídos (por exemplo, xxHash, t1ha, libFuzzer, submódulos) mantêm suas próprias licenças. Para a visão geral completa em linguagem simples, consulte LICENSING.md.