Volver a actualizaciones
Nuevo releaseSep 4, 2026

AFLplusplus v5.03c

El fuzzer afl++ es afl con parches de la comunidad, actualización a qemu 5.1, cobertura libre de colisiones, laf-intel y redqueen mejorados, planificaciones de potencia de AFLfast++, mutadores MOpt, unicorn_mode, ¡y mucho más!

Compartir

American Fuzzy Lop plus plus (AFL++)

AFL++ logo

Versión de lanzamiento: 5.03c

Versión de GitHub: 5.03c

Repositorio: https://github.com/AFLplusplus/AFLplusplus

AFL++ es mantenido por:

Desarrollado originalmente por Michal "lcamtuf" Zalewski.

AFL++ es un fork superior al AFL de Google: más velocidad, más y mejores mutaciones, más y mejor instrumentación, soporte de módulos personalizados, etc.

AFL++ está licenciado bajo la AGPL-3.0-or-later, y también contiene archivos bajo la Licencia Apache-2.0. Todo lo compilado en un harness de fuzzing está y seguirá estando licenciado bajo Apache 2.0. Cada archivo declara su propia licencia en su cabecera SPDX-License-Identifier — esa es la licencia que debes seguir para ese archivo. Una licencia comercial opcional está disponible para organizaciones que no pueden usar la AGPL (se obtiene donando a una buena causa — el proyecto y sus mantenedores no reciben dinero). Consulta LICENSING.md para una descripción general en lenguaje sencillo y la sección de Licencia a continuación para más detalles.

Primeros pasos

Aquí tienes información para comenzar:

  • Para una descripción general de la documentación de AFL++ y una guía gráfica muy útil, visita docs/README.md.
  • Para comenzar con tutoriales, ve a docs/tutorials.md.
  • Para lanzamientos, consulta la pestaña de Lanzamientos y ramas. Las mejores ramas para usar son, sin embargo, stable o dev, dependiendo de tu tolerancia al riesgo. También echa un vistazo a la lista de cambios importantes en AFL++ y a la lista de características.
  • Si quieres usar AFL++ para tu trabajo académico, consulta la página de artículos en el sitio web.
  • Para citar nuestro trabajo, mira la sección Citar.
  • Para comparaciones, usa la configuración aflplusplus de fuzzbench, o usa afl-clang-fast con AFL_LLVM_CMPLOG=1. Puedes encontrar la configuración predeterminada de aflplusplus en el fuzzbench de Google.

Compilar e instalar AFL++

Para tener AFL++ fácilmente disponible con todo compilado, extrae la imagen directamente de Docker Hub (disponible tanto para x86_64 como para arm64):

docker pull aflplusplus/aflplusplus
docker run -ti -v /location/of/your/target:/src aflplusplus/aflplusplus

Esta imagen se publica automáticamente cuando se realiza un push a la rama stable (consulta ramas). Si usas el comando anterior, encontrarás el código fuente de tu objetivo en /src dentro del contenedor.

Nota: también puedes extraer aflplusplus/aflplusplus:dev, que es el estado de desarrollo más actual de AFL++.

Para compilar AFL++ tú mismo — lo cual recomendamos — continúa en docs/INSTALL.md.

Inicio rápido: Fuzzing con AFL++

NOTA: Antes de comenzar, lee sobre los riesgos de sentido común del fuzzing.

Este es un inicio rápido para hacer fuzzing a objetivos con el código fuente disponible. Para leer sobre el proceso en detalle, consulta docs/fuzzing_in_depth.md.

Para aprender sobre fuzzing de otros tipos de objetivos, consulta:

