Fuzzing-101
Estructura
- Práctica 1: Xpdf, CVE-2019-13288, 120 minutos, Afl-clang-fast, Afl-fuzz, GDB
- Práctica 2: libexif, CVE-2009-3895, CVE-2012-2836, 6 horas, Afl-clang-lto, biblioteca de fuzzing, Eclipse IDE
- Práctica 3: TCPdump, CVE-2017-13028, 4 horas, ASan, Sanitizers
- Práctica 4: LibTIFF, CVE-2016-9297, 3 horas, cobertura de código, LCOV
- Práctica 5: Libxml2, CVE-2017-9048, 3 horas, diccionario, paralelización básica, fuzzing de argumentos de línea de comandos
- Práctica 6: GIMP, CVE-2016-4994, bug extra, 7 horas, fuzzing persistente, fuzzing de aplicaciones interactivas
- Práctica 7: VLC media player, CVE-2019-14776, 6 horas, instrumentación parcial, harness de fuzzing
- Práctica 8: Adobe Reader, 8 horas, fuzzing de aplicaciones de código cerrado, instrumentación con QEMU
- Práctica 9: 7-Zip, CVE-2016-2334, 8 horas, WinAFL, fuzzing de aplicaciones de Windows
- Práctica 10 (desafío final): Google Chrome / V8, CVE-2019-5847, 8 horas, Fuzzilli, fuzzing de motores de JavaScript
Registro de cambios
- 14 de febrero de 2022: corrección de un error tipográfico de 'wget' en la práctica 5
- 25 de noviembre de 2021: actualización y correcciones de la práctica 3
¿Para quién es este curso?
- Personas que quieran aprender los fundamentos del fuzzing
- Personas que quieran encontrar vulnerabilidades en proyectos de software reales
Requisitos
- Se requiere un sistema Linux y conexión a internet
- Se recomiendan conocimientos básicos de Linux
- Todas las prácticas fueron probadas en Ubuntu 20.04.2 LTS
- Este curso usa AFL++, un nuevo fork de AFL de Michał "lcamtuf" Zalewski
¿Qué es el fuzzing?
- Prueba de fuzz (o fuzzing): técnica automatizada de pruebas de software que proporciona entradas aleatorias/modificadas a un programa y monitorea excepciones/fallos
- AFL, libFuzzer y HonggFuzz son ejemplos de fuzzers exitosos en aplicaciones reales
- Fuzzer evolutivo basado en cobertura: selecciona entradas que encuentran nuevas rutas de ejecución recolectando y comparando datos de cobertura de código
Fuzzer evolutivo basado en cobertura
- Evolutivo: enfoque metaheurístico inspirado en algoritmos evolutivos que encuentra nuevos fallos mediante la evolución y mutación de un subconjunto inicial (seeds)
- Basado en cobertura: selecciona entradas que encuentran nuevas rutas de ejecución recolectando y comparando datos de cobertura de código
Agradecimientos
- Personas que ayudaron: Xavier RENE-CORAIL, Alan Vivona, Jason White, Octavio Gianatiempo, van Hauser, Marc Poulhiès, Xu Hanyu, tclan126, epi052, Jeremias Gomes
Contacto
- Si necesitas ayuda o tienes sugerencias, únete al canal
#fuzzing en el Slack de GitHub Security Lab
Resumen de GN⁺
- Este curso es útil para aprender los conceptos básicos del fuzzing y encontrar vulnerabilidades en software real
- Se pueden aprender técnicas de fuzzing usando herramientas como AFL++ a través de varios casos reales
- El fuzzing cumple un papel importante en reforzar la estabilidad y la seguridad del software, y este curso ofrece un enfoque práctico para ello
- Herramientas con funciones similares incluyen libFuzzer y HonggFuzz
1 comentarios
Opiniones de Hacker News
El artículo enlazado toma unos 11 minutos de lectura, y resulta interesante la diferencia con el enfoque de golang
Hay curiosidad sobre las técnicas para guiar el fuzzing de manera más efectiva
Sorprende que Heartbleed no esté en la lista
Opinión de agradecimiento por compartirlo