Новая волна атак на цепочки поставок: вредоносные пакеты npm и компрометация GitHub Actions

security

Исследователи Socket Threat Report зафиксировали новую волну атак на цепочки поставок, связанную с семействами вредоносных программ Mini Shai-Hulud, Miasma и Hades. В течение последних дней были выявлены вредоносные релизы npm-пакетов, затрагивающие экосистемы LeoPlatform и RStreams, а также злоупотребление рабочими процессами GitHub Actions и компрометация Go-модуля проекта Verana Blockchain. Атака продолжает шаблон, наблюдаемый в предыдущих кампаниях: злоумышленники получают доступ к учётным данным разработчика или мейнтейнера, внедряют небольшой триггер выполнения, маскируют основную полезную нагрузку под Bun-скрипты, похищают секреты из окружений разработчиков и CI/CD, а затем используют украденный доступ для распространения по реестрам пакетов, репозиториям и доверенным рабочим процессам.

Описание

Вредоносные npm-пакеты были опубликованы в узком временном окне 24 июня 2026 года. Среди затронутых пакетов - leo-auth, leo-aws, leo-cli, leo-sdk, rstreams-metrics, hexo-deployer-wrangler и другие, всего более двадцати наименований. Большая часть пакетов выпущена через учётную запись czirker, однако три дополнительных пакета (hexo-deployer-wrangler, hexo-shoka-swiper, prism-silq) опубликованы пользователем llxlr. Атака объединяет несколько техник: отравление реестра npm, выполнение кода во время установки через binding.gyp, использование Bun для стадирования JavaScript-вредоноса, инфраструктуру dead-drop на GitHub, кражу секретов GitHub Actions, закрепление через AI-ассистентов программирования, хуки выполнения для инструментов разработчика и шифрованную эксфильтрацию учётных данных.

Ключевой особенностью новой волны является использование шаблона "Phantom Gyp". Вместо видимого preinstall или postinstall скрипта в package.json вредоносные пакеты добавляют файл binding.gyp. npm автоматически вызывает node-gyp при обнаружении этого файла, а вредоносный binding.gyp использует подстановку команд для выполнения JavaScript во время фазы конфигурации сборки. Пакет без очевидного preinstall скрипта всё равно может выполнить произвольный код при установке. В пакетах LeoPlatform триггер запускает заменённый index.js, который теперь представляет собой однострочный загрузчик - большую обфусцированную строку.

Загрузчик следует шаблону Miasma/Hades. Первый слой использует сдвиг букв по схеме Цезаря и немедленный вызов eval(). Второй слой расшифровывает встроенные полезные нагрузки AES-GCM. Финальная полезная нагрузка применяет обфускацию в стиле JavaScript-obfuscator: скрытие строк, таблицы подстановок и восстановление значимых строк во время выполнения. Загрузчик также проверяет наличие Bun: если Bun не установлен, вредонос пытается загрузить или установить его, а затем запускает основную полезную нагрузку через bun run. Это продолжает тенденцию к использованию Bun, поскольку многие средства безопасности, ориентированные на Node.js, не отслеживают выполнение Bun с той же глубиной.

Основная цепочка выполнения выглядит следующим образом: npm install видит binding.gyp; node-gyp выполняет встроенную подстановку команды; index.js декодирует и выполняет загрузчик первого этапа; расшифровываются блоки AES-GCM; Bun устанавливается или разрешается; основная полезная нагрузка Miasma запускается под Bun; вредонос похищает секреты, организует эксфильтрацию и пытается распространиться.

Полезная нагрузка нацелена на окружения, где пересекаются исходный код, облачные идентификаторы, инструменты публикации пакетов и AI-ассистенты программирования. В текущей активности обнаружена логика сбора файлов .env, токенов npm и PyPI, токенов GitHub, Slack, Twilio, SSH-ключей, файлов аутентификации Docker, конфигураций Kubernetes, учётных данных AWS, Azure, GCP, данных Vault, истории shell, секретов CI и путей конфигурации IDE или AI-агентов. Вредонос также проверяет наличие продуктов безопасности: CrowdStrike, SentinelOne, Microsoft Defender, Carbon Black, Cylance, osquery, Tanium, Qualys и другие. Как и в более ранней активности Miasma, присутствует защита от русской локализации.

