Skip to main content

Por qué las herramientas de fuzzing deberían formar parte de tu kit de seguridad

Escrito por

Kuria Macharia

28 de octubre de 2022

0 minutos de lectura

El fuzzing es una técnica de pruebas de seguridad de software que proporciona automáticamente entradas no válidas y aleatorias a una aplicación para detectar errores. El objetivo del fuzzing es someter la aplicación a pruebas de estrés para provocar comportamientos inesperados, fallas o fugas de recursos. Como desarrolladores, nos permite entender de forma más completa el comportamiento y las vulnerabilidades de las aplicaciones. Para realizar este tipo de pruebas, usamos herramientas de fuzzing, conocidas como fuzzers. Un fuzzer es una aplicación que genera entradas aleatorias dirigidas al software objetivo.

El término fuzzing fue acuñado en la década de 1980 por el profesor Barton Miller mientras investigaba qué hacía que su sistema UNIX fallara. Les pidió a sus estudiantes que bombardearan su sistema Unix con datos generados automáticamente para entender mejor qué causaba la falla.

Cómo mejorar la seguridad con herramientas de fuzzing

Para entender cómo las herramientas de fuzzing mejoran la seguridad, exploremos sus beneficios, analicemos algunos casos de uso y revisemos un ejemplo de cómo funcionaría en una prueba del mundo real.

Beneficios del fuzzing

El fuzzing nos ofrece una amplia variedad de beneficios, entre ellos:

  • Probar la seguridad de nuestra aplicación con fuzzing desde las primeras etapas ayuda a prevenir exploits de día cero, en los que los hackers aprovechan vulnerabilidades no identificadas. El enfoque multidimensional del fuzzing ayuda a detectar errores que los hackers pueden explotar y que, de otro modo, no detectaríamos fácilmente. Entre ellos se incluyen la falta de cifrado de datos, los algoritmos defectuosos y la falta de validación de entradas.

  • Tiene un costo bajo en tiempo y dinero, ya que no requiere intervención humana una vez que está en funcionamiento.

  • Un fuzzer puede ayudar a identificar casos límite que las pruebas manuales no podrían detectar.

  • Además de identificar el problema, también proporciona un informe detallado sobre cómo un hacker podría explotar una vulnerabilidad.

Casos de uso del fuzzing

Puedes realizar pruebas de fuzzing en componentes individuales de una aplicación. A continuación, se describen algunos casos de uso.

Fuzzing de aplicaciones web

