Skip to main content

Les vulnérabilités ReDoS dans npm bondissent de 143 % et les XSS continuent de progresser

Écrit par
the state op open source small

26 février 2019

0 minutes de lecture

Bienvenue dans le rapport annuel 2019 de Snyk sur l’état de la sécurité de l’open source. Ce rapport se compose de plusieurs articles :

Vous pouvez aussi télécharger notre superbe rapport PDF, réalisé avec soin, qui rassemble toutes ces informations et bien plus encore.

Télécharger le rapport 2019 sur l’état de la sécurité de l’open source

Déni de service par expression régulière

L’environnement d’exécution Node.js présente de nombreux atouts, mais l’un d’eux, sa boucle d’événements monothread, peut aussi devenir son maillon faible si elle n’est pas utilisée correctement. Cela arrive plus souvent qu’on ne le pense.

Les attaques par déni de service via des expressions régulières (ReDoS) exploitent les vulnérabilités liées à la complexité non linéaire dans le pire des cas que peuvent entraîner certains modèles d’expressions régulières. Pour un environnement d’exécution monothread, cela peut être dévastateur. C’est pourquoi Node.js est particulièrement touché par ce type de vulnérabilité.

Nous avons constaté une hausse du nombre de vulnérabilités ReDoS divulguées au cours des trois dernières années, avec un bond de 143 % en 2018 à lui seul.

Graphique en courbes intitulé « Les divulgations de vulnérabilités par déni de service lié aux expressions régulières (ReDoS) sont en hausse », passant d’environ 14 en 2016 à 72 en 2018.

Vulnérabilités XSS

Les attaques par script intersite (XSS) constituent depuis longtemps un problème croissant pour les applications web. Nous observons une forte hausse des vulnérabilités XSS en 2018 dans tous les écosystèmes surveillés par Snyk. 

Les vulnérabilités XSS dans les bibliothèques open source continuent de se multiplier, alors même qu’elles figurent parmi les principales préoccupations de l’OWASP depuis plus de 15 ans

Parmi ces écosystèmes, npm compte le plus de vulnérabilités XSS, avec 225 divulgations au total, suivi du dépôt Maven Central avec 167 et de PyPI avec 163 vulnérabilités de script intersite. En 2018, l’écosystème PHP Packagist a enregistré le plus grand nombre de divulgations, avec 56 vulnérabilités XSS, suivi de npm avec 54 et de Maven Central avec 29.

Graphique linéaire montrant la hausse des vulnérabilités XSS, qui passent d’environ 80 en 2014 à 175 en 2018, avec des fluctuations entre 2015 et 2017.

Traversée de chemins

Les vulnérabilités de traversée de chemins et de répertoires se démarquent nettement dans l’écosystème npm, avec un nombre record de divulgations : 146 en 2017 et 143 en 2018. Les autres écosystèmes sont loin derrière, ce qui est une bonne nouvelle !

On pourrait supposer que cela s’explique par le grand nombre de serveurs web statiques et dynamiques conçus avec Node.js pour la production et le développement, et donc par le fait qu’il existe davantage de packages susceptibles de présenter ce type de vulnérabilité.

Graphique à barres des vulnérabilités de traversée de chemin dans RubyGems, PHP Packagist, PyPI, Maven Central et npm de 2016 à 2018.

Vulnérabilités d’injection SQL

Autre vecteur d’attaque courant, régulièrement cité dans le top 10 de l’OWASP depuis dix ans : la CWE-89, plus connue sous le nom d’injection SQL.

Sur les trois dernières années, on observe des pics à des périodes différentes dans chacun des trois principaux écosystèmes étudiés. Les bibliothèques Maven arrivent en tête du nombre de vulnérabilités d’injection SQL divulguées en 2016 et 2017, suivies des bibliothèques PHP Packagist, qui ont atteint un pic en 2018.

Graphique à barres des divulgations de vulnérabilités par injection SQL, par écosystème et par année : npm 3, 0, 4 ; Maven Central 8, 6, 2 ; PHP Packagist 4, 5, 16.

Exposition d’informations sensibles

En examinant les registres Maven Central et PHP Packagist, nous avons constaté qu’ils comptaient le plus de vulnérabilités liées à l’exposition d’informations, avec un pic en 2018 dans les deux écosystèmes.

Les expositions d’informations sont souvent involontaires. Elles se produisent lorsqu’un programme ou un système divulgue des informations potentiellement sensibles, comme des noms et des valeurs de variables d’environnement. Elles peuvent aussi être « prévues » par conception, par exemple lorsque des données sensibles sont fournies dans les paramètres d’une URL.

Parmi les vulnérabilités d’exposition d’informations du registre Maven Central, citons les packages apache spark, jenkins core et keyclock-saml-core. Le plugin CI jenkins ssh-agent, par exemple, a exposé la clé privée SSH dans les journaux de compilation, accessibles à toute personne disposant d’autorisations de lecture.