Список целей для кражи учётных данных не случаен. Это червь, созданный для перемещения по цепочкам поставок. Токены реестров пакетов позволяют осуществлять вредоносные перепубликации. Токены GitHub позволяют отравлять репозитории. Секреты CI/CD дают доступ к облаку и продукции. Файлы конфигурации AI-агентов обеспечивают закрепление на машинах разработчиков.

GitHub Actions являются одной из основных целей. Вредонос ищет рабочие процессы, публикующие пакеты, особенно использующие npm publish, yarn publish, GitHub OIDC или токены реестров пакетов. В окружениях CI он пытается собрать секреты непосредственно из контекста runner и из памяти runner. Также используется поведение GitHub API для стадирования и эксфильтрации, включая создание репозиториев и загрузку содержимого. Повторяющийся шаблон рабочего процесса в этом семействе называется Run Copilot - он маскируется под AI-ассистированную разработку, а на самом деле выгружает секреты GitHub Actions в загруженный артефакт.

Отдельно компрометация LeoPlatform включала отравление на уровне репозитория. Публичные отчёты описывают orphan-ветки snapshot-*, отправленные в репозитории LeoPlatform, с фальшивым рабочим процессом dependency-update и большим файлом _index.js. Рабочий процесс был назван так, чтобы походить на активность Dependabot, и запрашивал разрешения GitHub Actions, относящиеся к публикации. Важный момент для защитников: это не только проблема npm install. Если вредонос имеет токен GitHub с достаточными правами, он может изменять репозитории, добавлять рабочие процессы, отравлять ветки и устанавливать хуки закрепления, которые сработают позже.

Одним из самых сильных маркеров кампании является RevokeAndItGoesKaboom. Этот маркер появляется в активности LeoPlatform/Miasma и в компрометации codfish/semantic-release-action, задокументированной StepSecurity. В случае с codfish вредоносное действие искало в коммитах GitHub сообщения RevokeAndItGoesKaboom и использовало их как канал dead-drop для операторских токенов. Тот же маркер теперь появляется в результатах поиска коммитов GitHub, связанных с репозиториями, созданными во время волны "Alright Lets See If This Works". Это связывает компрометацию npm-пакетов, dead-drop поведение GitHub и компрометации GitHub Actions в один операционный кластер или общую линию инструментария.

Компрометация codfish/semantic-release-action важна для контекста. В том инциденте злоумышленники принудительно отправили вредоносные коммиты и переуказали теги версий, так что нисходящие рабочие процессы, использующие изменяемые теги, выполняли код злоумышленника внутри runner'ов GitHub Actions. Вредоносное действие переключало выполнение на Bun и запускало обфусцированный JavaScript из контекста действия. Та же более широкая тактика наблюдается снова: выполнение через Bun, кража токенов GitHub, шифрованный сбор, эксфильтрация через GitHub API, закрепление через AI-ассистентов программирования и проверки русской локализации. Согласно данным, на это действие зависят 1442 репозитория, что может вызвать каскадные заражения.

Закрепление через AI-ассистентов программирования остаётся одним из наиболее явных отличительных признаков Miasma. Вредонос устанавливает хуки для инструментов разработчика и кодирующих агентов, включая Claude, VS Code, Cursor, Gemini, конфигурационные пути, связанные с Copilot, и другие экосистемы агентов или IDE. Эти хуки предназначены для выполнения полезной нагрузки, когда разработчик открывает репозиторий, запускает сессию агента или активирует задачу открытия папки. Это превращает отравленный репозиторий в отложенную поверхность выполнения. Разработчик может клонировать или вытянуть репозиторий после того, как первоначальная компрометация npm уже устранена, открыть его в IDE или AI-инструменте и запустить вредонос локально.

