Definición
El fuzzing consiste en alimentar un programa, protocolo o API con grandes cantidades de datos generados o mutados automáticamente y observar si se cae, se cuelga o se comporta de forma extraña. Un fuzzer puede ser basado en mutación (modifica entradas válidas de ejemplo) o basado en generación (crea entradas a partir de una especificación o gramática del formato). Los fuzzers modernos suelen ser guiados por cobertura: instrumentan el binario para priorizar las entradas que recorren caminos de código nuevos. Según cuánto se conoce del objetivo se habla de fuzzing de caja negra, gris o blanca.
Ejemplo
Un desarrollador compila su parser de imágenes en C con instrumentación y lo prueba con AFL++ o libFuzzer; tras unas horas, el fuzzer encuentra un archivo malformado que provoca un desbordamiento de búfer detectado por AddressSanitizer. En web, herramientas como ffuf se usan, con autorización, para probar parámetros y rutas con listas de valores y detectar respuestas inesperadas.
Cómo protegerse
- Integrá el fuzzing en tu pipeline de CI para probar parsers y funciones que procesan datos externos de forma continua.
- Combiná el fuzzer con sanitizadores (AddressSanitizer, UndefinedBehaviorSanitizer) para detectar errores de memoria que no siempre producen un crash visible.
- Partí de un buen corpus de entradas válidas y diccionarios del formato para que el fuzzer llegue más profundo en el código.
- Minimizá y guardá los casos que provocan fallos como pruebas de regresión una vez corregido el bug.
- Fuzzeá solo sistemas propios o con autorización expresa: contra servicios de terceros puede causar caídas y tener consecuencias legales.
Para tener en cuenta
Que un fuzzer no encuentre fallos no prueba que el software sea seguro: solo explora las rutas que logra alcanzar. Además, no todo crash es explotable, por lo que cada hallazgo requiere análisis manual (triage).
Redactado con el asistente Underc0de IA. Actualizado el 13/11/2026. ¿Ves un error o querés sumar algo? Contanos en el foro.