Une blague ratée paralyse le registre NPM, empêchant les développeurs de dépublier leurs packages.
Après avoir subi la colère des utilisateurs, les farceurs ont estimés être « au pire des testeurs d'assurance qualité pour NPM et au mieux des comédiens et des codeurs créatifs »

Ce qui aurait pu commencer comme une simple farce a fini par avoir des répercussions plus importantes pour tous les auteurs de l’écosystème NPM. Installer "everything" aurait pu entraîner un manque d'espace de stockage et un ralentissement de votre ordinateur, mais la simple existence du package sur npmjs.com empêche les auteurs, sans rapport avec ce package, de dépublier leurs packages du plus grand registre de logiciels JavaScript au monde.

Le registre NPM est un service qui permet aux développeurs de JavaScript de publier et de partager leurs modules de code avec la communauté. Il est utilisé par des millions de projets et de développeurs dans le monde entier. Cependant, il a récemment été victime d’un canular qui a perturbé son fonctionnement et causé des problèmes à de nombreux utilisateurs.

Le référentiel de packages JavaScript open source exploité par GitHub héberge plus de 2 millions de packages et est utilisé par plus de 17 millions de développeurs, selon le site Web NPM.

Le 29 décembre, un package nommé "everything" (tout) a été publié dans le registre, conçu pour installer tous les autres packages publics du registre. Cela a créé un réseau de dépendances à l'échelle du registre qui a effectivement désactivé la possibilité de dépublier des packages sur le site, car les packages dont dépendent d'autres packages ne peuvent pas être dépubliés.

Qu'est-ce qui se trouve derrière le package "everything" ?

En fait, le package "everything" ne contient que 5 sous-packages, publiés sous la portée "@everything-registry", répertoriés comme ses dépendances. Cependant, ces 5 packages parviennent progressivement à intégrer chaque package présent sur l'ensemble du registre NPM en tant que dépendance. Par exemple, "everything" récupère « @everything-registry/chunk-2 », ce qui peut en outre tenter d'extraire plusieurs autres packages du même auteur, tels que « @everything-registry/sub-chunk-1623 ».

Chacun de ces sous-packages (ou « morceaux » comme les appelle l'auteur) comprend finalement environ 800 projets npm comme dépendance.

Considérant que l'auteur de "everything" a publié plus de 3 000 paquets (morceaux) de ce type, chacun avec des centaines de dépendances, une seule commande « npm install everything » commencera à résoudre ce que l'on appelle les dépendances transitives et finira par télécharger des millions de paquets.

"everything" était accompagné d'un fichier demandant de ne pas l'installer

L'incident a déclenché des réponses de la part des développeurs incapables de dépublier leurs packages obsolètes ou expérimentaux, ainsi que des critiques de la part de certains qui considéraient cette cascade comme un abus du système NPM open source.

Les développeurs derrière "everything" ont déclaré qu’ils n’avaient pas anticipé ces conséquences et ont contacté NPM et GitHub pour résoudre le problème. Ironiquement, l’équipe n’a pas pu dépublier "everything" elle-même en raison d’un cercle de dépendances qui rendait essentiellement le package dépendant de lui-même.

« Nous avons juste pensé que ce serait drôle », a écrit Evan Boehs, un contributeur à "everything", en réponse à la question d'un autre utilisateur de GitHub sur l'objectif du projet. « Nous ne savions pas que tout cela allait arriver ».

Le package "everything" était accompagné d'un fichier « README » indiquant « S'il vous plaît, n'installez pas réellement ceci… ». Il comprenait également une image mème de Gary Oldman du film « Léon », représentant une scène dans laquelle le personnage d'Oldman crie de façon dramatique le mot « everyone » (tout le monde).

La section « à propos » du référentiel "everything" comprend également un lien vers le site Web « everything.npm.lol », qui affichait une animation représentant de nombreux packages en cours d'installation, suivie d'un mème du jeu vidéo « The Elder Scrolls V : Skyrim ».

Malgré l'avertissement de ne pas installer le package, le site de registre NPM indique que « everything » a été téléchargé des centaines de fois

Jossef Harush, responsable du groupe d'ingénierie de sécurité de la chaîne d'approvisionnement chez Checkmarx, a déclaré dans un billet de blog que l'installation de "everything" entraînerait probablement un déni de service (DoS). Harush qualifie également le projet de « campagne de trolls ».

Les inconvénients de ces trolls

Imaginez que vous ayez fait une expérience, publié un package sur NPM et que vous souhaitiez maintenant supprimer votre package NPM. Vous ne pouvez pas le faire si d’autres packages l’utilisent. Le problème est que, puisque "everything" repose sur chaque package (y compris le vôtre), votre package reste bloqué et un package inconnu vous empêche de le supprimer.

Une tentative de suppression des packages

Il ne semble pas que PatrickJS ait réalisé le mal de tête que son troll causerait à certains utilisateurs. Deux jours après la publication des packages de farces, il a créé un problème et a déclaré qu'il ne pouvait pas supprimer les packages car le mécanisme NPM empêche la suppression des packages publiés une fois qu'ils sont utilisés par d'autres projets et appelle à l'aide de l'équipe de support NPM.

En somme

Cet acte de méfait numérique de PatrickJS fait écho à des incidents passés, mettant en évidence les défis persistants dans la gestion des packages et les effets en cascade des dépendances au sein de l'écosystème NPM. La situation souligne les conséquences comiques mais graves de telles farces dans la communauté des développeurs.
« Je tiens à réitérer que nous ne sommes pas des trolls, nous sommes au pire des testeurs d'assurance qualité pour NPM, et au mieux des comédiens et des codeurs créatifs », a écrit Boehs séparément dans un commentaire sur GitHub.

Nom : telecharge.png
Affichages : 70816
Taille : 119,7 Ko

Plus de 2 millions de packages NPM pris dans « l’enfer des dépendances »

L’effet radical de "everything" sur l’ensemble du registre NPM révèle des failles dans le système open source NPM, affirme le contributeur PatrickJS sur GitHub, qui répond au pseudonyme gdi2290 sur le site NPM. PatrickJS, qui est à l'origine de cette farce, s'est excusé pour « toutes les difficultés causées par ce package » et a contacté les administrateurs de npm pour remédier au problème.

« Pour être clair, il s'agit d'un cas limite dans la politique de non-publication de NPM qui ne tient pas compte de '*' », a écrit PatrickJS sur GitHub, faisant référence au symbole étoile qui indique la dépendance d'un package sur toutes les versions d'un autre package. PatrickJS a suggéré que GitHub devrait permettre aux développeurs de dépublier un package si ses dépendances s'appuient sur des « versions étoiles », ou de désactiver complètement cette utilisation de « * ».

Voici une capture d'écran de la discussion GitHub désormais supprimée ci-dessous :

Nom : patrick.png
Affichages : 2608
Taille : 86,8 Ko

« Une autre chose à noter en discutant de ce fiasco, nous avons considéré que cela aurait pu être exploité pour des raisons bien plus malveillantes », a déclaré Boehs, un autre contributeur. « Disons que si quelqu'un télécharge accidentellement des informations sensibles, un acteur malveillant pourrait créer des packages pour les conserver. C’est bien qu’il ait été capturé de cette manière plutôt qu’après avoir été exploité dans la nature ».

Certains autres développeurs n’étaient pas convaincus, exprimant leur frustration et leur désapprobation sur le forum des problèmes du référentiel "everything".

Un utilisateur, Matt Lucock, a fustigé le groupe pour « négligence imprudente » et pour avoir blâmé NPM pour les retombées de son projet.

« Vous vous êtes trompés en croyant que le problème n'est pas que vous avez abusé du registre, mais que les règles de non-publication de npm ne résistent pas à quelqu'un qui abuse du registre de cette manière », a écrit Lucock, ajoutant que les règles de non-publication sont nécessaires pour « protéger l’intégrité du registre ».

Nicolas Ventura, ingénieur de centre de données au Lawrence Berkeley National Lab, a signalé que l'un de ses packages obsolètes était affecté par le problème de dépendance et a déclaré que même si le projet était « intéressant et humoristique », il a finalement causé des problèmes inutiles.

« Ce projet ressemble certainement à du spam et les milliers de sous-packages n'auraient pas dû être publiés dans le référentiel officiel NPM et ne font que causer du désordre », a écrit Ventura. « Je suis fasciné par le fait que NPM n'a ni signalé ni bloqué la publication d'aucun package, car de nombreux autres sites Web, comme les réseaux sociaux, ont des limites de publication ».

La réaction de GitHub

GitHub a déclaré mercredi que les perturbations liées au package "everything" et à ses dépendances à l'échelle du registre étaient en cours de résolution.

« Nous avons constaté que le projet violait les politiques d'utilisation acceptable de GitHub, qui interdisent les comportements qui perturbent de manière significative ou continue l'expérience des autres utilisateurs. Il a également été constaté qu'il violait le code de conduite npm », a déclaré la société. « Nous avons résolu le problème de dépendance, de sorte que les packages peuvent désormais être supprimés s'ils répondent à nos critères de non-publication, et nous travaillons à supprimer les packages du registre npm et de GitHub ».

Jeudi, le référentiel "everything" avait été supprimé de GitHub.

Ce n'est pas le premier package qui a brisé le système de dépendance de NPM

Lucock et Harush notent des cas précédents de développeurs publiant des packages NPM qui ont fait sensation en raison de la création de dépendances à l'échelle du registre.

En 2012, le package "hoarders", décrit par ses créateurs comme « le sac à main utilitaire le plus complet de node.js », a créé des dépendances pour l’ensemble des 20 000 modules publiés dans le registre NPM à l’époque. Le projet a subi des réactions négatives et a ensuite été révisé pour fonctionner sans créer de dépendances directes avec les utilitaires qu'il installe.

Plus récemment, en janvier 2023, un package appelé “no-one-left-behind” (personne laissé pour compte) est devenu dépendant de tous les autres packages du registre NPM. Le paquet a été supprimé par NPM, qui l'a étiqueté comme contenant du « code malveillant », bien que plus de 33 000 sous-paquets de “no-one-left-behind” aient continué d'exister, causant quelques difficultés.

Sources : NPM (1, 2), PatrickJS (discussion supprimée, lire dans le texte la capture d'écran), Jossef Harush

Et vous ?

Que pensez-vous de l’attitude des développeurs derrière le paquet “everything” ?
Quelles sont les conséquences potentielles d’un tel abus du registre NPM pour la sécurité et la performance des applications JavaScript ?
Comment GitHub et NPM devraient-ils réagir face à ce genre de situation ? Quelles mesures devraient-ils prendre pour éviter que cela ne se reproduise ?
Quel est votre avis sur l’utilisation des memes et de l’humour dans le développement open source ? Est-ce une forme de créativité ou de nuisance ?