El fuzzing es una técnica de pruebas automatizadas que alimenta un programa con grandes cantidades de entradas no válidas, inesperadas o aleatorias para encontrar fallos, errores de memoria y vulnerabilidades.
Cómo funciona el fuzzing
Un fuzzer genera entradas sin cesar, ejecuta el programa con ellas y vigila bloqueos, cuelgues o aserciones fallidas, guardando las entradas que reproducen el fallo. La idea se remonta a 1988, cuando los estudiantes de Barton Miller en la Universidad de Wisconsin hicieron fallar muchas utilidades de Unix con entradas aleatorias. Enfoques principales:
- Basado en mutaciones: modifica entradas de ejemplo invirtiendo bits, insertando bytes y combinándolas.
- Basado en generación: construye entradas a partir de una gramática o especificación de protocolo.
- Guiado por cobertura: instrumenta el programa y conserva las entradas que alcanzan nuevas rutas de código. American Fuzzy Lop (AFL, 2013) y libFuzzer de LLVM popularizaron este enfoque.
Los fuzzers suelen combinarse con sanitizadores como AddressSanitizer, que convierten la corrupción silenciosa de memoria en fallos inmediatos y notificables.
Por qué es importante
El fuzzing es una de las formas más eficaces de descubrir desbordamientos de búfer, errores use-after-free y fallos de análisis en código escrito en C y C++. El servicio OSS-Fuzz de Google, lanzado en 2016, somete continuamente a fuzzing a cientos de proyectos de código abierto y ha encontrado muchos miles de errores, buena parte de ellos vulnerabilidades de seguridad. Atacantes e intermediarios de exploits también lo emplean, y los investigadores lo usan en programas de bug bounty para encontrar fallos en navegadores, sistemas operativos y protocolos de red.
Cómo se usa en la práctica
- Integrar objetivos de fuzzing en CI/CD para probar cada cambio de forma continua.
- Priorizar el código que procesa entradas no fiables: formatos de archivo, protocolos de red y bibliotecas de imágenes y fuentes.
- Ejecutar los fuzzers con sanitizadores y mantener un corpus de buenas entradas semilla.
- Combinar el fuzzing con revisión de código, análisis estático y lenguajes con seguridad de memoria.