Идентификация того же семейства полезных нагрузок в Go-модуле/исходном архиве github.com/verana-labs/verana-blockchain@v0.10.1-dev.20 расширяет кампанию за пределы установки npm-пакетов. Архив содержит большой обфусцированный файл .claude/index.js, скрипты запуска Bun в .claude/setup.mjs и .vscode/setup.mjs, а также задачу открытия папки VS Code, которая выполняет node .claude/setup.mjs. Включённый хук Claude SessionStart указывает на .github/setup.js, который отсутствует в этом архиве. На основе этого образца жизнеспособным наблюдаемым триггером является путь открытия папки VS Code; обычное разрешение Go-модуля или сборка Go не приводят к выполнению полезной нагрузки. Тем не менее, риск заключается в выполнении из репозитория: разработчик, клонирующий или открывающий репозиторий в доверенной IDE или окружении AI-ассистента, может запустить вредонос через конфигурацию проекта. В анализе Socket AI Scanner флаг указывает на .claude/index.js как на высокодостоверный загрузчик decode-and-eval, стадированный через конфигурацию репозитория и путь открытия папки VS Code.

Рекомендуемые меры защиты включают: считать скомпрометированным любое окружение, где были установлены затронутые версии пакетов; сохранить криминалистические артефакты до очистки; выявить все машины разработчиков, CI-раннеры и сборочные контейнеры; удалить затронутые версии и пересобрать из известного корректного lock-файла; ротировать все секреты npm, GitHub, PyPI, RubyGems, облака, Vault, Kubernetes, Docker, SSH, Slack, Twilio и CI/CD, подвергшиеся воздействию; выполнять ротацию с чистой машины; проверить репозитории на наличие инжектированных рабочих процессов, хуков AI-агентов, .github/setup.js, _index.js, orphan-веток, подозрительных коммитов в стиле Dependabot и необъяснимого использования Bun; проанализировать запуски GitHub Actions на предмет загрузок Bun, неожиданного создания репозиториев, загрузки артефактов, содержащих секретный материал, и вызовов API GitHub для загрузки содержимого; пересмотреть использование pull_request_target, особенно рабочие процессы, которые выполняют checkout кода из pull request или запускают команды сборки/тестирования на непроверенном содержимом; зафиксировать GitHub Actions на неизменяемые полные SHA коммитов и отслеживать дрейф тегов; ограничить доверенную публикацию npm и разрешения GitHub OIDC только теми рабочими процессами и ветками, которым это необходимо.

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

SHA256

  • 026588d39b7c650b5c0dfbba6c6fcc0e7ec8e3b72ba8639012e7f71c708f2c3b
  • 15b415ae41df72acf1f7e9e67569531d41dee62d089d34b4c0fab0c7fe5cc14f
  • 1a0e1daeaea87cab5610a3cc2aa72e7c6f1abfe55959a156368bcfa6585fa6ce
  • 1a3b9ed0b377f56f49b9a703612cf45e86ab7d100587e1e7a476d809fe337a8c
  • 32d1bc728d8e504952083a6adc488c309a401c7df4dc8f47b382ce32e4aebe21
  • 3da2ca129c9920d9acd2e3477aee8f46b5a5f0e9537ad6e7b6ab1df1007adad1
  • 4a0aa78757958683155a7b9289427fb829abcad1bf5ee6399eb73e8409b0bc11
  • 57ba86f6f0caaa580c1dccdf4ed7873d1470e5ea2f8e9ca7a989dc04899f13c0
  • 6a861a479f45fe53f067091414332248bc027ffc396116811d12e57a6ff71250
  • 6cb3fc3650355973b8a1ed86619a3f412fb0700f29c1c3a736cada4c2c76a9f7
  • 927387d0cfac1118df4b383decc2ea6ba49c9d2f98b47098bcbcba1efc026e1f
  • 9f93d77d32833a515bc406c46da477142bb1ac2babeecb6aa42f98669a6db015
  • a934a5bcf692b9d01e8129bf264be23809dfee464df471d75a9f3fa1bcede343
  • b3e217f4354e8a4383038b99b0bcaeaff191a79df58e7a1f2355a79aac2faf13
  • ceff7c51d70832c3ec8dd2744b606a23b3c924ef664ae23439b9b742ea154108
  • df9ea0c71574e11c93141ad2f018a63a5375cd6d69ca2f744732ad7814170657
  • f565988f281bf77bcad26ea7f543617e53da4b62f5df63d4f7a89bae1729cf81
  • f7c47be306351ffacd46584d2067f7be676dbfe17cd89ab4880632decfe18f3d

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