Unsprezece rânduri de JavaScript au stricat internetul. O singură dezpublicare.
22 martie 2016, 21:30 UTC: un dezvoltator dezpublică toate cele 273 de pachete npm după ce npm predă numele pachetului "kik" către Kik, aplicația de mesagerie, al cărei agent de brevete promisese "avocați bătând la ușa ta".
22 martie 2016, 21:30 UTC: un dezvoltator dezpublică toate cele 273 de pachete npm după ce npm predă numele pachetului "kik" către Kik, aplicația de mesagerie, al cărei agent de brevete promisese "avocați bătând la ușa ta". Unul dintre cele 273 este left-pad: unsprezece rânduri care adaugă spații în fața unui șir de caractere, descărcat de 2,5 milioane de ori pe lună. În câteva minute, compilările Babel, React și Node eșuează la nivel mondial, sute pe minut. O furcă apare în zece minute și nu schimbă nimic, deoarece Babel trage left-pad prin numere de linie, care fixează exact 0.0.3. La 23:55 npm restaurează versiunea ștersă dintr-un backup — prima "dez-dez-publicare" din istoria registrului — și o săptămână mai târziu implementează regula de dezpublicare de 24 de ore. Postmortem, din propriul cont al npm și din firul de e-mail publicat de Kik: registrul care a permis oricărui autor să șteargă orice versiune fără verificare a dependențelor, arborele tranzitiv rezolvat live la fiecare instalare, fără fișier de blocare implicit. Vină Git: 60 npm / 25 Kik / 15 obișnuința dependenței. Verdict privind remedierea: SHIP IT.
Citiți ediția scrisă (engleză) ↗
Ce acoperă acest videoclip
- 11 martie: agentul de brevete al Kik îi cere lui Azer Koçulu să redenumească `kik`; o oră mai târziu: avocați "bătând la ușa ta și închizându-ți conturile"; Azer: 30.000$; Kik trimite e-mail la suportul npm
- 18-20 martie: CEO-ul npm transferă numele către Kik ("s-ar aștepta în mod rezonabil să fie legat de kik.com"); Azer cere ștergerea tuturor modulelor sale
- 22 martie, 21:30–23:55 UTC: 273 de pachete dezpublicate; [email protected] 404s în proiectele Babel, Atom, Node; furcă 1.0.0 la 21:42; CTO-ul npm trimite un tweet "dez-dez-publicare" la 23:03; 0.0.3 înapoi din backup la 23:55 — 2,5 ore
- 23 și 29 martie: postmortem-ul npm ("am dat-o în bară") și noua politică: dezpublicare doar în 24 de ore, substituenți de securitate pentru nume eliminate (72 h din 2020)
Transcrierea tradusă
Tradus din narațiunea originală în engleză. Audio-ul și subtitrările disponibile sunt controlate de YouTube.
0:00 Un dezvoltator șterge unsprezece rânduri de JavaScript, iar în câteva minute Babel, compilările React și Node eșuează la nivel mondial, sute pe minut. Funcția este left-pad. Ea completează un șir de caractere cu spații, iar până la sfârșitul serii npm face singurul lucru pe care spune că nu-l poate face: republică o versiune ștearsă. Cum se întâmplă, de ce este posibil și cine poartă vina. Acesta este The Daily Diff, postmortem. 11 martie. Un agent de brevete de la Kik, aplicația de mesagerie,
0:26 îi trimite un e-mail lui Azer Koçulu: redenumește-ți pachetul npm, kik este marca noastră. Azer spune nu. O oră mai târziu: avocații noștri de mărci înregistrate vor bate la ușa ta și îți vor închide conturile. Azer numește un preț, treizeci de mii de dolari, iar Kik trimite firul de discuție către suportul npm. 18 martie. CEO-ul npm decide că oricine tastează npm install kik se așteaptă la aplicația de mesagerie,
0:48 și predă numele. Azer cere ca tot ce îi aparține să fie șters. Două zile mai târziu o face singur: două sute șaptezeci și trei de pachete. 22 martie, 21:30 UTC. Fiecare compilare care apelează left-pad primește un 404. Zece minute mai târziu un străin o republică sub numele de 1.0.0, și nimic nu se schimbă, deoarece Babel și Atom o încarcă printr-un pachet numit line-numbers, care vrea exact 0.0.3.
1:13 La 23:03 CTO-ul npm tweetează: dez-dez-publicare. La 23:55, 0.0.3 revine dintr-un backup. Două ore și jumătate. De ce poate o singură persoană să facă asta? Trei motive. Orice versiune pe npm poate fi ștearsă de autorul său, instantaneu, fără verificare a dependențelor. În al doilea rând, dependențele sunt tranzitive: Babel nu știe că left-pad există, știe line-numbers, iar întregul arbore este rezolvat live la fiecare instalare.
1:36 În al treilea rând, în 2016 nimic nu fixează acel arbore implicit; fișierele de blocare sunt opt-in, așa că fiecare rulare CI re-întreabă internetul cum arată unsprezece rânduri de cod. Un registru, gestionat de nimeni care depinde de el. Git blame. npm, șaizeci la sută: propriul postmortem spune că dezpublicarea nerestricționată a cauzat durerea și, citez, am dat-o în bară. Kik, douăzeci și cinci: un agent de brevete, nu un avocat, promițând avocați la ușă pentru un nume pe care Kik decisese deja să nu-l folosească. Obișnuința dependenței, cincisprezece: toți cei care au instalat npm unsprezece rânduri în loc
2:06 să le tasteze. Inclusiv Kik, ale cărui compilări se strică și ele. Raza de impact: două sute șaptezeci și trei de pachete retrase, unul dintre ele descărcat de două milioane și jumătate de ori pe lună. Remedierea durează două ore și jumătate; funcția durează unsprezece rânduri. Pe Hacker News, o postare care întreabă dacă am uitat cum să programăm atinge șaptesprezece sute de puncte, în mare parte de la oameni ale căror compilări sunt încă roșii. Verdict, postmortem: SHIP IT.
2:26 npm restaurează din backup, postează postmortem-ul a doua zi, și în decurs de o săptămână implementează regula care încă este în vigoare: poți dezpublica timp de douăzeci și patru de ore, după aceea vorbești cu un om. Luni: comite-ți fișierul de blocare, și dacă o funcție are unsprezece rânduri, este un paragraf, nu o dependență. Trimite-mi incidentul despre care încă nu ai voie să vorbești, în comentarii, sau la the daily diff dot dev. Și asta e diferența pentru azi.
2:48 Sunt Niko de la Axrisi. Mergeți responsabil.
Surse
- 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



