Glosario

Qué es el fuzzing: enviar entradas inesperadas en masa para encontrar fallos en tu propio software

El fuzzing envía automáticamente entradas inesperadas al software para encontrar errores y vulnerabilidades. Cómo funciona y cómo empezar con tu propio código.

Publicado 2026-11-15 Actualizado 2026-11-15 6 min de lectura
En esta página

El fuzzing es una técnica de pruebas que envía automáticamente entradas inesperadas al software para encontrar fallos. Esta página explica cómo funciona y cómo empezar con tu propio código (no cubre las pruebas sobre sistemas de otras personas).

Qué es el fuzzing

OWASP describe el fuzzing como una técnica de pruebas de software orientada a identificar errores, vulnerabilidades o comportamientos inesperados. Suministra automáticamente entradas no válidas, inesperadas o parcialmente no válidas, y observa si el programa se comporta mal. El glosario del NIST (citando el NIST SP 800-95) describe igualmente el fuzz testing como herramientas llamadas fuzzers que envían combinaciones de entradas a un objetivo de prueba para revelar cómo responde.

Su fortaleza es que hace pocas suposiciones sobre cómo debería comportarse el sistema. Las pruebas escritas a mano cubren solo los casos que alguien ha previsto. Un fuzzer puede encontrar puntos que fallan con entradas que nadie imaginó.

Cómo funciona

1. Prepara algunas entradas iniciales (semillas)
2. El fuzzer las muta y pasa cada una a la función objetivo
↓ ejecútalo y observa qué código se ejecutó y cómo se comportó
3. Guarda cualquier entrada que provoque una caída; devuelve las entradas que alcanzaron nuevas rutas al paso 2
Generar, ejecutar, observar, repetir. Un fuzzer guiado por cobertura conserva las entradas que alcanzan nuevas rutas y construye a partir de ellas las siguientes.

La mayoría de los fuzzers modernos están guiados por cobertura. Miden qué código se ejecuta, conservan las entradas que alcanzan código nuevo y las mutan para crear las siguientes. Así llegan más profundo en el programa que con entradas aleatorias. libFuzzer, de LLVM, está documentado como un motor de fuzzing evolutivo, guiado por cobertura y en el mismo proceso, que se enlaza con la biblioteca bajo prueba.

Herramientas habituales

HerramientaObjetivos principalesNotas
libFuzzerC/C++ y otros (LLVM)Se enlaza con el objetivo. Según su documentación, los autores originales pasaron al motor Centipede y ahora solo recibe correcciones de errores importantes
AFL++C/C++ y otrosUn fuzzer guiado por cobertura muy usado
Fuzzing integrado de GoGo (1.18 o posterior)Se ejecuta con go test -fuzz. Las entradas que fallan se guardan en testdata y las pruebas normales las reproducen
OSS-FuzzSoftware de código abiertoServicio gratuito de fuzzing continuo de Google, que usa varios motores y sanitizers

Un fuzz target de libFuzzer es una función (LLVMFuzzerTestOneInput) que recibe los bytes de entrada y su longitud. En Go escribes una función de prueba llamada FuzzXxx que recibe un *testing.F y añades entradas semilla con f.Add.

Cómo empezar con tu propio software

  1. Elige una función que analice entradas (un analizador de formato de archivo, un cargador de configuración, un manejador de protocolo)
  2. Escribe un fuzz target pequeño que simplemente pase la entrada a esa función. Mantenlo rápido y determinista, sin estado que se arrastre entre llamadas
  3. Añade algunas entradas válidas típicas como semillas
  4. Activa un sanitizer como AddressSanitizer y ejecuta durante un tiempo establecido (en Go, -fuzztime define la duración)
  5. Convierte cada entrada que falle en una prueba reproducible y consérvala como prueba de regresión tras la corrección
  6. Para seguir, ejecuta sesiones cortas en CI o, en el caso de código abierto, considera unirte a OSS-Fuzz

El fuzzing de Go tiene un límite de 1 segundo por ejecución, y la guía por cobertura funciona en AMD64 y ARM64. Consulta la documentación oficial para conocer los límites de tu entorno.

Haz fuzzing solo del software que gestionas

