Компания Elastic Security Labs зафиксировала новую масштабную атаку на экосистему npm - менеджера пакетов для Node.js, широко используемого в разработке на JavaScript. Злоумышленники получили контроль над репозиторием популярной библиотеки keyv, предназначенной для хранения данных в формате "ключ-значение". В код проекта был внедрён самораспространяющийся червь CHAINDROP, который с помощью украденных учётных данных автоматически заражал другие пакеты, доступные владельцу библиотеки. Масштаб инцидента крайне велик: только keyv за последний месяц скачали более 600 миллионов раз, а вместе с зависимыми пакетами - flat-cache, cacheable-request и другими - общее число загрузок превышает миллиард.
Описание
Уведомление о подозрительной активности поступило в Slack-канал команды Elastic Security Labs ранним утром 4 августа. Система мониторинга цепочки поставок, ранее разработанная для обнаружения вредоносных пакетов, выдала срабатывание. По данным Elastic Security Labs, на момент публикации отчёта было скомпрометировано более 400 уникальных пакетов, и это число продолжает расти.
Механизм атаки построен на использовании легитимной функции npm - предустановочных скриптов. Когда разработчик устанавливает заражённый пакет, автоматически запускается скрытый код, которому не требуется никаких дополнительных действий от пользователя. Вредоносная программа работает на всех основных операционных системах: Linux, macOS и Windows, что существенно расширяет охват жертв.
Помимо заражения через установку пакета, червь использует обходные пути через популярные инструменты разработчика. Если на машине жертвы установлены Claude Code или Visual Studio Code, вредоносный код может активироваться при открытии заражённого репозитория. Более того, при наличии токена GitHub App злоумышленник способен внедрять вредоносные конфигурации в несколько десятков веток каждого доступного репозитория, что делает заражение возможным даже без запуска каких-либо файлов.
Основная цель червя - кража учётных данных. Вредоносная программа сканирует более 300 различных типов секретов: токены доступа к системам искусственного интеллекта (Anthropic, OpenAI, Gemini, Cursor), облачные учётные данные AWS, Azure, Google Cloud, а также ключи SSH, токены GitHub, HashiCorp Vault, Kubernetes и npm. Все собранные данные сжимаются и шифруются, после чего расшифровать их может только владелец соответствующего закрытого ключа.
Примечательной особенностью CHAINDROP является способ связи с командными серверами. Червь не содержит зашитого адреса сервера, а получает его динамически через смарт-контракт - программу, работающую в блокчейне Ethereum. Это позволяет атакующему менять инфраструктуру управления в любой момент, просто обновив данные в контракте. Если этот метод недоступен, используются резервные механизмы, включая поиск специального маркера в истории коммитов GitHub. В крайнем случае, данные отправляются через публичный репозиторий, созданный на аккаунте жертвы, с характерным названием.
Распространение червя происходит следующим образом. Когда вредоносная программа обнаруживает npm-токен с правами записи и отключённой двухфакторной аутентификацией, она получает доступ ко всем пакетам, опубликованным жертвой. Для каждого пакета червь скачивает последнюю версию из npm, извлекает содержимое, добавляет вредоносные файлы и модифицирует файл описания пакета, добавляя предустановочный хук. Затем обновлённая версия публикуется обратно в реестр, при этом номер версии увеличивается на единицу. В коммите, содержащем изменения, злоумышленник оставляет запугивающее сообщение, призывающее не блокировать украденный токен, утверждая, что это приведёт к остановке производственных серверов всех сторонних клиентов.
Разработчикам, использующим затронутые библиотеки, советуют пересмотреть свою политику обновлений. В частности, рекомендуется не устанавливать новые версии пакетов немедленно, а выдерживать паузу, чтобы сообщество успело выявить возможные вредоносные изменения. Также необходимо отозвать и перевыпустить все токены GitHub и npm, которые могли находиться на заражённых машинах. Следует проверить историю коммитов в репозиториях на наличие подозрительных изменений с сообщением "chore: update config" и автором claude.
Дополнительной мерой защиты является переход на npm версии 12 и выше, где предустановочные скрипты по умолчанию отключены. Всем владельцам аккаунтов необходимо включить двухфакторную аутентификацию, а для автоматизации следует избегать создания токенов с возможностью обхода 2FA. Регулярный аудит зависимостей и проверка целостности используемых библиотек помогут снизить риск повторения подобных инцидентов.
Инцидент с keyv демонстрирует уязвимость цепочки поставок программного обеспечения перед атаками, нацеленными на сопровождающих популярных проектов. Один скомпрометированный аккаунт способен привести к заражению миллионов установок, поэтому безопасность экосистемы напрямую зависит от бдительности разработчиков и применения базовых мер гигиены.
Индикаторы компрометации
Domain
- awqhnjewqjkl.icu
- npm-cache.com
Ethereum contract
- 0xE1f2395ee43e45A1556EC6438a88c31B83493103
SHA256
- 54dc7ea54a1317cca0e890a2770630cf7fa6c97813e0cb9d2caa93012b350668
- 9fc2570b7cef51c1b8df116d144d11ff4096357be7d2c4c6367cfc2509cf1bcc
- fd3ca4007b225fdf8de7af4345a19179d5efa8c4bb9205f88cda806e5684b1eb