Voltar às atualizações
New releaseSep 4, 2026

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!

Compartilhar

American Fuzzy Lop plus plus (AFL++)

AFL++ logo

Versão de lançamento: 5.03c

Versão GitHub: 5.03c

Repositório: https://github.com/AFLplusplus/AFLplusplus

O AFL++ é mantido por:

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, stable ou dev - 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 aflplusplus do fuzzbench, ou use afl-clang-fast com AFL_LLVM_CMPLOG=1. Você pode encontrar a configuração padrão do aflplusplus no 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:

Início rápido passo a passo:

  1. 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
    
  2. 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.

  3. Se o programa lê da entrada padrão (stdin), execute afl-fuzz assim:

    ./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.txt ao 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ê.

  4. Investigue qualquer coisa exibida em vermelho na interface do fuzzer consultando prontamente docs/afl-fuzz_approach.md#understanding-the-status-screen.

  5. Você encontrará crashes e hangs nos subdiretórios crashes/ e hangs/ 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.

  6. 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)

  7. 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?

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,
}

zread Ask DeepWiki

Licença

O AFL++ é licenciado sob a GNU AGPL-3.0-or-later. Em resumo, você pode usar o AFL++ de três formas:

  1. 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.

  2. Por arquivo, sob a licença em seu cabeçalho: o projeto contém arquivos sob SPDX-License-Identifier: AGPL-3.0-or-later e SPDX-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 combinado afl-fuzz inclui arquivos AGPL, portanto o programa como um todo é AGPL.

  3. 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.

Categorias