Атака ChainDrop на npm-пакеты: взлом аккаунта мейнтейнера затронул миллионы проектов

Атака на цепочку поставок NPM

В августе 2026 года злоумышленники получили доступ к GitHub-аккаунту разработчика, поддерживающего несколько библиотек для Node.js. Node.js представляет собой платформу для выполнения JavaScript-кода вне браузера. Библиотеки keyv, cacheable, flat-cache и file-entry-cache относятся к категории базовых утилит. Их суммарное число загрузок превышает один миллиард в месяц. Эти пакеты входят в состав тысяч других проектов, поэтому инцидент затронул значительную часть экосистемы npm (хранилища программных пакетов для Node.js). Компрометация аккаунта позволила злоумышленникам действовать от имени доверенного разработчика, что существенно повысило шансы на успех.

Описание

Атака началась с прямого изменения кода в основной ветке репозиториев. Злоумышленники внедрили вредоносные фрагменты, а затем использовали штатные процессы GitHub для автоматической сборки и публикации. В итоге обновления появились в официальном реестре npm с цифровой подписью мейнтейнера. Из-за этого стандартные проверки подлинности не выявили подмену. Разработчики и CI/CD-системы (среды непрерывной интеграции и развертывания) получили вредоносное ПО в составе обычного обновления зависимостей. При этом злоумышленники заранее подготовили вредоносный код и схему его доставки, чтобы минимизировать время между взломом и публикацией.

При установке зараженного пакета на компьютере запускается скрытый сценарий. Он загружает с удаленного сервера код, который занимается сбором учетных данных. Вредоносная программа ищет пароли в локальных файлах конфигурации, переменных окружения и операционной системе. Кроме того, она сканирует память сборочных серверов для перехвата временных токенов публикации. Как показало исследование, эта кампания связана с семейством вредоносных программ Shai Hulud. Предыдущая волна этого семейства затронула пакеты TanStack, Mistral AI и OpenSearch в мае 2026 года.

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

Главная особенность ChainDrop - самораспространение. Используя украденные ключи доступа к npm, червь публикует вредоносные версии других пакетов, которыми владеет жертва. При этом заражение распространяется без участия оператора. Каждая новая жертва открывает доступ к своим репозиториям и связанным системам. В результате один скомпрометированный аккаунт способен привести к заражению сотен проектов. В случае с keyv и cacheable зависимыми оказываются многочисленные фреймворки и библиотеки, что делает каскадное распространение особенно опасным. В силу того, что эти библиотеки широко используются как составные части более крупных решений, число потенциальных жертв огромно.

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

Первоочередные меры защиты включают проверку файлов, фиксирующих версии зависимостей, во всех проектах и сборочных конвейерах. Речь идет о файлах типа package-lock.json и аналогичных. Если обнаружены затронутые версии, необходимо откатиться к известным безопасным релизам и зафиксировать их. Затем следует сменить все секреты, которые могли находиться на зараженных системах: токены npm, GitHub, облачные ключи, пароли баз данных. Важно также проверить журналы CI/CD и историю публикаций в npm на предмет несанкционированных действий. При малейшем сомнении лучше выполнить ротацию всех ключей, даже если признаки компрометации пока не найдены. Список затронутых версий постоянно обновляется, поэтому проверку нужно повторять до полного завершения расследования.

Уроки инцидента касаются не только разработчиков, использующих Node.js. Аккаунты мейнтейнеров популярных библиотек становятся приоритетной целью для атакующих. Компаниям, которые поддерживают проекты с открытым исходным кодом, следует усилить защиту учетных записей: включить двухфакторную аутентификацию, использовать отдельные ключи для разных сервисов и ограничить права доступа. Полезно также регулярно проверять код на посторонние вставки и оперативно отзывать подозрительные публикации. Внедрение таких мер требует времени, но позволяет существенно снизить вероятность повторения подобных инцидентов.

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

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

Domain

  • js-mirror.com
  • npm-cache.com
  • pypi-get.com

MD5

  • 4140f7e17e6f97f83aa3472473e01add
  • 7bcf8d9f6834c44450eac145a967d2f2
  • f92ee93a0af971a3966bfa8efa9c2625

SHA1

  • 35a672cf34b996b91f3e1c28cbf3a05a37e036e4
  • e65b155ce74f3f81fb7d2b5b60f8e62b36e6d69c
  • f525d52ceb966516686b482d3dc0137028cc6a63

SHA256

  • 54dc7ea54a1317cca0e890a2770630cf7fa6c97813e0cb9d2caa93012b350668
  • 9fc2570b7cef51c1b8df116d144d11ff4096357be7d2c4c6367cfc2509cf1bcc
  • fd3ca4007b225fdf8de7af4345a19179d5efa8c4bb9205f88cda806e5684b1eb

Комментарии: 0