“Je ne sais pas quoi dire.” – le post mortem d'event-stream
Mardi 20 novembre, Ayrton Sparling (FallingSnow) étudiant à l’université de Californie ouvre une issue sur GitHub. Il accuse le mainteneur du projet – right9ctrl dont l’identité n’est pas connue à ce jour – d’avoir compromis la librairie téléchargée presque 8 millions de fois depuis et dont dépendent le site BBC News et l’éditeur Visual Studio Code entre autres.
Il ne le sait pas encore, mais cette issue va faire couler beaucoup d’encre.
Résumé des faits
La librairie event-stream a été initialement développée par Dominic Tarr (dominictarr) à partir de 2011. L’idée de ce module est de faciliter la création et la manipulation de Streams (flux de données dans le temps) en ajoutant des méthodes classiques des Arrays tels que map, filter ou reduce.
Le projet a pris de l’ampleur au fur et à mesure des années. Petit à petit, des gros projets l’ont utilisé directement ou indirectement (à travers d’autres modules). On peut citer ps-tree, vue-cli ou monaco-editor.
Dominic perd son intérêt pour le projet et ne le met à jour que très rarement, principalement pour merger des pull requests d’autres contributeurs.
Un jour, il reçoit un mail lui demandant les droits d’accès au module pour pouvoir le maintenir. Ne se posant pas de questions et voulant se débarrasser de la maintenance de ce projet qui n’avait plus d’intérêt pour lui, Dominic donna les droits sur npm et sur GitHub.
Le 4 septembre 2018, right9ctrl commence à contribuer sur le projet. Il créé une version 3.3.5 le 5 septembre puis une version version 3.3.6 ajoutant une dépendance vers un module nommé flatmap-stream le 9 septembre. D’apparence, tout semble parfaitement normal.
7 jours plus tard, il supprime ce module puis fait quelques modifications innocentes, il ne republie cependant aucune version depuis.
Seulement si on y regarde de plus près, tout n’est pas tout à fait normal.
De premier abord rien de choquant, la gestion des flatmap est quelque chose qui a été suggéré précédemment. Sauf que la librairie qu’il a ajoutée, développée par un certain hugeglass a été mise en ligne le 5 septembre et n’a jamais été utilisée avant. On a d’ailleurs toujours accès à la version 0.1.0 sur GitHub.
Si on creuse un peu plus, on se rend compte qu’on utilise en fait la version 0.1.1 du package qui ne contient pas tout à fait la même chose que la version 0.1.0. Dans les sources non obfuscées, pas de différence, mais dans les obfuscées (index.min.js
), on se rend compte qu’un bout de code supplémentaire a été rajouté. Ce bout de code une fois décrypté semble vérifier la présence de la librairie copay pour exécuter une partie de code supplémentaire.
C’est quoi Copay ?
Copay est un portefeuille Bitcoin partagé et “sécurisé” (c’est comme ça qu’ils se définissent !).
Ce bout de code supplémentaire (qui fonctionnerait sur n’importe quel support) essayait tout simplement de transférer les Bitcoins et BCH de vos portefeuilles sur un serveur situé à Kuala Lumpur en Malaisie.
Le 20 novembre, presque deux mois après les faits, FallingSnow ouvre cette fameuse issue sur le GitHub d’event-stream. Rapidement, elle fait le tour de la communauté JavaScript. Npm est dans l’obligation d’agir. Ils suppriment flatmap-stream et la version 3.3.6 d’event-stream le 26 novembre.
Cette suppression entraîne évidemment des erreurs de build pour tous les modules utilisant cette lib bloquant un nombre colossal de développeurs.
Le repo GitHub d’event-stream a depuis été archivé.
Comment savoir si je suis atteint ?
Si vous utilisez Copay, mettez-le immédiatement à jour en version 5.2.0, ils ont posté un article pour tout expliquer.
Sur vos projets node/JS, npm ls event-stream flatmap-stream
vous permet de voir si vous utilisez une de ces deux librairies dans votre arbre de dépendances. Si cela vous remonte flatmap-stream@0.1.1
, vous êtes potentiellement affecté.
Sur une CI, vous pouvez avoir l’erreur npm ERR! notarget No matching version found for event-stream@3.3.6
.
Comment corriger le problème ?
Dans tous les cas, mettez à jour vos dépendances, au minimum celles qui utilisent cette lib (c’était le cas pour nodemon
dans mon cas).
Le jour où ils ont supprimé les modules, les gens rollbackaient sur une version précédente d’event-stream (3.3.4), mais dans le doute npm a pris le contrôle du packet et a poussé les versions 4.0.0 et 4.0.1.
A qui la faute ?
Est-ce la faute de dominictarr d’avoir donné accès à sa librairie à un inconnu ?
Est-ce notre faute, communauté open-source, de ne pas avoir été plus vigilant ?
D’autres personnes mal intentionnées pourraient tout à fait réutiliser le même genre de pratiques pour faire des choses bien plus graves comme des attaques DDoS ou espionner nos appareils électroniques. Ce problème avait d’ailleurs été soulevé en début d’année par David Gilbertson sans que ça ne change quoi que ce soit.
La communauté se déchire sur le sujet depuis cette histoire.
Je vous propose une réponse à cette question dans un second article 🙂