Очень популярный пакет 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.