El fuzzing envía continuamente grandes volúmenes de entradas malformadas. Hacerlo contra un servicio o servidor que no tienes permiso para probar puede considerarse acceso no autorizado o interrupción del servicio. Limítalo al software que desarrollas o gestionas, en tu propio entorno.

Qué puede y qué no puede hacer

OWASP señala que el fuzzing complementa, pero no sustituye, la revisión manual del código y la depuración. También indica que los fuzzers tienden a encontrar errores simples y que, con pruebas de caja negra, es más difícil valorar el impacto de un hallazgo.

Por tanto, el fuzzing es fuerte para "dejar que una máquina busque formas en que el código se rompe", y débil frente a problemas de diseño como la falta de autorización. Para estos, como IDOR, confía en pruebas que verifiquen las reglas previstas.

Nota de este sitio: encontrar la entrada es la mitad del trabajo; consérvala como prueba de regresión

Lo importante no es solo ejecutar un fuzzer, sino guardar lo que encuentra como prueba de regresión. El fuzzing integrado de Go, que almacena una entrada que falla en testdata y la reproduce en las pruebas normales, sigue esta idea. Evita que un error corregido vuelva a aparecer tras un cambio posterior. Si tienes código que analiza entradas, un primer paso realista es hacer fuzzing de una sola función.

Fuentes (primarias)

  • OWASP Community, "Fuzzing" — owasp.org (definición, características, límites)
  • Glosario NIST CSRC, "fuzz testing" — csrc.nist.gov (fuente: NIST SP 800-95)
  • LLVM, "libFuzzer" — llvm.org (cómo funciona, fuzz target, estado de mantenimiento)
  • Go, "Fuzzing" — go.dev (Go 1.18 o posterior, cómo ejecutarlo, límites)
  • Google, "OSS-Fuzz" — google.github.io (descripción general, motores compatibles). Las cifras de errores cambian con el tiempo, por lo que no se citan aquí. Para AFL++, consulta su documentación oficial para el uso actual

Lectura recomendada

FAQ

Q¿Qué es el fuzzing?
A

El fuzzing es una técnica de pruebas que envía automáticamente, en grandes cantidades, entradas no válidas o inesperadas a un programa y comprueba si se producen caídas o comportamientos anómalos. OWASP lo describe como una técnica de pruebas de software orientada a identificar errores, vulnerabilidades o comportamientos inesperados. También se le llama fuzz testing.

Q¿Qué tipo de problemas encuentra el fuzzing?
A

Normalmente, caídas, corrupción de memoria (como lecturas y escrituras fuera de límites), bucles infinitos y excepciones inesperadas. Funciona especialmente bien en código que analiza entradas, como analizadores de imágenes, documentos o protocolos. OWASP señala que los fuzzers tienden a encontrar errores simples y que es más difícil valorar el impacto de lo que encuentran.

Q¿Qué es el fuzzing guiado por cobertura?
A

El fuzzer mide qué código alcanza cada entrada (cobertura), conserva las entradas que llegan a código nuevo y las muta para generar las siguientes. Así llega más profundo en el programa que con entradas puramente aleatorias. La documentación de libFuzzer lo describe como un motor de fuzzing evolutivo, guiado por cobertura y en el mismo proceso.

Q¿Qué necesito para empezar con el fuzzing?
A

Un pequeño fragmento de código de prueba, llamado fuzz target, que pasa la entrada generada a la función que quieres probar. Para C/C++ puedes usar libFuzzer o AFL++; para Go 1.18 o posterior, las herramientas estándar (go test -fuzz). Es habitual combinarlo con sanitizers como AddressSanitizer para detectar de inmediato el mal uso de memoria.

Q¿Puedo hacer fuzzing a un servicio de otra persona?
A

No. Enviar grandes volúmenes de entradas malformadas a un sistema sin permiso puede considerarse acceso no autorizado o interrupción del servicio. Haz fuzzing solo del software que desarrollas o gestionas, en tu propio entorno. Para proyectos de código abierto, usa una vía establecida como OSS-Fuzz.

Q¿Qué es OSS-Fuzz?
A

Un servicio gratuito de fuzzing de Google para software de código abierto. Según su página oficial, se lanzó en 2016 como respuesta a la vulnerabilidad Heartbleed en OpenSSL, utiliza motores como libFuzzer, AFL++, Honggfuzz y Centipede, y avisa en privado a los desarrolladores de los errores que encuentra.