ChainDrop: червь npm, отравивший сотни пакетов за несколько часов.

Последнее обновление: 08/11/2026
  • 4 августа 2026 года самораспространяющийся червь ChainDrop за четыре часа скомпрометировал более 400 пакетов npm, включая keyv и flat-cache.
  • В ходе атаки были использованы украденные учетные данные GitHub для публикации вредоносных версий с подтвержденным происхождением, что делало их неотличимыми от легитимных релизов.
  • Вредоносная программа крадет учетные данные, похищает данные через C2-сервер на базе Ethereum и повторно публикует зараженные пакеты, используя украденные токены npm.
  • Для смягчения последствий организациям необходимо проверять файлы блокировок, обновлять учетные данные и удалять механизмы сохранения данных.

логотип npm

Экосистема npm переживает последствия одной из самых агрессивных атак на цепочку поставок, когда-либо виденных. 4 августа 2026 года червь под названием ChainDrop прорвал реестр, отравив сотни пакетов менее чем за четыре часа. Атака использовала скомпрометированный аккаунт GitHub для публикации вредоносных версий широко используемых библиотек, таких как keyv и flat-cache, которые вместе составляют сотни миллионов еженедельных загрузок. Что делает этот инцидент особенно тревожным, так это то, что вредоносные релизы имели действительную аутентификацию SLSA, благодаря чему они выглядели совершенно легитимными для автоматизированных проверок безопасности.

Исследователи безопасности из StepSecurity, Unit 42, Sonatype и Aikido спешат проанализировать червя и сдержать его распространение. Первая волна атаковала экосистему jaredwray, но червь быстро распространился на другие организации и разработчиков, включая ServiceTitan, Qlik и Deliveroo. По последним данным, количество скомпрометированных пакетов продолжает расти, новые заражения появляются каждые несколько минут. Это не просто очередная кампания по захвату учетных данных; это сложный, самораспространяющийся червь, который крадет учетные данные и использует их для повторной публикации в реестре npm.

Атака на кадену начальства ChainDrop npm
Связанная статья:
Атака ChainDrop: более 435 пакетов npm скомпрометированы червем, поражающим цепочку поставок.

Атака вкратце

npm оповещение о безопасности

Атака началась с взлома аккаунта GitHub Джареда Рэя, сопровождающего keyv и связанные с ним пакеты. Злоумышленник отправлял вредоносные коммиты непосредственно в основную ветку и создавал новые релизы, которые затем публиковались в npm через собственный доверенный рабочий процесс публикации проекта. Это означало, что зараженные версии имели действительные аттестации происхождения SLSA — функцию, на которую многие команды полагаются как на сигнал безопасности. Однако происхождение подтверждает только то, какой коммит был собран, а не то, был ли этот коммит авторизован. Злоумышленник также внедрял поддельные тестовые файлы и модифицированные скрипты релизов, чтобы гарантировать, что вредоносные версии станут последними версиями с тегом dist-tag.

Вредоносные пакеты содержали скрипт предварительной установки, который запускал дроппер под названием setup.mjs. Этот дроппер загружал легитимную среду выполнения JavaScript Bun с GitHub и использовал её для запуска обфусцированной полезной нагрузки размером 727 КБ под названием Math_Symbol.js. Полезная нагрузка представляла собой полнофункциональный червь, который собирал учетные данные из системы жертвы, включая токены npm, токены GitHub, учетные данные облачных сервисов, ключи SSH и даже конфигурации инструментов ИИ. Затем он передавал данные на сервер управления и контроля, доступ к которому осуществлялся через смарт-контракт Ethereum — метод, известный как EtherHiding.

Затронутые пакеты и область действия

список пакетов npm

Первоначальная волна атак затронула 11 пакетов в экосистеме jaredwray, включая keyv@6.0.0, flat-cache@6.1.24 и file-entry-cache@11.1.6. Эти пакеты являются транзитивными зависимостями бесчисленных проектов, от ESLint до cache-manager. Затем червь, используя украденные учетные данные, переиздал еще 433 пакета, в результате чего общее число затронутых пакетов достигло 444, а количество версий — 2,212 за первые несколько часов. Более поздние сообщения от Sonatype и Aikido указывают на то, что число затронутых пакетов еще больше возросло, и к моменту завершения атаки пострадало более 1,000 пакетов.

Вторая волна атак затронула пакеты от таких организаций, как @servicetitan, @qlik, @onereach и @deliveroo, что указывает на то, что червь переместился из общедоступных инструментов разработчиков в корпоративные конвейеры сборки. Злоумышленники также создали общедоступные репозитории с названиями в стиле «Дюны» для размещения похищенных данных и внедрили механизмы обеспечения постоянного присутствия в каталогах .vscode и .claude, чтобы повторно заразить разработчиков, открывших скомпрометированные репозитории.

