Одинадцять рядків JavaScript зламали інтернет. Одне скасування публікації.
22 березня 2016 року, 21:30 UTC: розробник скасовує публікацію всіх 273 своїх пакетів npm після того, як npm передає назву пакету «kik» компанії Kik, додатку для обміну повідомленнями, патентний повірений якої обіцяв «юристів, які стукають у ваші двері».
22 березня 2016 року, 21:30 UTC: розробник скасовує публікацію всіх 273 своїх пакетів npm після того, як npm передає назву пакету «kik» компанії Kik, додатку для обміну повідомленнями, патентний повірений якої обіцяв «юристів, які стукають у ваші двері». Одним із 273 є left-pad: одинадцять рядків, які додають пробіли перед рядком, завантажуються 2,5 мільйона разів на місяць. За лічені хвилини збірки Babel, React і Node зазнають невдачі в усьому світі, сотні за хвилину. Форк з'являється за десять хвилин і нічого не змінює, оскільки Babel підтягує left-pad через line-numbers, що точно фіксує 0.0.3. О 23:55 npm відновлює видалену версію з резервної копії — перше «скасування скасування публікації» в історії реєстру — і через тиждень запроваджує правило скасування публікації протягом 24 годин. Після аварії, за власним розповіддю npm та опублікованим Kik електронним листуванням: реєстр, який дозволяв будь-якому автору видаляти будь-яку версію без перевірки залежностей, транзитивне дерево розгорталося в реальному часі при кожній установці, без lockfile за замовчуванням. Git blame: 60 npm / 25 Kik / 15 звичка до залежностей. Вирок щодо виправлення: SHIP IT.
Читати письмову версію (англійською) ↗
Що охоплює це відео
- 11 березня: патентний повірений Kik просить Азера Кочулу перейменувати `kik`; година потому: юристи «стукають у ваші двері і закривають ваші рахунки»; Азер: 30 000 доларів; Kik надсилає електронні листи до служби підтримки npm
- 18–20 березня: генеральний директор npm передає назву Kik («цілком логічно очікувати, що вона пов'язана з kik.com»); Азер просить видалити всі його модулі
- 22 березня, 21:30–23:55 UTC: 273 пакети скасовано; left-pad@0.0.3 404 у проектах Babel, Atom, Node; форк 1.0.0 о 21:42; технічний директор npm твітує «un-un-publishing» о 23:03; 0.0.3 повернуто з резервної копії о 23:55 — 2,5 години
- 23 та 29 березня: післяаварійний аналіз npm («ми проґавили») та нова політика: скасування публікації лише протягом 24 годин, безпечні заповнювачі для видалених назв (72 години з 2020 року)
Перекладена стенограма
Перекладено з оригінальної англійської розповіді. Доступне аудіо та субтитри контролюються YouTube.
0:00 Один розробник видаляє одинадцять рядків JavaScript, і за лічені хвилини Babel, збірки React і Node не працюють по всьому світу, сотні за хвилину. Функція left-pad. Вона додає пробіли до рядка, і до кінця вечора npm робить те, що, за його словами, він не може зробити: повторно публікує видалену версію. Як це відбувається, чому це можливо, і хто винен. Це The Daily Diff, посмертний аналіз. 11 березня. Патентний повірений Kik, програми для обміну повідомленнями,
0:26 надсилає електронний лист Азеру Кочулу: перейменуйте ваш пакет npm, kik — наш бренд. Азер каже ні. Через годину: наші адвокати з питань торгових марок будуть стукати у ваші двері та закривати ваші рахунки. Азер називає ціну, тридцять тисяч доларів, і Kik пересилає переписку до служби підтримки npm. 18 березня. Генеральний директор npm постановляє, що кожен, хто вводить npm install kik, очікує додаток
0:48 для обміну повідомленнями, і передає назву. Азер просить видалити все його. Через два дні він робить це сам: двісті сімдесят три пакети. 22 березня, 21:30 UTC. Кожна збірка, яка звертається до left-pad, отримує 404. Через десять хвилин незнайомець перевидає її як 1.0.0, і нічого не змінюється, тому що Babel і Atom завантажують її через пакет під назвою line-numbers, який вимагає саме 0.0.3.
1:13 О 23:03 технічний директор npm твітує: un-un-publishing. О 23:55, 0.0.3 повертається з резервної копії. Дві з половиною години. Чому одна людина може це зробити? Три причини. Будь-яка версія на npm може бути видалена її автором, миттєво, без перевірки того, хто від неї залежить. По-друге, залежності є транзитивними: Babel не знає, що left-pad існує, він знає line-numbers, і все дерево розгортається в реальному часі при кожній установці.
1:36 По-третє, у 2016 році ніщо не фіксує це дерево за замовчуванням; lockfiles є opt-in, тому кожен запуск CI перепитує інтернет, як виглядають одинадцять рядків коду. Один реєстр, яким керує ніхто, хто від нього залежить. git blame. npm, шістдесят відсотків: його власний посмертний аналіз говорить, що необмежене скасування публікації спричинило біль, і, цитата, ми проґавили. Kik, двадцять п'ять: патентний повірений, а не юрист, обіцяючи юристів біля дверей через назву, яку Kik вже вирішив не використовувати. Звичка до залежностей, п'ятнадцять: кожен, хто npm-встановив одинадцять рядків замість
2:06 того, щоб їх надрукувати. Включаючи Kik, чиї збірки також ламаються. Радіус ураження: двісті сімдесят три пакети вилучено, один з них завантажується два з половиною мільйона разів на місяць. Виправлення займає дві з половиною години; функція займає одинадцять рядків. На Hacker News, допис, який запитує, чи ми забули, як програмувати, набирає сімнадцять сотень балів, здебільшого від людей, чиї збірки все ще червоні. Вирок, посмертний аналіз: SHIP IT.
2:26 npm відновлює з резервної копії, публікує посмертний аналіз наступного дня, і протягом тижня запроваджує правило, яке досі діє: ви можете скасувати публікацію протягом двадцяти чотирьох годин, після цього ви спілкуєтеся з людиною. Понеділок: зафіксуйте свій lockfile, і якщо функція має одинадцять рядків, це абзац, а не залежність. Надішліть мені інцидент, про який вам досі не дозволено говорити, у коментарях, або на the daily diff dot dev. І це diff на сьогодні.
2:48 Я Ніко з Axrisi. Зливайте відповідально.
Джерела
- 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