Le registre PyPI compte également un nombre important de vulnérabilités dans les bibliothèques, notamment des cas d’exposition d’informations. Des packages comme django affichaient le hachage du mot de passe d’un utilisateur aux administrateurs disposant uniquement d’autorisations de consultation. Le package djangorestframework-api-key stockait les clés API en clair.

Graphique à barres des vulnérabilités liées à l’exposition d’informations sensibles dans les écosystèmes Java de 2016 à 2018 ; Maven Central affiche le nombre le plus élevé, avec 53 en 2018.

Transmission en clair d’informations sensibles

Enfin, une autre vulnérabilité particulière mérite d’être mentionnée dans l’écosystème npm : la CWE-319, également appelée transmission en clair d’informations sensibles, qui consiste à accéder à des ressources via des protocoles non sécurisés. Nous avons recensé 44 nouvelles vulnérabilités signalées dans des packages en 2016. Ce chiffre a ensuite grimpé à 110 packages en 2017, soit une hausse de 250 %. 

« L’état de sécurité d’un écosystème et la perception qu’en a le public sont souvent très différents. L’absence de typage en JavaScript a contribué à l’idée que ce langage n’est pas sûr en raison de la manipulation des types. Pourtant, le nombre de vulnérabilités découvertes dans les modules npm au cours des deux dernières années reste inférieur à celui des vulnérabilités découvertes sur Maven Central. Dans le même temps, certaines vulnérabilités peuvent avoir des conséquences plus graves, car Node.js reste monothread. Les vulnérabilités ReDoS (ou autres attaques par déni de service provoquant l’épuisement des ressources processeur), beaucoup plus courantes dans l’univers Node.js, en sont un exemple. Espérons que les Worker Threads permettront bientôt à Node.js de réduire ces risques. La communauté de la sécurité autour de Node.js est de plus en plus active depuis quelques années, et nous pouvons continuer à travailler dur pour rendre l’écosystème plus sûr à l’avenir. »

Vladimir de Turckheim

Node.js Foundation, Node.js Security Working Group

À la une : les packages malveillants

Vous avez peut-être entendu parler de packages malveillants dans différents contextes : conteneur Docker malveillant ou package malveillant dans le registre public d’un écosystème. Nous avons également évoqué à plusieurs reprises l’utilisation des développeurs comme vecteurs de diffusion de logiciels malveillants, notamment avec le malware Induc, qui a infecté des compilateurs Delphi, et XCodeGhost, qui ciblait les développeurs iOS et OS X.

Cependant, les packages malveillants ne se ressemblent pas tous. Dans les registres des écosystèmes, on peut les classer en grandes catégories :

  • une attaque par typosquattage, où un package malveillant porte un nom très similaire à celui d’un package plus populaire

  • la compromission du compte CI ou du compte de registre d’un responsable de la maintenance, qui entraîne la publication d’une version malveillante, ou la présence d’un package malveillant dans la liste des dépendances d’un projet

  • l’ajout d’un package malveillant (ou qui le deviendra après son inclusion) à la liste des dépendances d’un projet par manipulation psychologique

En 2018, nous avons observé tous ces types de packages malveillants dans l’écosystème npm, qui est l’un des registres les plus touchés. Le package qui a fait la une des actualités en décembre 2018 était event-stream. Il reposait sur une dépendance malveillante introduite par une tentative en apparence anodine de contribuer à un projet open source.

En seulement deux mois, ce piratage a entraîné le téléchargement du package malveillant pas moins de 8 millions de fois. Autre exemple de 2018 : le package ESLint-scope, dont le compte du responsable de la maintenance a été compromis. Nous avons également recensé 11 attaques par typosquattage visant des packages malveillants publiés dans le registre npm en 2018. 

En 2018, un package malveillant a été téléchargé un nombre record de 8 millions de fois. Il faisait partie des 25 attaques par typosquattage recensées dans npm et PyPI.

Outre les tentatives classiques de typosquattage déjà observées, nous avons constaté des attaques plus sophistiquées contre l’écosystème npm que les années précédentes, comme celle visant ESLint-scope. L’incident event-stream, d’une grande sophistication, a révélé un niveau d’expertise et un ciblage inédits par rapport aux précédentes attaques malveillantes observées dans l’écosystème.

Contrairement au registre npm, les seuls autres registres où nous avons identifié des packages malveillants étaient RubyGems, avec un seul package malveillant en 2018, et Python, avec dix packages malveillants en 2017 et treize en 2018.

Poursuivre la lecture :

Lancez-vous dans les compétitions Capture The Flag

Apprenez à résoudre des défis de capture du drapeau en regardant à la demande notre atelier virtuel d’initiation.