Llegamos a ustedes gracias a:



Reportajes y análisis

Las 10 mejores herramientas de fuzzing

Cómo encontrar los errores más extraños en las aplicaciones

[28/04/2022] Al crear una aplicación, los programadores dedican mucho tiempo a anticipar lo que necesitará un usuario y cómo debería reaccionar su aplicación. Los mejores programadores conservan el control mediante el uso de un código estricto y la planificación de cualquier contingencia, pero nadie puede anticipar todas las acciones posibles que un usuario podría realizar. Es ahí donde las herramientas de fuzzing pueden ser muy útiles.

[Reciba lo último de CIO Perú suscribiéndose a nuestro newsletter semanal]

¿Qué es el fuzz testing?

El fuzz testing es un proceso automatizado en el que un motor de fuzzing intenta enviar grandes cantidades de datos inesperados, erróneos o simplemente aleatorios a una aplicación para que un programador pueda ver cómo reacciona. A partir de ella, pueden codificar las respuestas apropiadas que protegerán la integridad y la seguridad de la aplicación antes de que esté disponible para el público.

Las herramientas de fuzzing son valiosas porque pueden responder miles de preguntas del tipo "qué pasaría si sobre el comportamiento de la aplicación en un período relativamente corto. Por ejemplo, ¿qué ocurre si un usuario de un sitio de comercio electrónico pide 20 mil millones de chaquetas bomber? ¿El sitio colapsa? ¿Se le ofrece un descuento? ¿O simplemente intenta procesar el pedido imposible de manera regular? Y luego, ¿qué sucede si un usuario ingresa un código de cupón válido, pero en un campo de entrada incorrecto? Finalmente, ¿cómo reaccionará la aplicación si un usuario malintencionado introduce funciones de línea de comando, contenido encriptado, comandos del sistema operativo o código sin procesar en el mismo lenguaje que la aplicación? Un buen motor de fuzzing puede responder todas estas preguntas y más.

¿Cómo funcionan las herramientas de fuzzing?

La funcionalidad de los motores de fuzzing ayuda a explicar por qué existen tantos. Hay bastantes motores de fuzzing comerciales, y cientos de otros escritos por programadores talentosos que han sido compartidos de forma gratuita en plataformas como GitHub. Algunos motores de fuzzing envían montones de información aleatoria, mientras que otros examinan cuidadosamente la aplicación con la que están trabajando e intentan proporcionar información con contexto, pero inesperada. Finalmente, el fuzzing no se limita solo a las entradas de usuario; es valioso para probar interfaces programables, como las APIs REST.

En la mayoría de los casos, el objetivo de una herramienta de fuzzing es generar al menos algunos datos inesperados que el analizador del software probado acepta como válidos. Así, puede informar cómo reacciona la aplicación a esa entrada inesperada pero potencialmente válida.  De manera alternativa, la entrada difusa (fuzzed input) podría bloquear el programa.

Los fuzzers operan usando varios lenguajes de programación. Algunos pueden manejar la mayoría de los lenguajes informáticos; siendo C, C++, Go, Rust, Python, Java, Kotlin, Scala y Swift las opciones más populares. Otros solo operan con aplicaciones en un único lenguaje, convirtiéndose, por ejemplo, en una herramienta específica para ayudar a los programadores de Python. Entonces, si bien hay muchas opciones, debe tener cuidado para obtener un fuzzer que funcione con el idioma de la aplicación, el programa o el hardware que desea probar.

Principales herramientas de fuzzing

Los siguientes son algunos de los mejores motores de fuzzing comerciales y gratuitos actualmente. Hemos intentado encontrar las herramientas de fuzzing más populares o mejor calificadas. Y ya que hay cientos de opciones, inevitablemente debemos haber omitido algunas buenas. Esta lista debería servirle a cualquiera para empezar a elegir un buen motor o herramienta de fuzzing para ayudar a probar sus aplicaciones y programas.

Nuestro método de selección fue un poco arbitrario, pero no hay forma de evitarlo. Las herramientas comerciales provienen de una lista del sitio OWASP.

Luego buscamos "fuzz en GitHub, ordenamos por la cantidad de estrellas (me gusta) para medir por popularidad, y seleccionamos los cinco primeros. Otra medida de popularidad en GitHub y de respeto de la comunidad es la cantidad de veces que se ha bifurcado el proyecto. Dos de los sistemas de nuestra lista (OSS-fuzz y FuzzDB) también se encuentran entre los cinco principales fuzzers bifurcados.

Fuzz testing ya no es solo una opción avanzada excéntrica. Hoy en día muchos estándares importantes de ISO y otros organismos destacados lo recomiendan, y no se sorprenda si eventualmente se convierte en un requisito. Ahora es el momento de convertirlo en una parte estándar de su proceso de pruebas.

4 herramientas comerciales de fuzzing

