Загрузчик червя размещался в файлах setup.mjs и Math_Symbol.js, которые запускались при помощи preinstall-обработчика («preinstall»: «node setup.mjs»), вызываемого при установке поражённого пакета. Указанные скрипты загружали легитимный Bun runtime и обфусцированный код червя, размером 710 Кб. После активации червь выполнял поиск в системе и в переменных окружения токенов к NPM, PyPI, CircleCI, AWS, GCP, Docker, Azure, HashiCorp, KubernetesK8s и другим сервисам (всего анализировалось более 140 файловых путей, типа ~/.npmrc), а также анализировал память (через /proc/‹pid›/mem) окружения GitHub Actions на предмет токенов и учётных данных.
В случае обнаружения токена для подключения к каталогу NPM червь автоматически публиковал новые вредоносные релизы для разрабатываемых в текущем окружении пакетов, поражая дерево зависимостей. В отличие от ранее выявленного червя Shai-Hulud 2.0 в ChainDrop была реализована техника EtherHiding для получения управляющих команд через публичный блокчейн Ethereum, задействовано шифрование для скрытия передаваемых на сервер атакующих конфиденциальных данных и обеспечено внедрение в файлы конфигурации Claude Code, VS Code и GitHub Copilot для закрепления присутствия в системе. Если в системе установлена русскоязычная локаль (LANG=ru*), то червь прекращает работу.
Атака началась с компрометации процесса формирования релизов на базе GitHub Actions для пакета keyv, насчитывающего 154 млн загрузок в неделю и используемого как зависимость в 1703 пакетах. Доступ получен в результате атаки на сопровождающего, позволившей получить его учётные данные.
Атакующие сформировали новую версию 6.0.0, подставив в неё вредоносный код, и опубликовали её с использованием
механизма «Trusted Publishers» и корректной SLSA-аттестацией. После публикации червь поразил многие зависимые от keyv пакеты и по цепочке стал поражать непрямые зависимости.
Среди наиболее популярных пакетов, которые оказались поражены червём, опубликовавшим для них вредоносные релизы:
- flat-cache 6.1.24 (149.8 млн загрузок в неделю);
- file-entry-cache 11.1.6 (147.5 млн);
- cacheable-request 13.0.20 (33.9 млн);
- @cacheable/utils 2.5.1 (8.7 млн);
- cacheable 2.5.1 (7.8 млн);
- @cacheable/memory 2.2.1 (7.1 млн);
- cache-manager 7.2.10 (4.2 млн);
- @cacheable/node-cache 3.1.2 (1.5 млн).
Источник: http://www.opennet.ru/opennews/art.shtml?num=66030
