Обнаружено пять троянизированных пакетов AsyncAPI: многоступенчатая атака с загрузчиком из IPFS и удалённой оболочкой

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

Специалисты по информационной безопасности выявили пять вредоносных публикаций в репозитории npm, связанных с экосистемой AsyncAPI. Инцидент затронул пакеты @asyncapi/specs версий 6.11.2 и 6.11.2-alpha.1, @asyncapi/generator версии 3.3.1, @asyncapi/generator-helpers версии 1.1.1 и @asyncapi/generator-components версии 0.7.1. Все они были опубликованы 14 июля 2026 года и содержат встроенный обфусцированный загрузчик, вставленный непосредственно в исполняемые модули, а не в npm-хуки жизненного цикла. Это означает, что для активации вредоносной цепочки достаточно обычного вызова require() одного из скомпрометированных пакетов.

Описание

Каждый загрузчик запускается как отдельный дочерний процесс Node.js с флагом detached: true и немедленно завершает родительский процесс, что затрудняет обнаружение. Внутри скрипта содержится ссылка на IPFS (межпланетная файловая система), откуда загружается зашифрованный файл, сохраняемый на диск под именем sync.js. В зависимости от платформы файл размещается в каталоге ~/Library/Application Support/NodeJS (macOS), %LOCALAPPDATA%\NodeJS (Windows) или ~/.local/share/NodeJS (Linux). Далее этот загрузчик второго этапа расшифровывает и выполняет основную полезную нагрузку - имплант, обеспечивающий постоянное присутствие и удалённую командную оболочку.

В ходе анализа было установлено, что данная кампания является вариантом ранее известного вредоносного инструментария Miasma. Внутренняя маркировка кода (miasma-train-p1, пути ~/.config/.miasma/, артефакты закрепления miasma-monitor и сертификаты spawn miasma-spawn-cert-v1) указывает на прямое наследование архитектуры. Однако от более ранних версий этот вариант отличается существенно: предыдущий Miasma был написан на Bun, использовал RSA и AES-CBC, распространялся через GitHub и обладал активным механизмом самоуничтожения. Текущий вариант построен на Node.js, применяет выделенный HTTP-канал управления с шифрованием secp256k1 ECDH и AES-GCM, а обновления получает через Nostr и Ethereum. Сбор учётных данных и самораспространение в данном билде отключены, что не позволяет однозначно определить, является ли это форком, переписыванием или копией общего исходного кода. Исследователи используют термин "вариант" как наиболее корректный.

Имплант при первом запуске генерирует пару ключей secp256k1 и сохраняет её в системном кеше под видом служебного файла. Для предотвращения дублирования экземпляров используется файл блокировки ~/.config/.miasma/run/node.lock. Закрепление реализовано для всех трёх основных платформ: на macOS добавляется блок nohup в .zshrc или .bashrc; на Windows создаётся запись HKCU Run с именем miasma-monitor; на Linux записывается systemd-юнит ~/.config/systemd/user/miasma-monitor.service (хотя из-за отсутствия обёртки ExecStart служба, скорее всего, не запускается, но файлы записываются).

Каждые 30 секунд имплант отправляет зашифрованные и подписанные маячки (beacons) на командно-контрольный сервер по адресу hxxp://85[.]137[.]53[.]71:8080. Даже при отключённом сборе разведки каждый маячок содержит урезанные сведения о путях PATH, HOME, USER и HOSTNAME, а также проверяет наличие конфигурационных файлов инструментов разработчика Cursor, Claude и VS Code.

Передача команд реализована через зашифрованные конверты. Однако, как показал анализ кода, при отсутствии зашифрованного блока используется резервный механизм - открытый текст, что делает канал уязвимым для атак типа "человек посередине" (man-in-the-middle). Любой участник сети, имеющий доступ к трафику, может внедрить произвольные команды. Реализовано 11 типов команд, из которых наиболее опасна команда ShellExec (индекс 11), передающая запрос функции child_process.exec(). Единственной запрещённой командой в чёрном списке является killall, что оставляет широкие возможности для выполнения произвольных системных вызовов. Команды работы с файлами (list, get, put) изолированы в виртуальной файловой системе /sim-fs, но оболочка никаких ограничений не имеет.

Обновления полезной нагрузки могут быть получены двумя способами: напрямую от оператора (указанием нового CID) либо через двухминутный опрос Nostr и Ethereum в поисках более новой версии. Обновления из Nostr проходят проверку подписи, тогда как записи из Ethereum принимаются без верификации, что является существенной уязвимостью в механизме доставки.

Примечательно, что в коде присутствуют полностью реализованные, но отключённые модули: сборщик учётных данных (облачные ключи, токены пакетных менеджеров, SSH/GPG-ключи, истории оболочек, данные браузеров, CI/CD, базы данных, кошельки, парольные менеджеры), а также векторы самораспространения через npm, PyPI и Cargo. Все соответствующие тумблеры (recon, propagate) установлены в false, поэтому данные функции не выполняются. Тем не менее, оператор через командную оболочку может вручную достичь того же результата, что делает защиту на основе конфигурации ненадёжной.

Критически важно, что поля конфигурации, которые могли бы указывать на "безопасный" режим работы (safeMode: true, actualPersist: false, canaryPercent: 5), не оказывают реального влияния на выполнение. Анализ графа вызовов показал, что safeMode нигде не проверяется, закрепление читает флаг toggles.persist (установлен в true), а canaryPercent относится к нереализованному модулю BatchDispatch. Таким образом, эти поля вводят в заблуждение и не снижают вредоносность импланта.

Для организаций, использующих пакеты AsyncAPI, данный инцидент создаёт серьёзные риски: удалённый доступ к системам, возможная кража данных и боковое перемещение внутри сети, несмотря на отключённый автоматический сбор учётных данных. Рекомендуется немедленно проверить версии указанных пакетов в своих проектах и в случае обнаружения заражённых версий удалить их, а также просканировать хосты на наличие файлов sync.js и артефактов в ~/.config/.miasma/. Необходимо также обратить внимание на процессы Node.js, запущенные с флагом detached: true и использующие IPFS-соединения. Использование HTTPS-прокси с инспекцией трафика может помочь выявить необычные обращения к IPFS-шлюзам и HTTP-C2.

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

IPv4 Port Combination

  • 85.137.53.71:8080

Packages

  • @asyncapi/specs6.11.2
  • @asyncapi/specs6.11.2-alpha.1
  • @asyncapi/generator3.3.1
  • @asyncapi/generator-helpers1.1.1
  • @asyncapi/generator-components0.7.1

SHA256

  • 082d733db0687dcd768104972b065d4b58cb1e6043688c6c20fa3702337f36ab
  • 34014776d3d3ff11bc4439b02fd7ac0f02a887eb3a052eeafff236e2f6db8ad1
  • 9b2e65db653ca8575c9b10eefb9a80c6006404812c2ec212bf5675e3c690233b
  • bfaeb987faa6de2b5a5eb63b1233d055215b09b0349a9394f2175fd7cdf385e4
  • d425e4583cc6185d41e95c45eda00550045a5d1919b9a012236a4520d009dbd7

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