Ejecución arbitraria de código en Grunt
21 de septiembre de 2020
0 minutos de lecturaTe damos la bienvenida a Snyk Monthly Vulnerability Profile. En esta serie, Snyk repasa las vulnerabilidades descubiertas por nuestroSecurity Research Teamo reportadas a este equipo. Cada mes elegimos una vulnerabilidad destacada y contamos la historia de su descubrimiento, investigación y divulgación. Destacamos a los investigadores, desarrolladores y usuarios que ayudan a identificar y corregir vulnerabilidades en toda la comunidad de código abierto.
Este mes analizamos una vulnerabilidad de ejecución arbitraria de código descubierta en el popular paquete de JavaScript Grunt.
Vulnerabilidad: ejecución arbitraria de código en js-grunt
CVE asignados: CVE-2020-7729
Analista de Snyk: George Gkitsas
Descubierta por: Snyk Research Team
El equipo de investigación de Snyk descubrió y divulgó una vulnerabilidad de ejecución arbitraria de código en el popular paquete de JavaScript Grunt.
Como parte de sus esfuerzos continuos por ayudar a que el software de código abierto sea más seguro, el equipo identifica patrones de prácticas de codificación inseguras que pueden provocar vulnerabilidades. Al detectar ciertos patrones, puede crear reglas que herramientas como los linters pueden usar para analizar paquetes populares y determinar si presentan esas vulnerabilidades.
La vulnerabilidad de ejecución arbitraria de código en el paquete Grunt se identificó de esta manera. Veamos en detalle la vulnerabilidad, cómo se descubrió y cómo el equipo de investigación trabajó con el encargado del mantenimiento del paquete para garantizar que se corrigiera.
Detalles de la vulnerabilidad de ejecución arbitraria de código
George Gkitsas trabajaba en el desarrollo de nuevas reglas para linters con el fin de descubrir vulnerabilidades en el ecosistema de JavaScript. En este caso, George buscaba detectar cuándo los paquetes usan la función vulnerable load() del paquete js-yaml para analizar un documento yaml a partir de una cadena de texto. Se recomienda usar una versión más reciente y no vulnerable del método, llamada safeLoad(), para analizar este tipo de cadenas.
George probó una regla de linter que permitía identificar ese patrón en paquetes de JavaScript. Al revisar los resultados y ajustar la regla, logró reducir las detecciones de falsos positivos a un nivel aceptable. Así, pudo agregarla a las automatizaciones que Snyk ejecuta periódicamente para identificar paquetes potencialmente vulnerables en el ecosistema de código abierto.
Snyk selecciona periódicamente los 1,000 paquetes más populares según su número total de descargas y los analiza en busca de indicios de distintas vulnerabilidades. En este caso, el análisis señaló que el paquete Grunt tenía una vulnerabilidad debido al uso de la función load(). Sin embargo, por supuesto, no basta con identificar un paquete mediante un linter automatizado.
El siguiente paso es investigar el hallazgo y confirmar que el código sea realmente vulnerable y que la detección no sea un falso positivo. George pudo revisar fácilmente el código identificado y confirmar que, efectivamente, era vulnerable. Sin embargo, el equipo de investigación no se detiene ahí. También es importante confirmar que la vulnerabilidad esté en código accesible y, por lo tanto, que se pueda explotar. El código vulnerable que no se puede explotar de manera efectiva representa un riesgo mucho menor. Por eso, George creó una prueba de concepto rápida y confirmó que el código era vulnerable.

Confirmado: CVE-2020-7729
Tras confirmar que el código vulnerable podía explotarse, George asignó CVE-2020-7729 para documentar la vulnerabilidad y se comunicó por correo electrónico con el encargado del mantenimiento del paquete. Este respondió en menos de una hora y expresó su interés en conocer los detalles del hallazgo de Snyk. Solicitó información adicional y luego confirmó que, efectivamente, se trataba de una vulnerabilidad.
Sin embargo, esta situación tenía una particularidad que la diferenciaba de otras vulnerabilidades que suelen descubrirse: el paquete Grunt es una herramienta para desarrolladores. Es un ejecutor de tareas que ayuda a automatizar tareas repetitivas durante el proceso de desarrollo. Por eso, el equipo de investigación tuvo que considerar si existía un caso de uso en el que alguien pudiera explotar el código como parte de un ataque. Tras analizar cómo usan Grunt los desarrolladores, George pudo confirmar con el encargado del mantenimiento que existía un vector de ataque válido.
En menos de una semana, el encargado del mantenimiento publicó una corrección para el paquete Grunt. La versión 1.3.0 se confirmó en GitHub el 17 de agosto de 2020. El nuevo código ofrece la opción de usar el método anterior load() o el método safeLoad(), según la situación y la funcionalidad necesaria.
Una vez disponible la versión actualizada, Snyk publicó el CVE y lo agregó a Snyk Vulnerability Database. Se identificó la vulnerabilidad en más de 2,000 proyectos monitoreados por Snyk y se notificó a sus propietarios.

El compromiso de Snyk con la seguridad
En definitiva, el descubrimiento y la divulgación de esta vulnerabilidad demuestran cómo el trabajo del equipo de investigación de Snyk ayuda a encontrar problemas de seguridad en paquetes de código abierto de forma más rápida y eficaz. Los investigadores lograron identificar y confirmar no solo la vulnerabilidad y la posibilidad de explotarla, sino también un vector de ataque plausible que demostró el riesgo real que representaba. Esto es solo una parte del compromiso de Snyk con el empoderamiento de los desarrolladores para que mantengan la seguridad mientras aprovechan el código abierto en sus desarrollos.
Comienza con Capture the Flag
Aprende a resolver desafíos de Capture the Flag con nuestro taller virtual 101 a pedido.