1. Beyond Security beSTORM: La solución de fuzzing beSTORM de Beyond Security es uno de los fuzzers más versátiles del mercado. Diseñado para probar tanto el hardware como el software, no requiere acceso al código fuente para funcionar. Por lo tanto, puede funcionar casi con cualquier aplicación, protocolo, lenguaje o incluso hardware, al menos en la medida en que la aplicación probada sea programable. Incluso puede funcionar con dispositivos y programas diseñados para industrias y aplicaciones específicas, como las de Internet de las cosas, aplicaciones de control de procesos, aplicaciones automotrices compatibles con CANbus, herramientas aeroespaciales y dispositivos Bluetooth LE de bajo consumo.

La versatilidad de beSTORM es uno de sus activos más significativos porque los programadores solo tienen que aprender a manipular una sola interfaz para iniciar el fuzz testing contra una cantidad casi ilimitada de dispositivos o aplicaciones. La plataforma incluye 250 módulos de prueba preconstruidos, y los usuarios pueden agregar fácilmente otros nuevos para cubrir aplicaciones inusuales o propietarias. Esas pruebas de fuzzing también pueden gestionarse mediante la misma interfaz.

Otra ventaja para las organizaciones más grandes es que los usuarios pueden acceder a la plataforma beSTORM como un servicio en la nube. De esta forma, una organización puede comprar la plataforma y luego proporcionar acceso a las herramientas de fuzzing a múltiples usuarios, incluyendo a los que trabajan en diferentes ubicaciones.

2. Code Intelligence Fuzz: El motor Code Intelligence Fuzz (CI Fuzz) viene como una máquina virtual de Ubuntu preconfigurada para que pueda implementarse localmente o en una nube. Una vez integrado en la canalización de integración continua y entrega continua (CI/CD), CI Fuzz puede ejecutarse automáticamente con cada solicitud de incorporación de cambios. De esta manera, CI Fuzz puede asegurar que los nuevos cambios en una aplicación no hayan agregado vulnerabilidades involuntariamente o malogrado el programa. Y debido a que es parte del proceso de CI/CD, esos problemas serán identificados rápidamente, facilitando determinar cuándo se introdujeron los errores en el programa.

Cada vez que CI Fuzz detecta un error, inmediatamente comienza a enviar diferentes permutaciones de esa entrada para tratar de mapear el alcance del problema. Luego genera un informe detallado para eliminar los falsos positivos y permitir que los programadores reproduzcan esos errores a mano mientras trabajan para corregir el código.

El motor CI Fuzz accede directamente al código fuente del programa o la aplicación bajo prueba, por lo que solo es compatible con ciertos lenguajes y frameworks. En este momento, CI Fuzz funciona con C, C++, Java y Go. La empresa está trabajando en la integración de otros frameworks como .Net Core y Python.

3. Suite de pruebas de fuzzing de Synopsys: La oferta de Synopsys en el ámbito del fuzzing adopta un enfoque único en comparación con la mayoría de los otros. En lugar de intentar crear una herramienta de fuzzing que pueda funcionar con múltiples aplicaciones, Synopsys ofrece un conjunto completo de herramientas, en el que cada una está diseñada para trabajar con un lenguaje, protocolo o caso de uso específico. Con este enfoque a la carta, los usuarios finales pueden comprar la herramienta de fuzzing exacta que necesitan, sin gastar dinero en capacidades adicionales que probablemente nunca requerirán.

Cada herramienta tiene un conjunto estándar de funciones, como una colección de casos de prueba listos para usar que son muy relevantes, un componente de análisis de informes y resultados, una interfaz gráfica para configurar la herramienta y documentación que explica cómo usarla. Cada compra de herramienta también puede venir acompañada de un nivel de soporte al que se puede recurrir de ser necesario.

Synopsys ofrece herramientas para trabajar con todo, desde componentes comunes como servidores DNS hasta aplicaciones más oscuras y especializadas como CAN Bus o IKEv2.

4. ForAllSecure Mayhem for Code: La herramienta de fuzzing ForAllSecure Mayhem for Code proporciona todas las ventajas de la mayoría de los motores de fuzzing con la capacidad adicional de aprender y volverse más eficiente con el tiempo. La plataforma opera de forma independiente con una mínima intervención humana.

El motor de Mayhem for Code funciona continuamente, aprendiendo sobre su entorno y descubriendo cómo hacer uso de la información detallada del sistema mientras acelera las actividades de fuzzing con el tiempo. Incluso puede generar casos de prueba sobre la marcha en función de lo que ha aprendido. Cuanto más se utiliza Mayhem for Code, más eficiente e independiente se vuelve.

La plataforma actualmente funciona con una variedad de lenguajes como Java, Python, Ada, OCaml, Fortran, Jovial, C, C++, Go y Rust. No requiere acceso al código fuente para ejecutar sus pruebas.

6 herramientas de fuzzing gratuitas o de código abierto

1. PeachTech Peach Fuzzer: El fuzzer de protocolo de PeachTech fue archivado en la sección de ofertas pagadas la última vez que escribimos un artículo sobre fuzzing. Fue un motor popular de fuzzing comercial durante muchos años. Sin embargo, su éxito llevó a que su empresa matriz (PeachTech) fuese adquirida por GitLab en el 2020. Si bien la versión gratuita del motor de fuzzing de PeachTech todavía está disponible a través de GitLab, ya no recibe soporte ni actualizaciones.

