Для того, чтобы поставить на колени популярный пакетный менеджер и сделать невозможной установку тысяч модулей, хватило одиннадцати строчек Javascript. И не каких-то особенных или интересных строчек. Источником проблемы, которая затронула тысячи разработчиков, оказалась совершенно тривиальная функция для форматирования строк.
Герой этой истории — оклендский программист по имени Азер Кочулу, разработавший и опубликовавший более 250 модулей и утилит с открытыми исходниками. Несколько дней назад с ним связался юрист компании Kik и попросил переименовать утилиту kik, которую Кочулу распространял через пакетный менеджер npm.
Компания Kik занимается разработкой одноимённого мессенджера для мобильных телефонов. В декабре этот мессенджер насчитывал 240 миллионов зарегистрированных пользователей. Компания утверждает, что им пользуются более 40% жителей США в возрасте от 13 до 19 лет.
Кочулу не стал переименовывать свой проект, но юрист Kik не сдавался. Он вежливо пояснил, что Kik — это зарегистрированная торговая марка, и закон обязывает компанию защищать её. «У нас нет выбора, потому что либо мы будем защищать торговую марку, либо лишимся её», - написал он программисту. В ответ Кочулу дал юристу нецензурную рекомендацию и прекратил разговор.
Следующее письмо получил уже не он, а руководство компании, которая поддерживает работу npm. Администраторы npm попытались найти компромисс, но Кочулу не поддавался. Когда все методы были исчерпаны, они переименовали модуль kik без разрешения автора.
Кочулу был взбешён. «Эта ситуация заставила меня осознать, что npm — частное пространство, где корпорации сильнее людей, — заявил он через Medium, — а я занимаюсь открытыми исходниками потому, что власть должна принадлежать людям». С этими словами программист убрал из npm 272 пакета, которые он опубликовал.
Последствия оказались неожиданно значительными. «Во вторник, 22 марта около 14:30 по тихоокеанскому стандартному времени, мы стали фиксировать сотни ошибок в минуту, вызванных тем, что зависимые от этих модулей проекты, а за ними — зависимые от зависимых и так далее, не могли установить удалённые пакеты», — описывали развитие событий администраторы npm.
Больше всего ошибок вызвало исчезновение модуля left-pad — простенькой функции на Javascript, которая заполняет левую часть строки нулями или пробелами. Вот она.
Эта функция использовалась во множестве проектов, включая Babel и сам Node. В течение месяца модуль left-pad устанавливали миллионы раз. Когда Кочулу удалил его, все проекты, в зависимостях которых значился left-pad, перестали устанавливаться. За ними последовали проекты, зависимые не от самого left-pad, а от одного из других проектов, который от него зависит.
Через десять минут после начала вакханалии кто-то опубликовал в npm копию left-pad, но для полного устранения последствий происшествия потребовалось ещё два с половиной часа.
Никто не ожидал, что инструменты, которые ежедневно используют тысячи разработчиков и компаний, окажутся настолько хрупкими. Администраторы npm объявили о необходимости внесения изменений в работу пакетного менеджера. Чтобы подобная ситуация не повторилась, они планируют усложнить удаление пакетов без которых не будут устанавливаться другие.