Imaginons la situation suivante : pour améliorer rapidement le design de votre nouvelle application Web, vous ajoutez une nouvelle librairie aux dépendances de votre projet. Quelques semaines plus tard, vous vous rendez compte qu’un attaquant a le contrôle complet de votre serveur de production. Ces deux événements n’ont a priori aucun lien, et pourtant…
💡 Un peu de contexte
Tailwind est un framework CSS bas-niveau. Il ne propose par exemple aucun composant prêt à l’emploi, puisqu’il est pensé pour permettre de faire n’importe quel design.
Pour ajouter du material design sur une application utilisant Tailwind CSS, il est donc nécessaire d’ajouter une librairie supplémentaire, telle que Material Tailwind.
Des attaquants ont publié une fausse librairie sur NPM en reprenant du code existant, en espérant piéger des développeurs pas suffisamment vigilants.
🕵️ Explication de l'attaque
La librairie initiale a pour nom @material-tailwind/react, la copie des attaquants s’appelait material-tailwindcss. C’est une forme de “name-squatting” ; les attaquants espèrent que des développeurs vont se tromper, et installer la copie, en recherchant le nom de la librairie sur npm.js par exemple. L’attaque a fonctionné, puisqu’avant d’être retirée par npm, le package avait été téléchargé plus de 500 fois.
Le code de la fausse librairie était en grande partie repris d’un véritable package : tailwindcss-stimulus-components. En plus du code copié collé, les attaquants ont ajouté le code malicieux dans un script postinstall dans le package.json. Dès que la librairie est installée sur un projet qui l’ajoute en dépendance, le script est alors exécuté, que ce soit sur la machine du développeur, ou sur le serveur de production.
Le code en question était obfusqué ; c’est ce qui a mis la puce à l’oreille aux chercheurs de ReversingLabs. Ceux-ci ont pu faire une première analyse pour déterminer le déroulement de l’attaque :
- télécharger une archive ZIP sur un serveur distant
- dézipper son contenu : un fichier exécutable pour Windows contenant notamment des scripts PowerShell, un langage de script pour Windows
- lancer l’exécutable
Il est compliqué de déterminer avec précision ce que faisait l’exécutable, les attaquants ayant fait de leur mieux pour cacher le mieux possible les véritables objectifs.
Voilà quelques points importants dans l’attaque :
- l’exécutable teste de pinger google.com pour vérifier si la machine est connectée à Internet
- il ajoute une tâche planifiée lancée quotidiennement pour être persistant sur la machine
- il se connecte à un serveur distant duquel il reçoit des instructions (comme par exemple lister les fichiers présents sur le filesystem)
NPM a supprimé la librairie une première fois, en moins de 24h. Cependant, alors qu’ils ont l’habitude de le faire, ils ne l’ont pas remplacée par un placeholder. Les attaquants ont pu publier de nouvelles versions de la librairie, cette fois ciblant également les MacOS.
NPM a une nouvelle fois retiré la librairie, et cette fois, ont bloqué complètement les attaquants.
🛡 Comment se protéger ?
- Avant d’ajouter une librairie, vérifier qu’elle est bien légitime, en allant par exemple regarder son score sur https://snyk.io/advisor/. Ce site permet de visualiser le nombre de téléchargements, le nombre de contributions, et permet d’avoir rapidement une bonne vision de la stabilité d’une librairie. Il peut également proposer des alternatives, le cas échéant avec un meilleur score.
- Ajouter à la CI un job régulier (hebdomadaire par exemple) qui vérifie la présence de vulnérabilités connues sur les librairies utilisées (npm audit, php-security-checker, python safety, DependencyCheck pour maven…)
🏹 Pour aller plus loin
- L’article poussé de l’analyse par ReversingLabs
- La page de NPM telle qu’elle était lorsqu’elle proposait la librairie malveillante : https://web.archive.org/web/20220922170459/https://www.npmjs.com/package/material-tailwindcss
Nous avons pour ambition de sécuriser le web, et pour atteindre cet objectif, nous avons besoin de vous ! Si vous avez des questions, des suggestions ou le moindre doute, n'hésitez pas à contacter notre équipe sécurité security@theodo.fr.