Как работает червь ChainDrop

Эта цепочка атак — мастер-класс по выживанию за счёт ресурсов системы. Скрипт предварительной установки запускается до установки каких-либо зависимостей, поэтому червь выполняется с правами пользователя. Дроппер проверяет, установлен ли уже Bun; если нет, он загружает легитимный бинарный файл Bun с GitHub. Это делает сетевой трафик безобидным, поскольку он исходит с github.com. Затем полезная нагрузка второго этапа отключается в фоновом режиме и начинает свою грязную работу.

Одна из наиболее характерных техник — это сбор данных из памяти исполнителя . Полезная нагрузка запускает вспомогательный Python-скрипт, который считывает память процесса GitHub Actions Runner.Worker, ища секреты, внедренные в рабочий процесс. Это позволяет ему перехватывать токены OIDC и другие временные учетные данные, которые в противном случае исчезли бы после завершения задания. Червь также использует механизм аварийного завершения работы при русской локали, корректно завершая работу, если язык системы — русский, что является распространенной тактикой для избежания атак на страны СНГ.

В состав вредоносной программы входит полноценный механизм публикации npm. Он перечисляет все пакеты, которые жертва может опубликовать, загружает текущий архив, внедряет вредоносный скрипт предварительной установки и полезную нагрузку, а затем повторно публикует пакет с обновленной версией. Он даже генерирует собственные пакеты Sigstore и SLSA для проверки происхождения, благодаря чему вредоносные версии выглядят как легитимно собранные. Именно этот механизм самораспространения позволил червю так быстро распространиться среди организаций, не имеющих отношения к данному проекту.

Показатели компромисса

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

  • Файлы с именами setup.mjs, Math_Symbol.js или math_init.js находятся в каталогах node_modules.
  • В вашей системе могут быть обнаружены неожиданные исполняемые файлы Bun, особенно если вы никогда не устанавливали Bun.
  • Изменения в файлах .claude/settings.json или .vscode/tasks.json, которые ссылаются на setup.mjs.
  • Исходящие соединения с npm-cache.com или awqhnjewqjkl.icu, или вызовы Ethereum RPC к контракту 0xE1f2395ee43e45A1556EC6438a88c31B83493103.
  • Новые репозитории GitHub с описаниями типа «Шай-Хулуд: Снова в путь» или названиями, связанными с «Дюной».

Также проверьте наличие установленного после эксфильтрации монитора токенов: ~/.local/bin/gh-token-monitor.sh, ~/.config/gh-token-monitor/ и служб systemd или LaunchAgent. Червь устанавливает его для наказания за подмену учетных данных, запуская вредоносную программу при аннулировании украденного токена.

Смягчение последствий и восстановление

Если вы столкнулись с этой проблемой, действуйте быстро. Во-первых, изолируйте машину и сохраните логи. Затем выполните ротацию всех учетных данных, которые присутствовали в системе, включая токены npm, PAT-теги GitHub, облачные ключи и SSH-ключи. Перед ротацией удалите монитор токенов, так как он сработает, если вы отзовете токен. Далее очистите файлы блокировки и закрепите их на заведомо исправных версиях. Для keyv, flat-cache и file-entry-cache используйте переопределения для блокировки вредоносных версий. Наконец, переустановите с параметром –ignore-scripts, чтобы предотвратить выполнение оставшихся хуков установки.

Для конвейеров CI/CD просмотрите журналы всех установок, которые разрешили затронутые версии в течение периода уязвимости. Рассматривайте любой раннер, установивший зараженный пакет, как скомпрометированный и ротируйте все доступные для этой задачи секреты. Также проведите аудит ваших организаций GitHub на предмет неожиданных рабочих процессов с именем «Run Copilot» или артефактов с именем «format-results», которые являются признаками отмывания секретов червем.

Многоуровневая защита имеет решающее значение. Используйте списки разрешенных исходящих пакетов на CI-раннерах, чтобы заблокировать загрузку Bun-пакетов дроппером. Внедрите политики ограничения времени ожидания, требующие, чтобы пакеты были выпущены не более нескольких дней назад, прежде чем их можно будет использовать. И не полагайтесь исключительно на проверку происхождения — это не гарантирует безопасность. Лучшая защита — минимизировать использование скриптов установки и отслеживать аномальное поведение.

По мере продолжения расследования количество затронутых пакетов продолжает расти. Способность червя обновлять свою инфраструктуру управления и контроля (C2) с помощью одной транзакции Ethereum делает его особенно устойчивым. Группам безопасности следует отслеживать изменения в смарт-контракте и быть в курсе новых индикаторов. Реестр npm начал удалять вредоносные версии, но очистка продолжается.

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

Похожие посты: