Onze lignes de JavaScript ont mis internet en panne. Une dépublication.
22 mars 2016, 21h30 UTC : un développeur dépublie ses 273 packages npm après que npm a remis le nom de package "kik" à Kik, l'application de messagerie, dont l'agent en brevets avait promis "des avocats frappant à votre porte".
22 mars 2016, 21h30 UTC : un développeur dépublie ses 273 packages npm après que npm a remis le nom de package "kik" à Kik, l'application de messagerie, dont l'agent en brevets avait promis "des avocats frappant à votre porte". L'un des 273 est left-pad : onze lignes qui ajoutent des espaces devant une chaîne de caractères, téléchargé 2,5 millions de fois par mois. En quelques minutes, les compilations Babel, React et Node échouent dans le monde entier, des centaines par minute. Un fork apparaît en dix minutes et ne change rien, car Babel tire left-pad via line-numbers, qui épingle exactement 0.0.3. À 23h55, npm restaure la version supprimée à partir d'une sauvegarde – la première "dé-dépublication" dans l'histoire du registre – et une semaine plus tard, met en place la règle de dépublication de 24 heures. Post-mortem, d'après le propre récit de npm et le fil d'e-mails publié par Kik : le registre qui laissait tout auteur supprimer n'importe quelle version sans vérification des dépendants, l'arbre transitif résolu en direct à chaque installation, pas de lockfile par défaut. Git blame : 60 npm / 25 Kik / 15 l'habitude de la dépendance. Verdict sur la correction : SHIP IT.
Lire l'édition écrite (anglais) ↗
Ce que couvre cette vidéo
- 11 mars : l'agent en brevets de Kik demande à Azer Koçulu de renommer `kik` ; une heure plus tard : des avocats "frappant à votre porte et fermant vos comptes" ; Azer : 30 000 $ ; Kik envoie des e-mails au support npm
- 18–20 mars : le PDG de npm transfère le nom à Kik ("s'attendrait raisonnablement à ce qu'il soit lié à kik.com") ; Azer demande la suppression de tous ses modules
- 22 mars, 21h30–23h55 UTC : 273 packages dépubliés ; [email protected] renvoie 404 dans les projets Babel, Atom, Node ; fork 1.0.0 à 21h42 ; le CTO de npm tweete "un-un-publishing" à 23h03 ; 0.0.3 de retour de la sauvegarde à 23h55 — 2,5 heures
- 23 et 29 mars : le post-mortem de npm ("nous avons raté le coup") et la nouvelle politique : dépublication uniquement dans les 24 heures, placeurs de sécurité pour les noms supprimés (72 h depuis 2020)
Transcription traduite
Traduit de la narration originale en anglais. L'audio et les sous-titres disponibles sont gérés par YouTube.
0:00 Un développeur supprime onze lignes de JavaScript, et en quelques minutes Babel, les compilations React et Node échouent dans le monde entier, des centaines par minute. La fonction est left-pad. Elle complète une chaîne de caractères avec des espaces, et à la fin de la soirée npm fait la seule chose qu'il dit ne pas pouvoir faire : republier une version supprimée. Comment cela se passe, pourquoi c'est possible, et à qui la faute. Ceci est The Daily Diff, post-mortem. 11 mars. Un agent en brevets de Kik, l'application de messagerie,
0:26 envoie un e-mail à Azer Koçulu : renommez votre package npm, kik est notre marque. Azer dit non. Une heure plus tard : nos avocats spécialisés dans les marques vont frapper à votre porte et fermer vos comptes. Azer nomme un prix, trente mille dollars, et Kik transmet le fil au support de npm. 18 mars. Le PDG de npm décide que quiconque tapant npm install kik s'attend à l'application de messagerie,
0:48 et lui cède le nom. Azer demande que tout ce qui lui appartient soit supprimé. Deux jours plus tard, il le fait lui-même : deux cent soixante-treize packages. 22 mars, 21h30 UTC. Chaque compilation qui recherche left-pad reçoit un 404. Dix minutes plus tard, un inconnu le republie sous le nom de 1.0.0, et rien ne change, car Babel et Atom le chargent via un package appelé line-numbers, qui veut exactement 0.0.3.
1:13 À 23h03, le CTO de npm tweete : dé-dépublication. À 23h55, 0.0.3 est de retour d'une sauvegarde. Deux heures et demie. Pourquoi une seule personne peut-elle faire cela ? Trois raisons. Toute version sur npm peut être supprimée par son auteur, instantanément, sans vérification de ceux qui en dépendent. Deuxièmement, les dépendances sont transitives : Babel ne sait pas que left-pad existe, il connaît line-numbers, et l'arbre entier est résolu en direct à chaque installation.
1:36 Troisièmement, en 2016, rien n'épingle cet arbre par défaut ; les lockfiles sont optionnels, donc chaque exécution de CI redemande à internet à quoi ressemblent onze lignes de code. Un registre, géré par personne qui en dépend. Git blame. npm, soixante pour cent : son propre post-mortem dit que la dépublication illimitée a causé la douleur, et, je cite, nous avons raté le coup. Kik, vingt-cinq : un agent en brevets, pas un avocat, promettant des avocats à la porte pour un nom que Kik avait déjà décidé de ne pas utiliser. L'habitude de la dépendance, quinze : tous ceux qui ont installé onze lignes via npm au lieu
2:06 de les taper. Y compris Kik, dont les compilations échouent aussi. Rayon d'action : deux cent soixante-treize packages retirés, dont un téléchargé deux millions et demi de fois par mois. La correction prend deux heures et demie ; la fonction prend onze lignes. Sur Hacker News, un article demandant si nous avons oublié comment programmer atteint mille sept cents points, principalement de personnes dont les compilations sont toujours en rouge. Verdict, post-mortem : SHIP IT.
2:26 npm restaure à partir de la sauvegarde, publie le post-mortem le lendemain, et en une semaine met en place la règle qui est toujours en vigueur : vous pouvez dépublier pendant vingt-quatre heures, après cela vous parlez à un être humain. Lundi : commitez votre lockfile, et si une fonction fait onze lignes, c'est un paragraphe, pas une dépendance. Envoyez-moi l'incident dont vous n'avez toujours pas le droit de parler, dans les commentaires, ou à the daily diff dot dev. Et c'est le diff pour aujourd'hui.
2:48 Je suis Niko d'Axrisi. Fusionnez de manière responsable.
Sources
- npm, Inc., "kik, left-pad, and npm" (Mar 23, 2016)blog.npmjs.org
- npm, Inc., "changes to npm's unpublish policy" (Mar 29, 2016)blog.npmjs.org
- Azer Koçulu, "I've Just Liberated My Modules" (Mar 22, 2016; archive copy)web.archive.org
- Mike Roberts (Kik), "A discussion about the breaking of the Internet" — the full e-mail thread (Mar 23, 2016; archive copy)web.archive.org
- Laurie Voss (npm CTO) on X, Mar 22, 2016, 23:03 UTCx.com
- left-pad 0.0.3 on the npm registry (the eleven lines)registry.npmjs.org
- Hacker News, Mar 22, 2016 — "I've Just Liberated My Modules" (1,573 points)news.ycombinator.com
- Hacker News, Mar 23, 2016 — "NPM and Left-Pad: Have We Forgotten How to Program?" (1,725 points)news.ycombinator.com
- Hacker News, Mar 29, 2016 — "Changes to Npm's unpublish policy" (320 points)news.ycombinator.com
- The Register, Mar 23, 2016 — "How one developer just broke Node, Babel and thousands of projects in 11 lines of JavaScript"www.theregister.com



