Рассказ о том, как я майню эфир через meltdown на ваших телефонах при помощи npm

Оригинал поста на хабре

Предисловие от переводчика

Пока вы не добрались до содержимого статьи, советую отложить её, отвести взгляд от монитора, и подумать на тему того, как же это происходит. Как всегда, всё гениальное просто. Ответ на поверхности. Подумали? Тогда читайте дальше. Ну что же, вот вам корректный ответ. Никак. Это ложь. Точно так же, как ложью является заголовок и содержимое недавно переведённой у нас статьи “Рассказ о том, как я ворую номера кредиток и пароли у посетителей ваших сайтов”.

Мне казалось очевидным, что это некая небольшая фантазия с лёгким привкусом security awareness, но, кажется, очень многие восприняли её всерьёз, и мне неприятно опять видеть, как из сообщества npm делают груши для битья, не вникая в контекст - так же, как это было, например, после прекрасной статьи “Node.js - раковая опухоль”, или выдранного куска из интервью Райана про то, что ему теперь нравится Go.

Не знаю, намеренно или случайно, но автор написал фантазию по хайповой теме, которую многие приняли за чистую монету. Знаю, что спорить с переводом довольно глупо, но этот перевод стучится ко мне по всем каналам. Так что отвечу ему другим переводом. Поехали.

Пугает безопасность npm? Не поддавайтесь панике!

Так вы тоже в панике по поводу безопасности npm по причине недавних постов? В особенности из-за этого: “Рассказ о том, как я ворую номера кредиток и пароли у посетителей ваших сайтов”. Ну что я хочу вам сказать. В лучшем случае, это троллинговый пост. Давайте расскажу, почему. Почему это глупо, некорректно, выставляет в плохом свете npmjs и поднимает панику на пустом месте.

В начале текста автор описывает свой страшный javascript код, который можно встроить на сайт, чтобы он воровал данные. Автор понимает, что, чтобы получить чужие данные, нужно распространить свой код на другие сайты. Он выбирает для этого npm. Ничего нового и удивительного. Кто угодно может запушить троян куда угодно - в npmjs, python registry и так далее.

Однако, тот факт, что ваш пакет где-то опубликован, ещё не ничего не значит - так же, как, например, если бы вы сделали веб сайт, на который не заходят люди. Так что дальше возникает вопрос - как внедрить троян при помощи самих владельцев сайта? Автор понимает, что это является основной проблемой, и решает её при помощи создания пул реквестов на github, где добавляет свой пакет в зависимости проекта.

Вот и всё. Вот и весь хак. Всё содержание текста сводится к этой идее. Никакой магии. Ни удалённого выполнения кода на серверах npmjs. Ни удалённых эксплойтов. Ни meltdown или zero day уязвимостей. Ни звонка в поддержку npmjs и нашёптывания 2600hz в ушко поддержки.

Давайте-ка я повторю ещё раз

Автор смог распространить свой троян, убедив разработчиков использовать его в качестве зависимости. Офигительно. Дайте-ка я сяду, расслаблюсь и мы рассмотрим этот инновационный вектор атаки.

Без сомнения, для проворачивания такого трюка автор должен быть одарён просто потрясающими умениями социального инжиниринга, так что я могу только отступить и порекомендовать ему пару планов:

  • Рассмотреть карьеру в продажах или инвестициях, поскольку автор довёл до совершенства своё умение кратких презентаций.
  • Пообщаться с Кевином Митником и совершить ограбление века.
Каким боком здесь npm? Честно говоря, я без понятия. Совершенно не понимаю, зачем кто-то сеет панику в нашем Javascript сообществе. Почему npm явился козлом отпущения? Проблема не в нём. Вернее, там безусловно есть свои проблемы, но с данным рассказом они никак не связаны.

Примечание переводчика: здесь я опустил не совсем удачные аналогии и объяснение на пальцах, почему половина рассказа про воровство паролей это бред сивой кобылы.

Мы вообще понимаем, что работаем в open source?

Сейчас я говорю о всех нас - вы понимаете, что работаете в opensource сообществе? И что это означает? Open source пострен на доверии. На сообществе, на коммуникациях - это основные ценности, которые делают сообщество невероятным, и за которые я его люблю.

Могут ли в open source проекте быть уязвимости? Да. Могут ли в open source проекте быть проблемы с производительностью, из-за которых кто-то потеряет миллионы на новый год? Да.

Эрик Раймон красиво описал ситуацию, когда обсуждалась уязвимость open source: “чем больше глаз, тем меньше багов” - или, более формально, “при достаточном количестве бета-тестеров и сотрудников почти любая проблема будет быстро обнаружена и окажется для кого-то очевидной”.

Когда принимаешь open source, ты принимаешь и риски, который он приносит. Будь это плохой, зловредный или заброшенный код. Так прими же эту ответственность. Ты должен проверять пакеты, которые ты ставишь с npm - npm это всего лишь сервисное звено доставки кода.

Эпилог

Я понимаю, что тот пост был пародийным, но реакция и комментарии показали, что люди восприняли его слишком серьёзно - вплоть до паники. И должен честно сказать, что меня очень сильно огорчило, какое влияние эта статья оказала на имя npm и вопросы безопасности в целом.

Сам я активно занимаюсь компьютерной безопасностью, участвую в Node.JS OWASP проекте, говорю о безопасности в Node.JS на международных конференциях, и так далее. Почему я об этом сейчас говорю? Чтобы показать, что я только за повышение осведомлённости об опасности веб приложений. Но мне грустно смотреть, как из npm и сообщества делают грушу для битья без всякой на то причины.

Не знаю лично Дэвида Гилбертсона, автора оригинальной статьи , но отношусь к нему со всем уважением, и я уверен, что у него не было никаких плохих намерений, и его рассказ это чистый вымысел. Однако я считаю, что мы можем немножко больше верить в интеллект читателей и рассказывать им об опасностях без подобных страшилок. Вместо паники, лучше конструктивно дискутировать по поводу того, как мы можем что-то улучшить.

Послесловие от переводчика

Помимо упомянутых автором аналогов npm в других языках, ещё есть maven, нюгет, composer, есть тысячи фреймворков со своими плагинами и темами, и так далее (если интересно, могу рассказать, как появился вредоносный код в моём wordpress плагине wp-invites, например). В конце концов, есть гитхаб, с которого напрямую можно ставить пакеты в кучу языков - однако никто не не обвиняет гитхаб в том, что там можно опубликовать вредоносный код!

А пинков почему-то достаётся npm. Причём просто тупых и бессмысленных пинков безо всякой морали, выводов и предложений. Ещё и по причине выдуманной истории. Я, как и автор оригинальной статьи, не хочу сказать, что всё прекрасно, и что нет никаких поводов для беспокойства. Всё сломано. Даже наши чёртовы процессоры.

Но не надо устраивать бессмысленную панику. Вы можете починить что-нибудь прямо сейчас. Или написать инструмент для поиска бэкдоров в нпм пакетах (ещё один). Или хотя бы отрепортить баг. Или скинуть пожертвование разработчику. Или внедрить локи и ревью пакетов в своей компании. А можете ныть про ужасный npm. Выбор за вами.