El fuzzing de aplicaciones web detecta errores que podrían hacer que nuestras aplicaciones web fueran vulnerables a ataques comunes, como la inyección SQL (https://learn.snyk.io/lessons/sql-injection/javascript/) y la falsificación de solicitudes entre sitios (CSRF) (https://learn.snyk.io/lessons/csrf-attack/javascript/). Al hacer fuzzing en nuestras aplicaciones web, la prueba envía datos aleatorios a los endpoints y revela errores en la aplicación. Corregir los errores detectados mejora la postura de seguridad de una aplicación. Por ejemplo, el fuzzing puede ayudarte a identificar en qué páginas debes agregar validación de entradas en el front-end para reforzar la seguridad del lado del servidor.

Fuzzing de API

El fuzzing de API detecta vulnerabilidades relacionadas con el acceso a bases de datos. Algunas de estas vulnerabilidades incluyen la exposición de contraseñas y la falta de validación de parámetros. El fuzzing de API nos permite controlar mejor la forma en que la API interactúa con los servidores de backend. Por ejemplo, podemos usarlo para probar si una API de pagos valida correctamente los números de tarjetas de crédito y las firmas de autorización.

Fuzzing de URL

Podemos usar el fuzzing de URL para descubrir archivos y directorios ocultos en un servidor web. Permite detectar archivos y directorios que deberían estar ocultos, pero son de acceso público. Esto ayuda a proteger los archivos y directorios del servidor web contra el acceso no autorizado. El fuzzing de URL puede ayudar a evitar la exposición de información confidencial, como las credenciales de bases de datos y los formatos de consulta, que un hacker podría usar para crear solicitudes falsificadas en un ataque CSRF.

Fuzzing de protocolos

El fuzzing de protocolos consiste en enviar paquetes falsificados a una aplicación para encontrar errores en su implementación. Por ejemplo, si un fuzzer conoce la longitud de un mensaje, puede aumentarla para ver cómo maneja la aplicación una solicitud de ese tipo.

Fuzzing de formatos de archivo

El fuzzing de formatos de archivo es un proceso sencillo y directo. Consiste en modificar una muestra de archivo legítima y abrir las versiones modificadas en la aplicación objetivo para provocar una falla. Este tipo de fuzzing detecta errores que pueden hacer que un sistema falle y señala áreas en las que podemos agregar más controles sobre los tipos de archivos que puede abrir una aplicación, lo que mejora su seguridad y estabilidad. Puede usarse para evitar fallas en aplicaciones que requieren cargar y abrir documentos escaneados en formatos específicos, como JPEG, PNG y PDF.

Limitaciones de las herramientas de pruebas de fuzzing

Aunque las herramientas de pruebas de fuzzing son relativamente eficaces, tienen algunas limitaciones:

  • Usar únicamente herramientas de pruebas de fuzzing no garantiza una seguridad integral para una aplicación.

  • No son muy eficaces para detectar amenazas que no provoquen fallas en la aplicación.

  • Les toma bastante tiempo completar una prueba.

  • No pueden identificar fallas y amenazas complejas.

Fuzzing frente a los escáneres de vulnerabilidades de Snyk

El fuzzing es esencial para mejorar la postura de seguridad de una aplicación, pero no es totalmente eficaz por sí solo. Esto se debe a que solo puede encontrar errores asociados con los endpoints de las aplicaciones.

Para probar una aplicación con fuzzing, debemos configurar el fuzzer y darle tiempo suficiente para completar el proceso. Esto ralentiza el desarrollo y aumenta el tiempo de lanzamiento de nuevas aplicaciones al mercado.

Sin embargo, eso no basta en el mundo actual de desarrollo y entrega continuos (CI/CD). Debes monitorear tu aplicación en busca de vulnerabilidades desde la etapa de escritura del código. Snyk analiza continuamente en busca de vulnerabilidades en tu código, los pull request de Git y los contenedores. También puedes agregarlo a un pipeline de CI/CD para garantizar el análisis continuo de vulnerabilidades durante todo el ciclo de vida de una aplicación.

Otra característica de los escáneres de vulnerabilidades de Snyk son sus recomendaciones prácticas para corregirlas. Esto te permite corregir algunas de las implementaciones señaladas con solo unos clics.

Un ejemplo de fuzzing

Para entender cómo, cuándo y por qué usaríamos el fuzzing, veamos el siguiente ejemplo.

Supongamos que acabamos de lanzar un servicio de entrega de comida en línea disponible en HealthyTastyMeals.com. Durante el desarrollo, probamos cada función varias veces y les pedimos a amigos y colegas que usaran la aplicación para evaluar su facilidad de uso.

Sin embargo, todas las pruebas que realizamos se enfocan en enviar solicitudes e ingresar valores que siguen el formato esperado. Entonces, ¿cómo nos preparamos para lo inesperado?

Si queremos entender cómo se comportará nuestro sitio web ante una avalancha de entradas inesperadas, debemos probarlo con fuzzing. Como nuestro sitio web usa API REST, podemos usar la herramienta de fuzzing RESTler. Es una herramienta de código abierto para hacer fuzzing en API REST.

Ejecutaremos RESTler en modo “Fuzz” porque tenemos pocos endpoints y es fácil de ejecutar. La prueba se ejecutará en cada endpoint de nuestra aplicación web para encontrar errores. Enviará a estos endpoints distintas combinaciones de parámetros y secuencias de solicitudes.

Cada vez que encuentre un error, RESTler imprimirá en la consola un resumen del tipo de error detectado.

Algunas de las vulnerabilidades que nuestra prueba podría revelar son las siguientes.

Combinaciones de parámetros inseguras

Las API REST incluyen distintos parámetros, como URI de solicitud, métodos de solicitud y parámetros de consulta. Estos parámetros pueden combinarse de distintas formas que deben probarse para evitar estados erróneos del programa. El fuzzing puede ayudarnos a identificar combinaciones de parámetros inseguras, que podemos corregir agregando validación para todos los parámetros de consulta y limitando los parámetros requeridos a los estrictamente necesarios.

Parámetros de consulta sin mecanismo de validación

Agregar una validación sólida de entradas en el cliente y el servidor mejora la postura de seguridad de una aplicación. Una herramienta de fuzzing como RESTler nos permitiría identificar este problema en nuestra aplicación. Podemos resolver este problema de seguridad agregando una validación sólida de entradas en el cliente y el servidor. La validación del lado del cliente evitará que el servidor se sobrecargue con datos no válidos. La validación del lado del servidor garantiza que solo procese solicitudes válidas. Corregir este problema ayuda a mitigar el riesgo de un ataque de denegación de servicio (DoS).

Contraseñas sin protección

RESTler también señala los parámetros de contraseña que no tienen hashing. Podemos resolverlo usando un algoritmo de hashing. Entre los algoritmos disponibles se encuentran bcrypt y PBKDF2. Corregir esta vulnerabilidad dificulta que los hackers tomen el control de un sistema. Esto se debe a que, aunque obtengan acceso al sistema, no podrán acceder a las contraseñas.

Nuestras 5 mejores herramientas de fuzzing

Hay muchas herramientas de fuzzing de código abierto disponibles en el mercado. A continuación, presentamos cinco herramientas gratuitas y eficaces que podemos usar fácilmente para mejorar la seguridad de nuestras aplicaciones.

1. OSS-Fuzz

OSS-Fuzz es una herramienta de fuzzing de código abierto desarrollada por Google. Combina técnicas modernas de fuzzing con ejecución distribuida y escalable. Google la creó para que el software de código abierto fuera seguro y estable. OSS-Fuzz funciona haciendo fuzzing continuo en el programa objetivo.

2. ClusterFuzz

ClusterFuzz es una infraestructura de código abierto y escalable que detecta vulnerabilidades de seguridad y problemas de estabilidad. Google la usa para buscar errores en su navegador Chrome. A diferencia de OSS-Fuzz, ClusterFuzz puede funcionar con cualquier aplicación, no solo con las de código abierto. Es altamente escalable y puede ejecutarse en un clúster de cualquier tamaño.

3. go-fuzz

go-fuzz es un fuzzer de código abierto para probar paquetes de Golang. Se enfoca en paquetes con entradas complejas, que son un objetivo atractivo para atacantes maliciosos. Es una herramienta esencial para quienes quieren reforzar la seguridad del análisis de entradas en programas Go. A diferencia de los dos fuzzers anteriores, go-fuzz solo funciona con paquetes de Go.

4. Peach Fuzzer

Peach Fuzzer es una herramienta desarrollada por PeachTech, que GitLab adquirió posteriormente. Es muy configurable y eficiente para quienes quieren crear pruebas personalizadas. A diferencia de go-fuzz, podemos configurar esta solución para que funcione con cualquier lenguaje. Sin embargo, PeachTech ya no ofrece soporte ni actualizaciones para esta herramienta.

5. ffuf

ffuf es un fuzzer web gratuito y rápido, escrito en Go. Es una solución potente que puede probar rigurosamente una aplicación con solicitudes POST y GET desconocidas. Como desarrolladores, interactuamos con esta herramienta mediante la línea de comandos, ya que no tiene interfaz.

Tu kit de seguridad

El fuzzing es una técnica de pruebas de software que consiste en proporcionar entradas aleatorias no válidas a una aplicación para detectar errores. Ante entradas inesperadas, nos ayuda a entender el comportamiento de una aplicación o API. Tenemos a nuestra disposición muchas herramientas de fuzzing de código abierto diseñadas para escenarios de prueba específicos. Los fuzzers tienen un costo bajo en tiempo y dinero; no solo identifican problemas, sino que también proporcionan un informe detallado sobre cómo un hacker puede explotar una vulnerabilidad.

Una prueba de fuzzing bien ejecutada puede ayudar a mejorar la postura de seguridad de una aplicación al revelar vulnerabilidades que no podemos detectar fácilmente. El fuzzing puede ayudar a encontrar errores, como la falta de cifrado de datos, algoritmos defectuosos y falta de validación de entradas. También puede identificar problemas que las pruebas manuales no detectarían.

Las capacidades de un fuzzer nos ayudan a prevenir exploits de día cero, en los que los hackers aprovechan vulnerabilidades no identificadas. Los resultados del fuzzing ayudan a mitigar ataques de seguridad como CSRF, ataques de inyección y denegación de servicio (DOS), entre otros.

Comienza con Capture the Flag

Aprende a resolver desafíos de Capture the Flag con nuestro taller virtual 101 a pedido.

Leer más

Blog

Los modelos de frontera encontraron las vulnerabilidades. Solo el atacante encontró las cadenas.

El análisis estático encontró las fallas, pero solo las pruebas de ataque en vivo demostraron cómo podían encadenarse para provocar brechas. Una comparación de Evo COS, Claude Security y Claude Code Security.

feature insights context
Blog

Los ataques autónomos ya están aquí. La defensa debe estar a su altura.

Los atacantes autónomos están reduciendo el tiempo disponible para defenderse. Descubre cómo el descubrimiento, la corrección, la validación y la prevención continuos pueden ayudar a los equipos de seguridad a seguirles el ritmo.

Blog

Por qué los agentes de programación con IA siguen generando fallas de control de acceso

Los agentes de programación con IA pueden generar lógica de autorización que compila y supera la revisión, pero expone los datos de un inquilino a otro. Descubre por qué es difícil detectar el control de acceso roto y cómo prevenirlo.