
AFLplusplus v5.03c
AFL++ es un fuzzer de vanguardia, y #1 en benchmarks. Originalmente estaba basado en AFL. Hoy viene con qemu 5.1, cobertura libre de colisiones, laf-intel & redqueen mejorados, planificadores de energía 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.04a
Repositorio: https://github.com/AFLplusplus/AFLplusplus
AFL++ está mantenido por:
- Marc "van Hauser" Heuse [email protected]
- Dominik Maier [email protected]
- Andrea Fioraldi [email protected]
- Heiko "hexcoder-" Eissfeldt [email protected]
- frida_mode está mantenido por @Worksbutnottested
Desarrollado originalmente por Michal "lcamtuf" Zalewski.
AFL++ es un fork superior del 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 arnés 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.
Hay disponible una licencia comercial opcional para organizaciones que
no puedan usar la AGPL (obtenida mediante una donación 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 algo de información para empezar:
- Para una descripción general de la documentación de AFL++ y una guía gráfica muy útil, visita docs/README.md.
- Para empezar con los tutoriales, ve a docs/tutorials.md.
- Para las versiones, consulta la
pestaña Releases y
branches. Sin embargo, las mejores ramas para usar son
stableodev— dependiendo de tu tolerancia al riesgo. Echa también 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, consulta 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, descarga la imagen directamente desde 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 produce un push a la rama estable
(consulta branches). Si utilizas el comando anterior, encontrarás tu
código fuente objetivo en /src dentro del contenedor.
Nota: también puedes descargar 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 empezar, lee sobre los riesgos de sentido común del fuzzing.
Este es un inicio rápido para hacer fuzzing de objetivos con el código fuente disponible. Para leer sobre el proceso en detalle, consulta docs/fuzzing_in_depth.md.
Para aprender sobre el fuzzing de otros objetivos, consulta:
- Objetivos solo binarios: docs/fuzzing_binary-only_targets.md
- Servicios de red: docs/best_practices.md#fuzzing-a-network-service
- Programas con GUI: docs/best_practices.md#fuzzing-a-gui-program
Inicio rápido paso a paso:
-
Compila el programa o biblioteca al que se le hará fuzzing 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. Al hacer fuzzing de 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-fuzzasí:./afl-fuzz -i seeds_dir -o output_dir -- \ /path/to/tested/program [...program's cmdline...]Para añadir un diccionario, añade
-x /path/to/dictionary.txta afl-fuzz.Si el programa toma la entrada de un archivo, puedes poner
@@en la línea de comandos del programa; AFL++ colocará allí un nombre de archivo generado automáticamente. -
Investiga cualquier cosa mostrada en rojo en la interfaz del fuzzer consultando docs/afl-fuzz_approach.md#understanding-the-status-screen.
-
Encontrarás los crashes y hangs hallados en los subdirectorios
crashes/yhangs/dentro del directorio-o output_dir. Puedes reproducir los crashes pasá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 cores 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 el 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 las brechas de cobertura accionables del código muerto y generar listas de permitidos de instrumentación)
-
No podemos insistir lo suficiente en esto: si quieres hacer fuzzing de forma efectiva, ¡lee el documento docs/fuzzing_in_depth.md!
Contacto
¿Preguntas? ¿Inquietudes? ¿Informes de errores?
- Se puede contactar con los colaboradores a través de (por ejemplo, creando un issue, ¡pero solo para defectos de AFL++!): https://github.com/AFLplusplus/AFLplusplus.
- Echa un vistazo a nuestras FAQ y Buenas prácticas.
- Lo mejor: ¡únete al servidor Zulip de Fuzzing!
Ramas
Existen las siguientes ramas: