Популярный пакет npm «is» взломан в рамках масштабной атаки на цепочку поставок

information security

Очередная волна фишинговой кампании против разработчиков npm продолжает набирать обороты. На этот раз злоумышленники скомпрометировали популярный пакет is, который используется для проверки типов данных в JavaScript и еженедельно скачивается более 2,8 миллиона раз. Вредоносные версии 3.3.1 и 5.0.0 содержат скрытый JavaScript-код, который предоставляет хакерам удаленный доступ к системам разработчиков.

Описание

Атака началась с фишинговой кампании, о которой стало известно на прошлой неделе. Первоначально злоумышленники использовали домен npnjs[.]com, имитирующий официальный npmjs.org, а также рассылали поддельные письма с этого домена. Из-за отсутствия настроек DMARC и SPF на npmjs.org почтовые сервисы не могли корректно проверить подлинность писем, что позволило мошенникам беспрепятственно распространять фишинговые сообщения.

Следующим этапом атаки стало использование украденных учетных данных разработчиков npm. Взломав аккаунты поддерживающих, злоумышленники опубликовали вредоносные версии нескольких популярных пакетов, включая eslint-config-prettier, eslint-plugin-prettier, synckit, @pkgr/core, napi-postinstall, got-fetch и is. Эти обновления автоматически распространились через механизмы управления зависимостями, что привело к заражению как локальных машин разработчиков, так и CI/CD-систем.

Как выяснили исследователи из Humpty’s RE Blog, пакет eslint-config-prettier содержал вредоносную DLL node-gyp.dll, которая загружает сложный инфостилер под названием Scavenger. Этот троян использует техники антианализа, косвенные системные вызовы и шифрованную связь с командным сервером (C2). Основной целью злоумышленников являются данные браузеров, включая расширения Chrome и кешированные сессии.

В отличие от Windows-ориентированного Scavenger, скомпрометированный пакет is работает на всех платформах (macOS, Linux, Windows) и реализует другой механизм заражения. Встроенный JavaScript-загрузчик использует сложную обфускацию и динамически декодирует вредоносный код в памяти, избегая записи на диск. После активации скрипт собирает системную информацию (имя хоста, ОС, CPU) и переменные окружения, после чего устанавливает WebSocket-соединение с сервером злоумышленников. Каждое полученное сообщение выполняется как JavaScript-код, что дает атакующим полный контроль над зараженной системой.

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

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

Последствия атаки уже оказались крайне серьезными. Как минимум один разработчик сообщил, что вредоносный код отключил защитные функции Chrome, а также, вероятно, похитил SSH-ключи и другие конфиденциальные данные. В результате ему пришлось полностью переустановить операционную систему, заменить SSD и сменить все пароли.

Эта атака демонстрирует, насколько уязвимыми могут быть цепочки поставок в экосистеме npm. Даже популярные и доверенные пакеты могут быть скомпрометированы, что делает критически важным тщательный аудит зависимостей перед обновлениями. В настоящий момент рекомендуется проверить проекты на наличие зараженных версий is, eslint-config-prettier и других скомпрометированных пакетов, а также обновить lock-файлы, если они ссылаются на вредоносные релизы.

Специалисты по кибербезопасности продолжают анализировать атаку, чтобы определить полный масштаб ущерба и возможные связи с другими кампаниями. Разработчикам следует оставаться бдительными и использовать инструменты автоматического сканирования зависимостей для минимизации рисков.

Индикаторы компрометации

Malicious Packages

  • eslint‑config‑prettier 8.10.1, 9.1.1, 10.1.6, 10.1.7
  • eslint‑plugin‑prettier 4.2.2, 4.2.3
  • synckit@0.11.9 0.11.9
  • @pkgr/core 0.2.8
  • napi‑postinstall 0.3.1
  • got-fetch 5.1.11, 5.1.12
  • is 3.3.1, 5.0.0
Комментарии: 0