
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!
American Fuzzy Lop plus plus (AFL++)
Versión de lanzamiento: 5.03c
Versión de GitHub: 5.03c
Repositorio: https://github.com/AFLplusplus/AFLplusplus
AFL++ es mantenido por:
- Marc "van Hauser" Heuse [email protected]
- Dominik Maier [email protected]
- Andrea Fioraldi [email protected]
- Heiko "hexcoder-" Eissfeldt [email protected]
- frida_mode es mantenido por @Worksbutnottested
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,
stableodev, 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
aflplusplusde fuzzbench, o usaafl-clang-fastconAFL_LLVM_CMPLOG=1. Puedes encontrar la configuración predeterminada deaflplusplusen 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:
- Objetivos solo binarios: docs/fuzzing_binary-only_targets.md
- Servicios de red: docs/best_practices.md#fuzzing-a-network-service
- Programas GUI: docs/best_practices.md#fuzzing-a-gui-program
Inicio rápido paso a paso:
-
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 -
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.
-
Si el programa lee desde stdin, ejecuta
afl-fuzzde 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.txta 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. -
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.
-
Encontrarás los crashes y hangs descubiertos en los subdirectorios
crashes/yhangs/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.
-
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).
-
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?
- Se puede contactar a los colaboradores mediante (por ejemplo, creando un issue — ¡pero solo para defectos de AFL++!): https://github.com/AFLplusplus/AFLplusplus.
- Echa un vistazo a nuestras FAQ y Mejores Prácticas.
- Lo mejor: únete al servidor Zulip de Fuzzing!
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,
}
Licencia
AFL++ está licenciado bajo la GNU AGPL-3.0-or-later. En resumen, puedes usar AFL++ de tres maneras:
-
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.
-
Por archivo, bajo la licencia en su cabecera: el proyecto contiene archivos bajo
SPDX-License-Identifier: AGPL-3.0-or-laterySPDX-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 combinadoafl-fuzzincluye archivos AGPL, por lo que el programa en su conjunto es AGPL. -
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.