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