Найти в Дзене

🎯 Безопасность в npm: хитрые приёмы злоумышленников и как защититься

Кажется, всё было так спокойно. Обычный будний день разработчика JavaScript: кофе на столе, код в редакторе, пакеты с npm скачиваются привычными движениями. Но вдруг оказалось, что в этой привычной простоте скрывается опасность — совсем недавно эксперты из ReversingLabs обнаружили крайне изощрённую атаку, реализованную через известный репозиторий пакетов npm. Вирусная кампания, названная исследователями «ethers-provider2», на первый взгляд была максимально простой и привычной. Два пакета — ethers-provider2 и ethers-providerz — казались копиями популярного ssh-клиента ssh2 (350 млн скачиваний на npm). Но, как это бывает в хорошем триллере, самое страшное оказалось спрятано глубоко внутри... Злоумышленники использовали подход, который раньше на npm встречался редко. Суть атаки состояла в том, чтобы заражать не сами скачанные пользователями пакеты, а модифицировать другие, уже установленные и широко используемые библиотеки. В данном случае целевой стала популярная библиотека ethers. Атака
Оглавление

Кажется, всё было так спокойно. Обычный будний день разработчика JavaScript: кофе на столе, код в редакторе, пакеты с npm скачиваются привычными движениями. Но вдруг оказалось, что в этой привычной простоте скрывается опасность — совсем недавно эксперты из ReversingLabs обнаружили крайне изощрённую атаку, реализованную через известный репозиторий пакетов npm.

Вирусная кампания, названная исследователями «ethers-provider2», на первый взгляд была максимально простой и привычной. Два пакета — ethers-provider2 и ethers-providerz — казались копиями популярного ssh-клиента ssh2 (350 млн скачиваний на npm). Но, как это бывает в хорошем триллере, самое страшное оказалось спрятано глубоко внутри...

🎭 Сценарий атаки: невидимая рука npm

Злоумышленники использовали подход, который раньше на npm встречался редко. Суть атаки состояла в том, чтобы заражать не сами скачанные пользователями пакеты, а модифицировать другие, уже установленные и широко используемые библиотеки. В данном случае целевой стала популярная библиотека ethers.

Атака проходила в несколько этапов:

🧩 Этап первый:
Злоумышленники публикуют пакет ethers-provider2, который при установке ведёт себя как обычный пакет ssh2, но дополнительно загружает и исполняет скрытый JavaScript-скрипт с сервера хакеров.

🕵️ Этап второй:
Скрытый скрипт запускает цикл, постоянно проверяя, установлен ли пакет ethers. Как только он обнаружен, вирус перезаписывает один из его файлов (provider-jsonrpc.js), внедряя туда вредоносный код, который загружает и запускает третий этап атаки.

🚨 Этап третий:
Финальный этап атаки — запуск реверсного шелла. Теперь сервер атакующего получает полный доступ к заражённому компьютеру и может удалённо выполнять любые команды от имени пользователя.

📌 Коварство этого метода в том, что даже удаление первоначального вредоносного пакета не избавляет от угрозы — ведь заражён остаётся легальный пакет ethers, который продолжит обеспечивать злоумышленникам доступ к системе.

🛠️ Чем это опасно?

Сложность такого подхода в том, что разработчики могут долго не замечать заражения, поскольку используемый пакет выглядит совершенно нормальным и корректно работает. Пока в один день не обнаружится, что кто-то неизвестный получил доступ ко всей инфраструктуре компании.

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

🔍 ethers-providerz
🔍
reproduction-hardhat

Последний пакет был особенно интересным: он имитировал тестовый инструмент для Ethereum-разработчиков, однако внутри также содержал скрытый код, обеспечивающий доступ по реверсному шеллу.

🛡️ Как защититься?

Чтобы избежать подобных атак, следует придерживаться простых, но эффективных правил безопасности:

Проверяйте зависимости:
Используйте утилиты автоматической проверки npm-пакетов (например, Snyk, Dependabot и RL Spectra). Это поможет оперативно обнаруживать и удалять вредоносные компоненты.

Отдавайте предпочтение известным пакетам:
Чем больше у пакета пользователей и положительных отзывов, тем сложнее незаметно внедрить туда вредоносный код.

Обновляйте зависимости:
Регулярное обновление пакетов позволяет быстро закрывать обнаруженные уязвимости.

Используйте статический анализ:
Установите YARA-правила, представленные экспертами ReversingLabs, которые помогают выявлять подозрительные изменения в уже установленных библиотеках.

📜 Пример YARA-правила от ReversingLabs:

rule npm_Downloader_InjectedMaliciousCode
{
meta:
author = "ReversingLabs"
category = "MALWARE"
description = "Detects malicious payload in locally installed ethers package."

strings:
$decode_payload_url = "atob(atob(\"YUhSMGNEb3ZMelV1TVRrNUxqRTJOaTR4T2pNeE16TTNMMk52Ym1acFp3PT0=\"))"
$fetch_payload = "fetch("
$execute_payload = "eval("

condition:
all of them
}

🎯 Личное мнение:
На мой взгляд, данная атака подчеркивает необходимость пересмотра подходов к безопасности поставки ПО. npm — удивительно удобный и мощный инструмент, но его открытость одновременно является и слабым звеном, которое регулярно пытаются использовать злоумышленники. Возможно, пришло время задуматься о переходе на более контролируемые реестры пакетов или усилении проверки кода перед установкой.

🌐 Источник новости и дополнительная информация:
Malware found on NPM infecting local package with reverse shell