- Fuzzing-101 es un curso creado para que quienes están aprendiendo fuzzing por primera vez practiquen el proceso de encontrar vulnerabilidades en software real
- El curso está compuesto por 10 objetivos reales y 10 ejercicios, y cubre Xpdf, libexif, TCPdump, LibTIFF, Libxml2, GIMP, VLC media player, Adobe Reader, 7-Zip y Google Chrome/V8
- Cada ejercicio tiene como objetivo reproducir o descubrir un CVE, y utiliza herramientas como AFL++, ASan, LCOV, WinAFL y Fuzzilli junto con vulnerabilidades como CVE-2019-13288, CVE-2016-2334 y CVE-2019-5847
- El requisito para tomar el curso es un sistema Linux con conexión a internet; se recomienda manejo básico de Linux y todos los ejercicios fueron probados en Ubuntu 20.04.2 LTS
- El fuzzing es una técnica automatizada de pruebas que introduce entradas aleatorias o mutadas en un programa y monitorea excepciones o crashes; este curso toma como objeto de estudio el funcionamiento básico de los fuzzers evolutivos guiados por cobertura
Objetivo del curso y público objetivo
- Fuzzing-101 es un curso para personas que quieren aprender fuzzing como profesionales pero no saben por dónde empezar
- El curso está compuesto por 10 objetivos reales y 10 ejercicios
- El público objetivo es el siguiente
- Personas que quieren aprender los fundamentos del fuzzing
- Personas que quieren aprender cómo encontrar vulnerabilidades en proyectos de software reales
Estructura de los ejercicios
- Cada ejercicio presenta el software específico, el CVE a encontrar, el tiempo estimado y los temas principales
| Ejercicio | Objetivo | CVE a encontrar | Tiempo estimado | Temas principales |
|---|---|---|---|---|
| Exercise 1 | Xpdf | CVE-2019-13288 | 120 minutos | Afl-clang-fast, Afl-fuzz, GDB |
| Exercise 2 | libexif | CVE-2009-3895, CVE-2012-2836 | 6 horas | Afl-clang-lto, fuzzing de librerías, Eclipse IDE |
| Exercise 3 | TCPdump | CVE-2017-13028 | 4 horas | ASan, Sanitizers |
| Exercise 4 | LibTIFF | CVE-2016-9297 | 3 horas | cobertura de código, LCOV |
| Exercise 5 | Libxml2 | CVE-2017-9048 | 3 horas | diccionario, paralelización básica, fuzzing de argumentos de línea de comandos |
| Exercise 6 | GIMP | CVE-2016-4994, bug extra | 7 horas | fuzzing persistente, fuzzing de aplicaciones interactivas |
| Exercise 7 | VLC media player | CVE-2019-14776 | 6 horas | instrumentación parcial, harness de fuzzing |
| Exercise 8 | Adobe Reader | ninguno | 8 horas | fuzzing de aplicaciones de código cerrado, instrumentación con QEMU |
| Exercise 9 | 7-Zip | CVE-2016-2334 | 8 horas | WinAFL, fuzzing de aplicaciones Windows |
| Exercise 10 | Google Chrome / V8 | CVE-2019-5847 | 8 horas | Fuzzilli, fuzzing de motores JavaScript |
Entorno de ejecución y herramientas
- Lo necesario es un sistema Linux con conexión a internet
- Se proporciona una imagen de VMware que puede usarse en los ejercicios
- Se recomienda enfáticamente tener conocimientos básicos de uso de Linux
- Todos los ejercicios fueron probados en Ubuntu 20.04.2 LTS
- El curso usa AFL++
- AFL++ se presenta como un fork más nuevo y superior de AFL de Michał “lcamtuf” Zalewski
Conceptos básicos de fuzzing
- La prueba de fuzz (fuzz testing) o fuzzing es una técnica automatizada de pruebas de software que introduce entradas aleatorias o mutadas en un programa y monitorea excepciones o crashes
- Se presentan como ejemplos de fuzzers exitosos en aplicaciones reales AFL, libFuzzer y HonggFuzz
- Estas tres herramientas son ejemplos de fuzzers evolutivos guiados por cobertura
Fuzzers evolutivos guiados por cobertura
- El enfoque evolutivo (evolutionary) es un método metaheurístico inspirado en algoritmos evolutivos
- Un conjunto inicial de entradas, llamadas seeds, evoluciona y se muta con el tiempo
- Como ejemplo de criterio de selección se usa la cobertura
- Un fuzzer guiado por cobertura (coverage-guided) recopila y compara datos de cobertura de código por entrada para aumentar la probabilidad de encontrar nuevos crashes
- La recopilación de cobertura normalmente se realiza mediante instrumentación
- Se seleccionan las entradas que llevan a nuevas rutas de ejecución
Historial de cambios
- 2022-02-14: se corrigieron algunos errores tipográficos de
wgeten Exercise 5 - 2021-11-25: Exercise 3 se actualizó con algunas correcciones
1 comentarios
Opiniones de Hacker News
Anécdota relacionada con fuzzing: https://threadreaderapp.com/thread/1799457232607985698
Excelente lectura si quieres perder unos 11 minutos
No termino de entender la cultura de competir para encontrar bugs en productos de otras empresas y luego presumir que encontraron uno precisamente en Microsoft Publisher, menospreciando a Microsoft
Quizá todos tengamos suerte si contamos con una empresa cuyo “proceso estándar” es pasar toda la semana en vela probando nuestro producto
Al revisar al autor, podría ser alguien que conocía de IRC, y “Mantis” e “infosec” encajan perfecto
Lo interesante es que esto contrasta claramente con el enfoque de Go
En Go se puede ejecutar fuzzing con la misma facilidad que correr tests, por lo que es muy sencillo apuntar a partes específicas de una aplicación o biblioteca
Por eso, muchas de estas técnicas se vuelven innecesarias
Me da curiosidad qué técnicas hay para guiar mejor el fuzzing, pero por ahora parece que lo mejor es proporcionar un corpus de semillas y esperar que todo salga bien
Me sorprende que Heartbleed no esté en la lista. Es muy fácil de reproducir