Очень популярный пакет NPM event-stream, который предоставляет ряд хелперов для работы с потоками внутри нод-приложения, был изменен для включения вредоносного ПО, которое ворует криптомонеты. Атака нацелена на приложение Copay Bitcoin Wallet.

Как это произошло?

Очень популярный пакет event-stream, который загружают около 2 миллионов раз в неделю, не находился в активной разработке уже пару лет. Автор пакета dominictarr ведет большое количество проектов, и в последнее время этот пакет не привлекал особого внимания.

Где-то в начале сентября пользователь GitHub с ником right9ctrl предложил помощь в поддержке этого пакета. Владелец dominictarr согласился и дал right9ctrl права доступа как к GitHub, так и к NPM, не зная о плохих намерениях этого пользователя.

Когда right9ctrl начал вносить свой вклад в пакет, сначала были небольшие коммиты для некоторых обновлений и исправлений. После этого последовала новая версия (v3.3.4 => v3.3.5), ничего особенного. Затем, 9 сентября, была введена служебная функция с использованием новой зависимости flatmap-stream, и версия была увеличена до версии 3.3.6. Эта новая зависимость была удалена через неделю, 16 сентября, а функциональность плоской карты была реализована непосредственно в пакете. Все еще ничего особенного, чтобы добавить новую зависимость и через несколько дней решить реализовать код самостоятельно.

Но на самом деле это было прикрытием, потому что опубликованная версия NPM v3.3.6 все еще содержала вредоносный пакет flatmap-stream, в то время как вы не могли обнаружить его в последней версии исходного кода на GitHub.

Семантическое управление версиями

Поскольку пакет event-stream некоторое время находился в версии 3.3.4, эта версия уже будет включена во многие приложения и библиотеки, например:

"dependencies": { 
    "event-stream": "^3.3.4", 
    ... 
}

Это означает, что если вы нажмете патч semver или дополнительный номер версии, новая установка пакета будет искать самую последнюю версию, которая попадает в указанный диапазон версий. Поэтому, когда вы делаете npm install в чистой папке проекта или на сервере сборки, вы получите event-stream v3.3.6 вместо v3.3.4. Потому что это то, что вы обычно хотите, исправления и улучшения без серьезных изменений.

Атака

Итак, с небольшими изменениями в очень популярной библиотеке event-stream right9ctrl удалось внедрить вредоносный пакет flatmap-stream в миллионы других приложений.

Когда вы впервые смотрите на пакет flatmap-stream, кажется, что в нем нет ничего плохого. Он реализует плоскую карту для потоков, как говорится. Но странность в том, что у него всего 1 участник, почти нет загрузок на NPM, и он был создан как раз перед включением в event-stream.

И настоящая проблема в том, что уменьшенная версия исходного кода не является фактическим исходным кодом. Минимизированный файл содержит дополнительный код. Fallingsnow разминифицировал код и обнаружил, что там происходит на самом деле.

Скрытые и зашифрованные

Для дополнительного минимизированного кода требуется файл ./test/data.js, содержащий массив строк, зашифрованных с помощью AES256. Он расшифровывает содержимое ./test/data.js, используя npm_package_description в качестве ключа AES256, и пытается выполнить результат. Этот npm_package_description на самом деле является переменной среды, устанавливаемой NPM при установке модулей в дереве зависимостей основного приложения.

Итак, поскольку описание пакета является ключом к расшифровке вредоносного кода, должно существовать приложение, на которое нацелен злоумышленник. Перечисление всех пакетов в NPM, использующих event-stream, и попытка расшифровки кода методом грубой силы показывают, что приложение с описанием "A Secure Bitcoin Wallet" является целью. Это приложение Bitcoin Wallet с открытым исходным кодом Copay.

Что оно делает

Когда разработчики/сервер сборки Copay запускают сценарий сборки, сгенерированный код модифицируется перед включением в приложение. Инъекция была разработана для сбора сведений об учетной записи и закрытых ключей со счетов, имеющих баланс более 100 биткойнов или 1000 биткойнов наличными.

Для любого другого приложения расшифровка вредоносного кода завершится ошибкой, ошибка будет обработана молча, и ничего не произойдет.

Защити себя

Хотя эта атака нацелена на пользователей Copay Bitcoin Wallet, вы действительно не хотите использовать этот вредоносный код в каком-либо другом приложении. Это то, что вы можете сделать.

Пользователи с доплатой

Bitpay указывает "If you are using any version from 5.0.2 to 5.1.0, you should not run or open the Copay app" в выпуске № 9346 в своем исходном репозитории.

  • убедитесь, что вы не используете уязвимые версии Copay, и установите обновление для системы безопасности v5.2.0.
  • создать новый кошелек в новой версии Copay
  • перевести все средства со старых кошельков на новый с помощью функции Отправить макс.

Разработчики

Если вы используете event-stream в своем собственном приложении, убедитесь, что вы не используете обновленную и вредоносную версию 3.3.6. Сначала очистите папку node_modules, затем прикрепите пакет к версии 3.3.4 следующим образом:

"dependencies": { 
    "event-stream": "3.3.4", 
    ... 
}

То есть номер версии без префикса каретки (^) или тильды (~). И, наконец, вы можете снова восстановить пакеты с помощью npm install.

Ну наконец то

Эта атака была очень умной. Трудно найти такие вещи, проскальзывающие в ваш собственный код. Но чтобы уменьшить воздействие, убедитесь, что вы придерживаетесь популярных и хорошо поддерживаемых пакетов.

  • вам действительно нужен пакет, или вы можете написать его самостоятельно в несколько десятков строк?
  • у него много загрузок на NPM?
  • выглядит ли репозиторий GitHub в хорошем состоянии и активен?
  • есть несколько сопровождающих?
  • пакет был недавно обновлен?

И всегда убедитесь, что вы знаете, что работает в вашей кодовой базе.

Первоначально опубликовано на www.osmondvanhemert.nl.