Атака на цепочку поставок AsyncAPI: кража токена через pull request и публикация вредоносных пакетов в npm

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

14 июля 2026 года злоумышленник предпринял скоординированную атаку на экосистему AsyncAPI, открыв 37 pull request-ов к репозиторию asyncapi/generator. Почти все они содержали фиктивные страницы для пожертвований благотворительным организациям, однако один запрос на включение изменений оказался особым. Используя технику маскировки среди шума, атакующий эксплуатировал неверно настроенный workflow GitHub Actions для кражи высокопривилегированного персонального токена доступа (PAT). В результате под официальным пространством имён @asyncapi были опубликованы четыре вредоносных пакета npm общей сложностью в пять версий. Эти пакеты в совокупности насчитывают более 140 тысяч загрузок в день. Полезная нагрузка активируется при импорте пакета (require), а не при установке.

Описание

Атака не имеет прямой связи с предыдущей компрометацией @asyncapi в рамках инцидента Shai-Hulud 2.0, хотя некоторые технические элементы пересекаются с известным вредоносным фреймворком Miasma.

Механизм компрометации: уязвимость класса pwn request

Уязвимость, получившая в сообществе название "pwn request", возникает при неправильном использовании триггера "pull_request_target" в GitHub Actions. В репозитории asyncapi/generator один из workflow-файлов был настроен на запуск при поступлении pull request-ов, но вместо кода базовой ветки выполнял код, содержащийся в самом запросе. Поскольку "pull_request_target" работает в контексте репозитория с полным доступом к секретам, злоумышленник получает возможность выполнить произвольный код в доверенном окружении и похитить учётные данные.

Примечательно, что потенциальная опасность данной конфигурации была выявлена ещё за несколько месяцев до атаки. 29 апреля один из контрибьюторов открыл pull request с исследованием этой проблемы, включая доказательство концепции. 17 мая он же предложил исправление, разделяющее workflow на две отдельные задачи для изоляции доступа к секретам от недоверенного кода. Это исправление оставалось не объединённым в течение 58 дней - до момента атаки.

5:08 UTC злоумышленник открыл PR #2155, содержащий файл в формате Markdown с обфусцированным JavaScript-кодом. Код был спрятан после примерно 1000 байт пробелов и предназначен для сканирования окружения GitHub Actions runner на предмет секретов и последующей их эксфильтрации на dead-drop URL через сервис rentry.co. Автоматизированная проверка зафиксировала обфускацию, однако workflow завершился в 5:16 UTC, и атакующий получил похищенные учётные данные.

Скомпрометированный токен принадлежал учётной записи asyncapi-bot - сервисному аккаунту с доступом по всей организации AsyncAPI.

Публикация вредоносных пакетов

Используя украденный PAT, злоумышленник в 6:58 UTC напрямую отправил вредоносный коммит в ветку "next". Это запустило workflow релиза, который в 7:10 UTC опубликовал первые три скомпрометированных пакета в npm. Затем атака была перенесена на репозиторий asyncapi/spec-json-schemas - в период с 7:51 до 8:28 UTC было произведено 11 коммитов, и опубликованы ещё две вредоносные версии @asyncapi/specs.

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

Технические особенности и возможные связи

Полезная нагрузка изначально обфусцирована с помощью библиотеки javascript-obfuscator с пользовательским алфавитом base64 - такая же конфигурация ранее наблюдалась в инцидентах, связанных с фреймворком Miasma. В коде этапа 3 явно содержится строка "M-RED-TEAM v6.4" в комментариях, описывающих шифрование beacon-сообщений и протокол связи с командно-контрольным сервером (C2). В извлечённом конфигурационном файле присутствует параметр "giteaPackagesOrg: "miasma-test-org"", а код персистентности использует службу "miasma-monitor.service" и теги "miasma" в ретрансляторах Nostr.

Однако dead-drop URL на rentry.co использует слаг "elzotebo", что соответствует шаблонам наименований кампании prt-scan. Эта кампания ранее ассоциировалась с атаками на основе pull request-ов, но не была связана с Miasma. В предоставленном анализе эксперты подчёркивают минимальное сходство полезной нагрузки с предыдущими версиями Miasma и Shai-Hulud: вместо сетевого червя в данном случае обнаружена полноценная командная среда с классическими функциями трояна (Dirlist, GetFile, PutFile и др.), работающая через прямое соединение с C2-инфраструктурой. Окончательная атрибуция на данный момент не производится.

Цепочка заражения и функциональность

Полезная нагрузка реализует многоэтапную инфекцию. Первый этап активируется при импорте скомпрометированного пакета. Он порождает отдельный дочерний процесс, который загружает следующий этап с IPFS и сохраняет его в платформозависимый каталог: на Linux это "~/.local/share/NodeJS/sync.js", на macOS - "~/Library/Application Support/NodeJS/sync.js", на Windows - "%LOCALAPPDATA%\NodeJS\sync.js". Второй этап представляет собой зашифрованный бандл размером 8,25 МБ, содержащий конфигурацию и основное рантайм-ядро. Третий этап - это фреймворк объёмом около 92 тысяч строк кода с модульной архитектурой. Он обеспечивает закрепление в системе через systemd user services на Linux и связывается с C2-инфраструктурой по нескольким каналам: HTTP, ретрансляторы Nostr, смарт-контракты Ethereum и mesh-сеть libp2p.

Возможности вредоносного ПО включают кражу учётных данных из сохранённых паролей и файлов cookie браузеров (Chrome, Brave, Firefox, Edge), SSH-ключей, токенов npm и GitHub, учётных данных AWS, связки ключей macOS и криптовалютных кошельков. После установки вредоносная программа принимает удалённые команды на операции с файлами, листинг каталогов и эксфильтрацию данных.

Рекомендуемые меры защиты

Организациям следует немедленно провести аудит рабочих станций разработчиков, сред CI/CD и репозиториев на предмет признаков компрометации. Необходимо проверить системы на наличие пострадавших пакетов: @asyncapi/generator версии 3.3.1, @asyncapi/generator-helpers версии 1.1.1, @asyncapi/generator-components версии 0.7.1, @asyncapi/specs версий 6.11.2 и 6.11.2-alpha.1. Поскольку вредоносное ПО нацелено на учётные данные разработчиков и секреты, следует исходить из возможной утечки GitHub-токенов, SSH-ключей, облачных учётных данных и секретов CI/CD - все они должны быть ротированы.

Дополнительно необходимо усилить защиту цепочки поставок программного обеспечения: внедрить разрешённые списки зависимостей, формировать SBOM, проверять подлинность пакетов и улучшить мониторинг сред разработки и сборки. Данный инцидент наглядно демонстрирует, как давно известная уязвимость в конфигурации CI/CD может привести к масштабной компрометации экосистемы с открытым исходным кодом.

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

IPv4

  • 85.137.53.71

SHA1

  • 22bf76fe317ea6769bd38619bd440e42d119bd6b
  • 9890950adcbc2478e7a080234f053214adbad44e
  • a7e18d96efd3cdb127ef4cdcad9e3ad26c482bf2
  • c70e105e212ff3c1daa04bb2a62507717f296b0b
  • c8cb3f6d5b90c46686d2bf531dc1a5786e27edc5

Package

  • @asyncapi/generator 3.3.1
  • @asyncapi/generator-helpers 1.1.1
  • @asyncapi/generator-components 0.7.1
  • @asyncapi/specs 6.11.2
  • @asyncapi/specs 6.11.2-alpha.1

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