Skip to main content

Sequelize, biblioteca ORM de npm, presenta vulnerabilidades a ataques de inyección SQL

Escrito por

11 de septiembre de 2019

0 minutos de lectura

Los mapeadores objeto-relacional, también conocidos como ORM, son un conjunto de bibliotecas SQL que ayudan a los desarrolladores a administrar el código de sus bases de datos al abstraerlo en construcciones del lenguaje.

Se ha demostrado que las bibliotecas ORM de SQL son excelentes para prevenir la inyección SQL, pero, por desgracia, ellas mismas pueden tener errores de seguridad que abren la puerta a ataques de inyección SQL en las aplicaciones.

¿Por qué deberían importarme los ataques de inyección SQL?

Una de las principales ventajas de usar ORM es que utilizan instrucciones preparadas, una técnica que escapa los datos de entrada para prevenir vulnerabilidades de inyección SQL. Dicho esto, los ataques de inyección están entre los principales riesgos según el OWASP Top 10, y un informe de Akamai sobre el estado de Internet encontró que las vulnerabilidades de inyección SQL representan ahora casi dos tercios de todos los ataques a aplicaciones web (65,1 %).

Ya hemos escrito antes con más detalle sobre la inyección SQL y los ORM. En esta publicación, quiero centrarme en el ejemplo reciente de inyección SQL que el equipo de Snyk descubrió en la popular biblioteca de npm sequelize.

Snyk descubre una vulnerabilidad de inyección SQL en la biblioteca ORM Sequelize de npm

En junio de 2019, Snyk descubrió vectores de ataque que podían provocar ataques de inyección SQL en aplicaciones que usan Sequelize, una popular biblioteca de npm para aplicaciones Node.js. En total, encontramos tres vulnerabilidades de inyección SQL que afectan a Sequelize, identificadas como CVE: CVE-2019-10752 CVE-2019-10749, CVE-2019-10748.

Poco después de confirmar el problema, nos comunicamos con los mantenedores de sequelize, Jan Aagaard Meier y Sushant Dhiman, para divulgar nuestros hallazgos de manera responsable y proporcionar un ejemplo de inyección SQL que demostrara la vulnerabilidad de seguridad y las rutas de código vulnerables que la provocan.

Como muestra del compromiso de Sequelize con la seguridad y con proteger a sus usuarios lo antes posible, respondieron rápidamente y publicaron correcciones en las ramas 3.x y 5.x de la biblioteca, solucionando la vulnerabilidad y ofreciendo a los usuarios una ruta de actualización para prevenir la inyección SQL.

Página de lanzamiento de GitHub para Sequelize v5.8.11 que muestra una corrección de seguridad para la inyección SQL en claves de ruta JSON de MySQL/MariaDB

El proyecto Sequelize publicó correcciones en la versión 3.35.1, que soluciona las vulnerabilidades de seguridad que afectan a PostgreSQL, y en la versión 5.8.11, que corrigió las vulnerabilidades de seguridad en los dialectos de MySQL y MariaDB. Te recomendamos encarecidamente que actualices lo antes posible para asegurarte de usar versiones seguras de sequelize.

La vulnerabilidad de inyección SQL más reciente de las tres mencionadas se corrigió en la versión 5.15.1 de Sequelize e incluye un ejemplo, como se muestra a continuación en las notas oficiales de la versión:

Captura de pantalla de una nota de lanzamiento de la versión v5.15.1 que describe una corrección de seguridad para una inyección SQL en JSON de Sequelize y muestra un ejemplo de vector de ataque.

Un ejemplo de inyección SQL para MySQL y MariaDB

Todas las versiones de sequelize anteriores a la 5.8.11 son vulnerables a la inyección SQL (CVE-2019-10748), porque contienen claves de ruta JSON que no se escapan correctamente en los dialectos de MySQL y MariaDB.

Considera el siguiente ejemplo de inyección SQL con sequelize:

class Project extends Sequelize.Model {}

Project.init({
  name: Sequelize.STRING,
  meta: Sequelize.JSON,
}, {
  sequelize,
  tableName: 'projects',
});

(async () => {
  await sequelize.sync();

  console.log(await Project.findAll({
    where: {meta: {"a')) AS DECIMAL) = 1 UNION SELECT VERSION(); -- ": 1}},
    attributes: ['name'],
    raw: true,
  }));
})();

El campo de la base de datos meta espera un objeto JSON, pero la clave proporcionada no se sanea correctamente para escapar las comillas simples. Si se pasa una comilla simple junto con el texto )) AS DECIMAL) que espera la consulta, es posible explotar el código.

Este ejemplo de inyección SQL muestra que es posible ejecutar otras consultas SQL, como una UNION, o terminar por completo una consulta con un punto y coma y agregar un sufijo como ; DROP TABLE USERS.

Una vulnerabilidad de inyección SQL similar afecta a todas las versiones de sequelize anteriores a la 3.35.1 en el dialecto de PostgreSQL.

¿Me afecta y qué debo hacer?

Si Snyk monitorea tu proyecto y encontramos versiones vulnerables de sequelize, recibirás una notificación mediante las alertas habituales de Snyk. Además, si conectaste tu repositorio de GitHub, crearemos automáticamente un pull request para que actualices sequelize a la versión corregida.

El equipo de investigación de seguridad de Snyk trabaja constantemente para descubrir vulnerabilidades de seguridad en muchos ecosistemas de lenguajes de programación. Algunos ejemplos son la reciente vulnerabilidad de seguridad en la biblioteca de npm lodash y la extensa investigación que permitió descubrir la vulnerabilidad Zip Slip, presente en muchos ecosistemas de lenguajes de programación y que afecta a miles de aplicaciones.

Si Snyk no monitorea tus proyectos y quieres comprobar si usan este paquete, puedes hacerlo a continuación o usar nuestra CLI para probar tus proyectos localmente.

También te recomendamos practicar convenciones de programación segura y seguir las mejores prácticas, como la guía de OWASP sobre inyección SQL.

¿Crees que encontraste una vulnerabilidad en Sequelize?En Snyk valoramos a la comunidad de seguridad y creemos que la divulgación responsable de vulnerabilidades de seguridad en paquetes de código abierto nos ayuda a garantizar la seguridad y la privacidad de los usuarios. Si crees que encontraste una vulnerabilidad en Sequelize, puedes enviarla al programa de divulgación de vulnerabilidades de paquetes de Snyk Open Source y nosotros nos encargaremos del resto.https://snyk.io/vulnerability-disclosure/

Empieza con Capture the Flag

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