Inicio rápido paso a paso:

  1. Compila el programa o biblioteca a fuzzear usando afl-cc. Una forma común de hacerlo sería:

    CC=/path/to/afl-cc CXX=/path/to/afl-c++ ./configure --disable-shared
    make clean all
    
  2. Obtén un archivo de entrada pequeño pero válido que tenga sentido para el programa. Cuando hagas fuzzing a sintaxis verbosa (SQL, HTTP, etc.), crea también un diccionario como se describe en dictionaries/README.md.

  3. Si el programa lee desde stdin, ejecuta afl-fuzz de la siguiente manera:

    ./afl-fuzz -i seeds_dir -o output_dir -- \
    /path/to/tested/program [...program's cmdline...]
    

    Para añadir un diccionario, agrega -x /path/to/dictionary.txt a afl-fuzz.

    Si el programa recibe la entrada desde un archivo, puedes poner @@ en la línea de comandos del programa; AFL++ colocará un nombre de archivo autogenerado ahí por ti.

  4. Investiga cualquier cosa que se muestre en rojo en la interfaz del fuzzer consultando rápidamente docs/afl-fuzz_approach.md#understanding-the-status-screen.

  5. Encontrarás los crashes y hangs descubiertos en los subdirectorios crashes/ y hangs/ dentro del directorio -o output_dir. Puedes reproducir los crashes alimentándolos al objetivo, por ejemplo, si tu objetivo usa stdin:

    cat output_dir/crashes/id:000000,* | /path/to/tested/program [...program's cmdline...]
    

    Puedes generar core dumps o usar gdb directamente para dar seguimiento a los crashes.

  6. Para el análisis de cobertura de tu fuzzing, recomendamos nuestras herramientas asociadas cov-analysis (informes de cobertura basados en código fuente a partir de un corpus de fuzzing) y fuzz-reachability (análisis estático de qué funciones puede alcanzar un harness, para distinguir brechas de cobertura accionables del código muerto y generar listas de permitidos de instrumentación).

  7. No podemos enfatizarlo lo suficiente: si quieres hacer fuzzing de manera efectiva, lee el documento docs/fuzzing_in_depth.md.

Contacto

¿Preguntas? ¿Inquietudes? ¿Informes de errores?

Ramas

Existen las siguientes ramas:

  • release: el último lanzamiento
  • stable: estado estable de AFL++ — se sincroniza desde dev de vez en cuando cuando estamos satisfechos con su estabilidad. Esta es la rama predeterminada.
  • dev: estado de desarrollo de AFL++ — está a la vanguardia y podrías obtener una copia que no compile o que tenga un error. ¡Solo aceptamos PRs (pull requests) para la rama 'dev'!
  • (cualquier otra): ramas experimentales para trabajar en características específicas o probar nueva funcionalidad o cambios.

Se busca ayuda

Consulta nuestra lista de issues con la etiqueta "help wanted". Esta puede ser tu forma de apoyar y contribuir a AFL++ — extiéndelo para hacer algo interesante. Si tienes otras ideas — ¡simplemente crea un issue y propónlo!

Para todos los que quieran contribuir (y enviar pull requests), por favor lean nuestras directrices de contribución antes de enviar.

Agradecimientos especiales

Muchas de las mejoras al AFL original y a AFL++ no serían posibles sin los comentarios, informes de errores o parches de nuestros colaboradores.

¡Gracias! (Para las personas que envían pull requests — por favor añádanse a esta lista :-)

Lista de colaboradores
  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

Si usas AFL++ en trabajo científico, considera citar nuestro artículo presentado en 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

Licencia

AFL++ está licenciado bajo la GNU AGPL-3.0-or-later. En resumen, puedes usar AFL++ de tres maneras:

  1. Gratis, bajo la AGPL-3.0-or-later: la opción predeterminada. Usa, modifica y comparte AFL++; si ejecutas una versión modificada como servicio de red, la AGPL requiere que ofrezcas a tus usuarios el código fuente correspondiente. Texto completo: LICENSE.

  2. Por archivo, bajo la licencia en su cabecera: el proyecto contiene archivos bajo SPDX-License-Identifier: AGPL-3.0-or-later y SPDX-License-Identifier: Apache-2.0. Siempre revisa la cabecera del archivo que uses y cumple con la licencia indicada allí; los archivos marcados como Apache-2.0 pueden reutilizarse individualmente bajo la Licencia Apache-2.0. (Algunos archivos de terceros incluidos llevan otras licencias, por ejemplo, el plugin de GCC bajo GPL-3.0-or-later y los passes de LLVM SanitizerCoverage bajo Apache-2.0-WITH-LLVM-exception — cada uno marcado con su propio identificador SPDX.) Ten en cuenta que el binario combinado afl-fuzz incluye archivos AGPL, por lo que el programa en su conjunto es AGPL.

  3. Licencia comercial: opcional, para organizaciones que no pueden o no quieren cumplir con la AGPL. El proyecto no recibe dinero. En su lugar, donas EUR 20.000 (€20.000) a la EFF o al CCC y envías por correo la prueba a [email protected]; tu licencia entra en vigor desde la fecha de la donación por un año (renovable donando nuevamente). Términos completos: LICENSE.COMMERCIAL.

Los componentes de terceros incluidos (por ejemplo, xxHash, t1ha, libFuzzer, submódulos) conservan sus propias licencias. Para la descripción general completa en lenguaje sencillo, consulta LICENSING.md.

Categorías