Skip to main content

El equipo de investigación de Snyk descubre graves vulnerabilidades de seguridad por contaminación de prototipos que afectan a todas las versiones de lodash

Escrito por

5 de julio de 2019

0 minutos de lectura

El 2 de julio de 2019, Snyk publicó una vulnerabilidad de seguridad de alta gravedad por contaminación de prototipos (CVE-2019-10744) que afecta a todas las versiones de lodash, como resultado de un análisis en curso dirigido por el equipo de investigación de seguridad de Snyk.

ACTUALIZACIÓN: lodash publicó la versión 4.17.12 el 9 de julio, que incluye las correcciones de Snyk y soluciona la vulnerabilidad. Te recomendamos encarecidamente actualizar a la versión más reciente de lodash.

Al momento de escribir este artículo, no se había publicado ninguna corrección oficial para esta vulnerabilidad. Los usuarios de Snyk están protegidos mediante un parche de seguridad, disponible para unos 50,000 proyectos vulnerables, que soluciona la vulnerabilidad en la versión más reciente de lodash, la 4.7.11.

Página del repositorio lodash/lodash en GitHub que muestra las pestañas de navegación y los recuentos de personas que siguen el repositorio, estrellas y bifurcaciones

Esta popular biblioteca de npm es utilizada por 4.35 millones de proyectos solo en GitHub. Tiene casi 40 mil estrellas en GitHub y se descarga más de 80 millones de veces al mes. No hace falta decir que una vulnerabilidad de alta gravedad en una biblioteca tan popular como lodash afecta a una gran proporción de los usuarios de npm.

Snyk abrió activamente miles de pull requests de corrección automática para sus usuarios con el fin de solucionar la vulnerabilidad. A continuación, encontrarás más detalles sobre la vulnerabilidad y los pasos que debes seguir.

Esta reciente noticia sobre la vulnerabilidad de seguridad de lodash salió a la luz apenas tres meses después de que informáramos sobre una vulnerabilidad similar de contaminación de prototipos en la popularísima biblioteca frontend de JavaScript jQuery.

Al igual que otras vulnerabilidades de contaminación de prototipos ([1], [2], [3], [4], [5]), una implementación de combinación recursiva insegura de JSON puede permitir manipular el objeto Object de JavaScript, lo que influye en otros tipos de datos a través de la cadena de prototipos. Las consecuencias de estas vulnerabilidades pueden ir desde la inyección de propiedades hasta la inyección de código y la denegación de servicio, según el caso de uso afectado y si es posible explotar la vulnerabilidad.

Ya agregamos la vulnerabilidad a la base de datos de Snyk y, si Snyk monitorea tu proyecto y detecta que contiene el paquete vulnerable, ya habrás recibido nuestras alertas habituales. Si no es así, debes analizar el repositorio de código de tu aplicación para comprobar si le afecta la versión vulnerable de lodash.

Acerca de la vulnerabilidad de seguridad de lodash

La función defaultsDeep podía ser manipulada para agregar o modificar propiedades de Object.prototype mediante una carga útil constructor. A continuación, se muestra un ejemplo del impacto de esta vulnerabilidad en una aplicación de JavaScript:


const mergeFn = require('lodash').defaultsDeep;
const payload = '{"constructor": {"prototype": {"a0": true}}}'

function check() {
    mergeFn({}, JSON.parse(payload));
    if (({})[`a0`] === true) {
        console.log(`Vulnerable to Prototype Pollution via ${payload}`);
    }
  }

check();

Después de repasar los conceptos básicos de la contaminación de prototipos, podemos revisar la corrección de seguridad que el ingeniero de Snyk Kirill propuso en un pull request al repositorio de la biblioteca JavaScript lodash en GitHub: https://github.com/lodash/lodash/pull/4336/files

Diferencia de código que muestra los cambios de seguridad en safeGet y una prueba unitaria que evita la combinación indirecta de propiedades de objetos

La corrección incluye una verificación de seguridad para garantizar que no contaminemos el objeto global con una clave establecida en constructor. También se agrega un caso de prueba para evitar futuras regresiones.

Para obtener más información sobre las vulnerabilidades de contaminación de prototipos y cómo funcionan, puedes consultar nuestra descripción de la vulnerabilidad de lodash

Qué debes hacer

  • Si ya usas Snyk para monitorear tus aplicaciones, ya te habrás protegido automáticamente al aplicar el parche de seguridad mencionado, que se te envió como pull request para tus proyectos afectados.

  • Si no usas Snyk, puedes agregar tus proyectos creando una cuenta gratuita e importándolos desde tus repositorios de código al panel de Snyk. Después de revisar los resultados del análisis de Snyk, puedes pedirle a Snyk que cree un pull request para solucionar la vulnerabilidad de tu biblioteca lodash mediante un parche de Snyk.

  • Por ahora, no hay una solución manual sencilla. Cuando se publique una nueva versión de lodash que incluya la corrección, debes actualizar a esa versión.

Snyk crea parches para vulnerabilidades de gran impacto, como la de lodash, que afecta a millones de proyectos en los ecosistemas de Node.js y JavaScript. Todos los parches se prueban rigurosamente para garantizar que se apliquen correctamente en las versiones compatibles de la biblioteca afectada.

Encontrarás una revisión más detallada del proceso de aplicación de parches de Snyk en nuestra página de documentación Corregir vulnerabilidades y en esta publicación del blog sobre ¿De dónde provienen las vulnerabilidades de seguridad?, de Danny Grander, nuestro director de seguridad.

Nota: Cuando se publique una versión oficial de lodash que incluya la corrección de esta vulnerabilidad, se enviará automáticamente un pull request con la actualización oficial de la biblioteca a los proyectos monitoreados por Snyk, tengan un parche aplicado o no.

Divulgación responsable

Como resultado de la investigación de seguridad realizada por el equipo de Snyk en abril de 2019, informamos de forma responsable a John Dalton, responsable de mantenimiento de lodash, sobre esta y otras vulnerabilidades de seguridad que afectaban a la biblioteca.

El proceso incluyó una colaboración con John en un repositorio privado para confirmar nuestros hallazgos y las correcciones propuestas por Snyk para solucionar las vulnerabilidades. En este proceso participó Kirill, uno de los ingenieros de software de Snyk, quien abrió pull requests ([1],[2]) con las correcciones para lodash. Ambos se integraron el 24 de junio.

Queremos reconocer a John por su rápida respuesta y por recibir nuestra ayuda durante todo el proceso de resolución de este problema de seguridad.

Si crees haber encontrado una posible vulnerabilidad de seguridad en Lodash, puedes hablar con nosotros a través de nuestro programa de divulgación de vulnerabilidades. Encontrarás más información aquí: https://snyk.io/vulnerability-disclosure/

lodash: cifras del paquete de npm

Primera versión publicada hace 7 añosÚltima versión: 4.7.11, publicada hace 10 meses, en septiembre de 2018Vulnerabilidades descubiertas hasta la fecha: 4 (2 altas, 2 medias)

Infografía que muestra estadísticas sobre el estado de las dependencias de Lodash, incluidos los detalles de las versiones, cuatro vulnerabilidades y métricas de uso.

Empieza con Capture the Flag

Aprende a resolver desafíos de Capture the Flag viendo nuestro taller virtual introductorio a pedido.