Одиннадцать строк 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 через номера строк, что точно закрепляет версию 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 году по умолчанию ничто не закрепляет это дерево; lockfile'ы необязательны, поэтому каждый запуск CI снова спрашивает интернет, как выглядят одиннадцать строк кода. Один реестр, которым никто не управляет, кто от него зависит. git blame. npm, шестьдесят процентов: его собственный постмортем говорит, что неограниченное удаление публикации вызвало боль, и, цитирую, мы облажались. Kik, двадцать пять: патентный агент, а не юрист, обещающий адвокатов у дверей из-за имени, которое Kik уже решил не использовать. Привычка к зависимостям, пятнадцать: все, кто npm-установил одиннадцать строк вместо
2:06 их набора. Включая Kik, чьи сборки также ломаются. Радиус поражения: двести семьдесят три пакета удалены, один из них загружается два с половиной миллиона раз в месяц. Исправление занимает два с половиной часа; функция занимает одиннадцать строк. На Hacker News пост с вопросом, забыли ли мы, как программировать, набирает тысячу семьсот очков, в основном от людей, чьи сборки все еще красные. Вердикт, постмортем: SHIP IT.
2:26 npm восстанавливается из резервной копии, публикует постмортем на следующий день, и в течение недели вводит правило, которое действует до сих пор: вы можете отменить публикацию в течение двадцати четырех часов, после этого вы общаетесь с человеком. Понедельник: зафиксируйте свой lockfile, и если функция составляет одиннадцать строк, это абзац, а не зависимость. Присылайте мне инцидент, о котором вам до сих пор не разрешено говорить, в комментариях или на daily diff dot dev. И это все на сегодня.
2:48 Я Нико из Axrisi. Merge responsibly.
Источники
- 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



