+− THE DAILY DIFFdev & AI news
SHIP IT

Onze lignes de JavaScript ont mis Internet en panne. Une annulation de publication.

Le 22 mars 2016, à 21 h 30 UTC : un développeur annule la publication de l'ensemble de ses 273 paquets npm après que npm a remis le nom de paquet "kik" à Kik, l'application de messagerie, dont l'agent de brevets avait promis des "avocats qui cognent à votre porte".

Le 22 mars 2016, à 21 h 30 UTC : un développeur annule la publication de l'ensemble de ses 273 paquets npm après que npm a remis le nom de paquet "kik" à Kik, l'application de messagerie, dont l'agent de brevets avait promis des "avocats qui cognent à 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ées 2,5 millions de fois par mois. En quelques minutes, les builds de Babel, React et Node échouent dans le monde entier, à raison de centaines par minute. Une fourche apparaît en dix minutes et ne change rien, car Babel tire left-pad à travers line-numbers, qui épingle 0.0.3 exactement. À 23 h 55, npm restaure la version supprimée à partir d'une sauvegarde – la première "non-non-publication" dans l'histoire du registre – et une semaine plus tard, met en œuvre la règle de non-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 n'importe quel auteur supprimer n'importe quelle version sans vérification des dépendants, l'arbre transitif résolu en direct à chaque installation, pas de fichier de verrouillage par défaut. Attribué par Git : 60 npm / 25 Kik / 15 l'habitude de la dépendance. Verdict sur la solution : SHIP IT.

Lire l'édition écrite (anglais) ↗

Ce que cette vidéo couvre

  • 11 mars : L'agent de brevets de Kik demande à Azer Koçulu de renommer `kik`; une heure plus tard : des avocats "cognent à votre porte et ferment vos comptes"; Azer : 30 000 $; Kik envoie un courriel 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, 21 h 30 – 23 h 55 UTC : 273 paquets non publiés; [email protected] 404s dans les projets Babel, Atom, Node; fork 1.0.0 à 21 h 42; le CTO de npm tweete "un-un-publishing" à 23 h 03; 0.0.3 de retour de la sauvegarde à 23 h 55 — 2,5 heures
  • 23 et 29 mars : le post-mortem de npm ("nous avons manqué à nos devoirs") et la nouvelle politique : ne pas publier que dans les 24 heures, des 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 contrôlés par YouTube.

0:00 Un développeur supprime onze lignes de JavaScript, et en quelques minutes, Babel, les builds de React et Node échouent dans le monde entier, des centaines par minute. La fonction est left-pad. Elle ajoute des espaces à une chaîne, et à la fin de la soirée, npm fait la seule chose qu'elle dit ne pas pouvoir faire : republier une version supprimée. Comment cela se passe, pourquoi c'est possible, et qui est à blâmer. Ceci est The Daily Diff, post-mortem. 11 mars. Un agent de brevets de Kik, l'application de messagerie,

0:26 envoie un courriel à Azer Koçulu : renommez votre paquet npm, kik est notre marque. Azer dit non. Une heure plus tard : nos avocats spécialisés dans les marques vont venir frapper à votre porte et fermer vos comptes. Azer nomme un prix, trente mille dollars, et Kik transmet le fil de discussion à npm support. 18 mars. Le PDG de npm décide que quiconque tape 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 paquets. 22 mars, 21 h 30 UTC. Chaque build qui cherche left-pad reçoit un 404. Dix minutes plus tard, un étranger le republie sous le nom de 1.0.0, et rien ne change, car Babel et Atom le chargent via un paquet appelé line-numbers, qui veut exactement 0.0.3.

1:13 À 23 h 03, le CTO de npm tweete : un-un-publishing. À 23 h 55, 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 qui en dépend. 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 indique que l'annulation de publication illimitée a causé le problème, et, je cite, nous avons manqué à nos devoirs. Kik, vingt-cinq : un agent de 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 avec npm au lieu

2:06 de les taper. Y compris Kik, dont les builds échouent aussi. Rayon d'action : deux cent soixante-treize paquets retirés, l'un d'eux 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 builds sont encore en échec. 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 annuler la publication pendant vingt-quatre heures, après cela, vous parlez à un humain. Lundi : engagez votre lockfile, et si une fonction fait onze lignes, c'est un paragraphe, pas une dépendance. Envoyez-moi l'incident dont vous n'êtes toujours pas autorisé à 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. Fusionner de manière responsable.

Sources

  1. npm, Inc., "kik, left-pad, and npm" (Mar 23, 2016)blog.npmjs.org
  2. npm, Inc., "changes to npm's unpublish policy" (Mar 29, 2016)blog.npmjs.org
  3. Azer Koçulu, "I've Just Liberated My Modules" (Mar 22, 2016; archive copy)web.archive.org
  4. Mike Roberts (Kik), "A discussion about the breaking of the Internet" — the full e-mail thread (Mar 23, 2016; archive copy)web.archive.org
  5. Laurie Voss (npm CTO) on X, Mar 22, 2016, 23:03 UTCx.com
  6. left-pad 0.0.3 on the npm registry (the eleven lines)registry.npmjs.org
  7. Hacker News, Mar 22, 2016 — "I've Just Liberated My Modules" (1,573 points)news.ycombinator.com
  8. Hacker News, Mar 23, 2016 — "NPM and Left-Pad: Have We Forgotten How to Program?" (1,725 points)news.ycombinator.com
  9. Hacker News, Mar 29, 2016 — "Changes to Npm's unpublish policy" (320 points)news.ycombinator.com
  10. The Register, Mar 23, 2016 — "How one developer just broke Node, Babel and thousands of projects in 11 lines of JavaScript"www.theregister.com

Vidéos similaires