Skip to main content

La bibliothèque npm Sequelize ORM présente une vulnérabilité aux attaques par injection SQL

Écrit par

11 septembre 2019

0 minutes de lecture

Les mappeurs objet-relationnel, également appelés ORM, sont des bibliothèques SQL qui aident les développeurs à gérer le code de leurs bases de données en l’abstrayant sous forme de constructions du langage.

Les bibliothèques ORM SQL sont réputées très efficaces pour prévenir les injections SQL, mais elles peuvent malheureusement elles-mêmes comporter des failles de sécurité qui ouvrent la voie à des attaques par injection SQL au niveau de l’application.

Pourquoi faut-il se préoccuper des attaques par injection SQL ?

L’un des principaux avantages des ORM est qu’ils utilisent des requêtes préparées, une technique qui permet d’échapper les entrées afin de prévenir les vulnérabilités d’injection SQL. Cela dit, les attaques par injection figurent en tête de liste de l’OWASP Top 10, et un rapport d’Akamai sur l’état d’Internet a révélé que les vulnérabilités d’injection SQL représentent désormais près des deux tiers de toutes les attaques contre les applications web (65,1 %).

Nous avons déjà traité en détail de l’injection SQL et des ORM. Dans cet article, je souhaite me pencher sur un exemple récent d’injection SQL découvert par l’équipe Snyk dans la bibliothèque npm populaire sequelize.

Snyk découvre une injection SQL dans la bibliothèque npm Sequelize ORM

En juin 2019, Snyk a découvert des vecteurs d’attaque susceptibles de permettre des attaques par injection SQL dans les applications utilisant Sequelize, une bibliothèque npm populaire pour les applications Node.js. Au total, nous avons identifié trois vulnérabilités d’injection SQL dans Sequelize, référencées sous les CVE CVE-2019-10752 CVE-2019-10749, CVE-2019-10748.

Peu après avoir confirmé le problème, nous avons pris contact avec les responsables de sequelize, Jan Aagaard Meier et Sushant Dhiman, afin de leur divulguer nos découvertes de manière responsable et de leur fournir un exemple d’injection SQL illustrant la vulnérabilité et les chemins de code vulnérables qui y conduisent.

La réaction rapide de l’équipe Sequelize, qui a publié des correctifs dans les branches 3.x et 5.x de la bibliothèque, témoigne de son engagement envers la sécurité et la protection de ses utilisateurs. Ces correctifs ont remédié à la vulnérabilité et fourni aux utilisateurs une voie de mise à niveau pour prévenir les injections SQL.

Page des versions GitHub de Sequelize v5.8.11 indiquant un correctif de sécurité contre l’injection SQL dans les clés de chemin JSON de MySQL/MariaDB

Le projet Sequelize a publié des correctifs dans la version 3.35.1, qui corrige les vulnérabilités de sécurité affectant PostgreSQL, ainsi que dans la version 5.8.11, qui corrige celles touchant les dialectes MySQL et MariaDB. Nous vous recommandons vivement de procéder à la mise à niveau dès que possibleafin de vous assurer d’utiliser des versions sécurisées de sequelize.

La plus récente des trois vulnérabilités d’injection SQL mentionnées a été corrigée dans la version 5.15.1 de Sequelize. Les notes de version officielles incluent l’exemple ci-dessous :

Capture d’écran d’une note de version 5.15.1 décrivant un correctif de sécurité contre une injection SQL dans Sequelize JSON et présentant un exemple de vecteur d’attaque.

Un exemple d’injection SQL pour MySQL et MariaDB

Toutes les versions de sequelize antérieures à la version 5.8.11 sont vulnérables aux injections SQL (CVE-2019-10748), car elles contiennent des clés de chemin JSON qui ne sont pas correctement échappées pour les dialectes MySQL et MariaDB.

Prenons l’exemple d’injection SQL suivant avec 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,
  }));
})();

Le champ de base de données meta attend un objet JSON, mais la clé fournie n’est pas correctement assainie pour échapper les apostrophes. Si l’apostrophe est transmise avec le texte )) AS DECIMAL) attendu par la requête, le code peut alors être exploité.

Cet exemple d’injection SQL montre qu’il est possible d’exécuter d’autres requêtes SQL, par exemple une UNION, ou de terminer complètement une requête avec un point-virgule et d’ajouter une instruction à la suite, comme ; DROP TABLE USERS.

Une vulnérabilité similaire d’injection SQL affecte toutes les versions de sequelize antérieures à la version 3.35.1 pour le dialecte PostgreSQL.

Suis-je concerné et que dois-je faire ?

Si Snyk surveille votre projet et que nous détectons des versions vulnérables de sequelize, vous en serez informé par les alertes habituelles de Snyk. De plus, si vous avez connecté votre dépôt GitHub, nous créerons automatiquement une pull request pour mettre à niveau sequelize vers sa version corrigée.

L’équipe de recherche en sécurité de Snyk travaille constamment à la découverte de vulnérabilités dans de nombreux écosystèmes de langages de programmation. Parmi ses récentes découvertes figurent la vulnérabilité de sécurité de la bibliothèque npm lodash, ainsi que les recherches approfondies qui ont révélé la vulnérabilité Zip Slip, présente dans de nombreux écosystèmes de langages de programmation et affectant des milliers d’applications.

Si vos projets ne sont pas surveillés par Snyk et que vous souhaitez vérifier s’ils utilisent ce package, vous pouvez le faire ci-dessous ou utiliser notre CLI pour tester vos projets localement.

Nous vous recommandons également d’adopter des pratiques de programmation sécurisée et de suivre les bonnes pratiques, comme le guide de prévention des injections SQL de l’OWASP.

Vous pensez avoir découvert une vulnérabilité dans Sequelize ?Chez Snyk, nous accordons une grande importance à la communauté de la sécurité et sommes convaincus que la divulgation responsable des vulnérabilités de sécurité dans les packages open source contribue à protéger la sécurité et la confidentialité des utilisateurs. Si vous pensez avoir découvert une vulnérabilité dans Sequelize, vous pouvez la signaler dans le programme de divulgation des vulnérabilités des packages Snyk Open Source ; nous nous occuperons du reste !https://snyk.io/vulnerability-disclosure/

Lancez-vous dans les compétitions Capture The Flag

Apprenez à résoudre des défis Capture The Flag en regardant à la demande notre atelier virtuel d’initiation.