La idea detrás del programa PeachTech fue que los programadores de la compañía se esforzaron mucho en hacer que el motor de fuzzing fuera altamente configurable para que pudiera funcionar con casi cualquier lenguaje o sistema operativo. Los usuarios solo necesitan configurar manualmente la herramienta antes de señalar la aplicación, programa o dispositivo al que se le hará el fuzzing.

Toda esa misma funcionalidad sigue existiendo en la oferta gratuita de GitLab. Sin embargo, la documentación es bastante compleja y ya no existe soporte para la herramienta. Lo positivo es que es gratis. Pero los usuarios necesitan saber mucho sobre el fuzz testing, así como sobre el lenguaje o el framework que están utilizando para obtener un beneficio real de este fuzzer. Los que no son expertos probablemente deberían buscar en otra parte.

Para los evaluadores con un presupuesto, GitLab incorporó esa tecnología en su plataforma DevSecOps, que no es gratuita. La plataforma ofrece mucho más que solo fuzzing, así que no la veremos en detalle, pero es compatible y está en desarrollo.

2. Google OSS-Fuzz: Google utiliza el fuzzing para el desarrollo de nuevos componentes para Chrome OS o su navegador. Habiendo logrado un gran éxito de esta manera, convirtieron su fuzzer en un proyecto de código abierto, OSS-Fuzz.

OSS-Fuzz se apoya en varios motores de fuzzing como AFL ++, libFuzzer y Honggfuzz. Soporta múltiples lenguajes, incluyendo C, C++, Rust, Go, Python y código Java/JVM, aunque señala que también podrían funcionar otros lenguajes. Funciona con compilaciones x86-64 e i386.

El programa OSS Fuzz es uno de los mejor calificados en GitHub en este momento. Tiene una gran comunidad y mucho apoyo en la comunidad de código abierto.

3. FuzzDB: FuzzDB no es un motor de fuzzing como tal, sino una biblioteca compleja de cargas útiles de ataque y técnicas de inyección conocidas que se usan para descomponer o vulnerar programas y aplicaciones que no están protegidas contra estos. Puede que sea una de las bibliotecas de este tipo más grandes del mundo. Los ataques se clasifican de varias maneras, como por tipo de plataforma, los problemas que se sabe que causan, el potencial de exposición de la fuente y muchos otros factores.

Probablemente, la mejor manera de usar la biblioteca FuzzDB es junto con un motor de fuzzing programable, donde esos patrones de ataque se pueden cargar y enviar tras una aplicación. Utilizarlo junto con un motor de fuzzing que genera entradas aleatorias ayudaría a cubrir una gran cantidad de terreno, desde vulnerabilidades y ataques conocidos hasta otros desconocidos específicos de la aplicación bajo prueba.

4. Ffuf (Fuzz Faster U Fool): Ffuf es un motor de fuzzing escrito en el lenguaje Go. Es un programa sorprendentemente avanzado para tratarse de una herramienta gratuita, y puede realizar las funciones de fuzzing más comunes, como verificar cómo reaccionan las aplicaciones a las solicitudes GET y POST desconocidas. No hay mucha interfaz de usuario ya que utiliza funciones de línea de comandos. Estas, sin embargo, son muy potentes una vez que se aprenden.

La página de GitHub sobre ffuf tiene muchos ejemplos de cómo implementarlo, y el desarrollador lanza nuevas funcionalidades y características regularmente. Si bien ffuf es gratuito, utiliza un modelo de patrocinio. Las nuevas funciones están disponibles de inmediato para aquellos que han pagado para ayudar a patrocinar el desarrollo de la herramienta. Todos los demás obtienen acceso 30 días después.

5. Google ClusterFuzz: Google ClusterFuzz es el motor de fuzzing utilizado por Google para buscar errores en Chrome. También es parte del backend del proyecto OSS-Fuzz mencionado anteriormente. Sin embargo, ClusterFuzz funciona con cualquier programa o aplicación, no solo con los del ámbito de código abierto.

Según la página de GitHub, ClusterFuzz ha encontrado con éxito más de 29 mil errores en productos de Google y 26 mil en proyectos de código abierto gracias a su integración con OSS-Fuzz. El programa ClusterFuzz está diseñado para ser altamente escalable y ejecutarse en cualquier entorno. Las páginas de GitHub del proyecto enumeran un proyecto en el que ClusterFuzz está trabajando junto con 100 mil máquinas virtuales, por lo que la escalabilidad no debería ser un problema para nadie.

6. go-fuzz: La plataforma go-fuzz es un fuzzer con una calificación muy alta diseñado para probar paquetes en el lenguaje Go. Se usa principalmente con paquetes que analizan texto complejo y entradas binarias. Según el autor, es especialmente útil para fortalecer los sistemas que analizan las entradas provenientes de usuarios potencialmente maliciosos, como casi cualquier cosa desplegada al público a través de una página web.

La documentación hace un buen trabajo mostrando cómo usar el fuzzer. Mientras tanto, un repositorio adjunto contiene numerosos ejemplos de funciones de prueba y configuraciones de entrada iniciales para varias aplicaciones.

Crédito foto: coyot / Thinkstock