+− THE DAILY DIFFdev & AI news
SHIP IT

Одинадцять рядків 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. Зливайте відповідально.

Джерела

  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

Пов'язані відео

postmortem · uk · 15 вер. 2026 р.

Крейт Rust запустив шкідливе програмне забезпечення під час компіляції. 86 хвилин.

Крейт Rust із чотирма макросами та 260 мільйонами завантажень додає одну залежність, а `cargo build` запускає бінарний файл незнайомця на вашій машині. 20 серпня 2026 року: arrayref 0.3.10 з'являється

3:09 ↗
postmortem · uk · 25 вер. 2026 р.

Мільйонна частка секунди зупинила авіатрафік Великої Британії. Шість годин.

О 10:00 у вівторок, 8 вересня, один звичайний запит коду транспондера в Національній системі повітряного простору (NAS) NATS переривається повідомленням з вищим пріоритетом, доки він частково оновлює

3:06 ↗
postmortem · uk · 22 вер. 2026 р.

Перезавантаження відкинуло Telstra у 2006 рік. Дев'ять мільйонів телефонів.

Інженер у Мельбурні о 2:50 ночі знову вмикає шасі синхронізації, і до сніданку найбільша мобільна мережа Австралії погоджується, що зараз листопад 2006 року. 8 липня 2026 року: GPS-карта в шасі NTP Te

3:15 ↗