Злоумышленники скомпрометировали автоматизацию релизов Ethersphere и выпустили вредоносные версии инструментов децентрализованной сети хранения Swarm: библиотеку bee-js 13.3.0 и приложение Swarm Desktop 0.56.2. Вредоносный код похищал файлы с ключом узла и его паролем, а также устанавливал бэкдор в Windows, macOS и Linux.
Разработчики удалили оба скомпрометированных выпуска. Для Swarm Desktop 9 ноября опубликована чистая версия 0.56.3, однако обновление или удаление исходного приложения не устраняет уже установленную полезную нагрузку и не отменяет возможную отправку ключей атакующим. На момент публикации сообщений о краже средств не было. В использованном источнике сведения о пострадавших организациях в России или СНГ не приводятся.
Затронутые версии и окно распространения
bee-js — JavaScript-библиотека, которую используют Swarm Desktop и утилита командной строки swarm-cli. Swarm Desktop запускает узел Swarm на устройстве пользователя и хранит на нём приватные ключи.
Вредоносный Swarm Desktop 0.56.2 был доступен в GitHub приблизительно с 00:36 UTC 9 ноября и удалён примерно через 8,5 часа. По оценке Socket, механизм автоматического обновления мог предлагать эту сборку устройствам с Windows x64 и компьютерам Mac на Apple Silicon около 10 минут. Для Mac на Intel обновление не предлагалось, а Linux-установки Swarm Desktop автоматическое обновление не используют.
Версия @ethersphere/bee-js 13.3.0 оставалась последней в npm около 75 минут — с 00:09 до 01:25 UTC. В неё был добавлен postinstall-скрипт, который npm запускает автоматически при установке, если выполнение установочных скриптов не отключено. Для исполнения вредоносного кода проекту не требовалось импортировать библиотеку.
Диапазоны зависимостей в swarm-cli, bee-dashboard и исходном коде Swarm Desktop допускали bee-js 13.3.0. Поэтому новая установка в этот временной интервал могла получить скомпрометированный пакет.
Число заражённых машин не раскрывалось. Socket оценила количество загрузок bee-js 13.3.0 примерно в 10, включая обращения сканеров безопасности и зеркал. К 08:27 UTC число загрузок Swarm Desktop 0.56.2 достигло 65, в том числе со стороны исследователей.
После отзыва 0.56.2 Ethersphere выпустила Swarm Desktop 0.56.3. Один из разработчиков сообщил, что вредоносная версия была опубликована с использованием похищенных учётных данных CI. Согласно его заметке об инциденте, 0.56.3 повторяет код предыдущего чистого релиза 0.56.1, но заново подписана новым сертификатом Apple Developer ID. Различия с 0.56.1 ограничены номером версии и примечаниями к выпуску.
Автоматическое обновление должно перевести экземпляры 0.56.2 на 0.56.3. В Linux пакет потребуется заменить вручную. В npm последней версией bee-js вновь стала 13.2.0, а 13.3.0 больше недоступна для скачивания.
Что выполняла полезная нагрузка
По техническому анализу SafeDep, оба релиза содержали одинаковый загрузчик. Несколько строк кода получали дополнительную полезную нагрузку с api[.]frameworkmetrics[.]xyz и запускали её с правами текущего пользователя. В bee-js загрузчик работал как postinstall-скрипт, а в Swarm Desktop запускался при каждом открытии приложения.
Затем код проверял каталог данных Swarm Desktop на наличие файлов config.yaml и data-dir/keys/swarm[.]key. Если находились оба файла, они отправлялись на сервер атакующих.
Файл swarm[.]key представляет собой зашифрованное хранилище ключей Ethereum. Пароль к нему Swarm Desktop хранит открытым текстом в config.yaml. Исследователи полагают, что сочетание этих файлов может дать атакующим доступ к токенам xDAI и xBZZ кошелька узла, средствам на его счёте и доле в стейкинге.
Дополнительно загруженный компонент закреплялся в системе. В Linux и macOS он устанавливал Go-оболочку evjawbreaker в скрытый каталог ~/.solidity/. В Linux оболочка запускалась как пользовательский модуль systemd solidity-langsupport-runner[.]service, в macOS — через LaunchAgent com[.]solidity[.]langsupport[.]runner. В Windows устанавливался легитимный подписанный клиент удалённого доступа ScreenConnect разработки ConnectWise: он работал как системная служба и подключался к ретранслятору атакующих.
Адрес управляющего сервера evjawbreaker оболочка получала из смарт-контракта Ethereum. Это позволяло операторам менять адрес без обновления вредоносной программы. Указанный адрес обновили за 29 минут до внесения вредоносного кода в bee-js.
В Windows при наличии административных прав код использовал известный способ обхода запроса UAC. Если у пользователя не было таких прав, запрос повторно выводился после каждой отмены. После повышения привилегий вредоносная программа добавляла исключение в Microsoft Defender и в фоновом режиме устанавливала клиент ScreenConnect.
Для организаций, у которых нет ресурсов на проверку CI-раннеров, рабочих станций и доступных им секретов, к расследованию такого сценария могут подключаться услуги ИТБ по информационной безопасности. В этом случае критично не ограничиться поиском пакета в lock-файлах: необходимо установить, запускался ли postinstall-скрипт или Swarm Desktop 0.56.2, и определить, какие учётные данные были доступны процессу на момент запуска.
Риск цепочки поставки через npm уже проявлялся в Web3-экосистеме: ранее TTL писал о npm-пакетах под видом Web3-акселератора, устанавливавших стилеры для Windows и macOS. В текущем случае вредоносный код попал не в сторонний пакет с сомнительной репутацией, а в релизы проекта через штатную автоматизацию.
Как вышли вредоносные сборки
Оба выпуска были опубликованы от имени GitHub-аккаунта bee-worker, который Ethersphere использует в релизной автоматизации. Изменения не подписывались и не оформлялись через пулл-реквесты.
Для bee-js атакующие создали в GitHub релиз новой версии, что запустило процесс публикации в npm. Socket указывает, что одобрение для этого процесса не требовалось, а публикация пакета заняла 73 секунды.
Новости информационной безопасности, технологий и государственного регулирования, а также анонсы новых исследований Tech Threat Lab.
Поскольку сборка шла в штатном процессе проекта, пакет получил действительную provenance-запись npm, связывающую его с репозиторием и workflow, в котором он был собран. Такая запись подтверждает место и процесс сборки, но не означает, что содержимое кода кем-либо проверялось.
В случае Swarm Desktop атакующие вручную запустили сборочный workflow, которому были доступны сертификаты подписи Apple и Windows и который также не требовал одобрения. Сборка для macOS была подписана действительным Developer ID проекта и нотариально заверена Apple, поэтому при первом запуске macOS отображала только стандартный запрос.
После инцидента разработчики изменили задачи подписи: теперь для них нужно одобрение команды DevOps, а запуск возможен только из основной ветки.
Способ первоначального доступа остаётся неустановленным. В заметке разработчика причиной названа кража учётных данных и секретов CI. Анализ Socket указывает на использование двух GitHub-аккаунтов: bee-worker и аккаунта одного из давних разработчиков. Как именно были похищены учётные данные, доступные отчёты не объясняют.
Связь с прежней активностью
Полезная нагрузка использует тот же контракт Ethereum, ретранслятор ScreenConnect и названия файлов с поддельными расширениями для разработчиков Solidity, которые в сентябре появились на площадке Open VSX.
Исследователи Pluto Security ранее описали эти расширения в анализе EtherDuck от 1 октября. Они с высокой степенью уверенности связали активность с операторами исходного расширения SleepyDuck: в 2025 году оно также считывало адрес C2 из отдельного Ethereum-контракта. Socket считает, что за компрометацией bee-js и Swarm Desktop стоит та же группа. Это оценка исследователей, а не подтверждённая атрибуция.
Что проверить пользователям bee-js
В advisory по bee-js 13.3.0 указано, что любой компьютер, на котором пакет был установлен или запускался, следует считать полностью скомпрометированным. SafeDep даёт аналогичную оценку для устройств, где был установлен Swarm Desktop 0.56.2.
Если bee-js используется в проекте или CI, необходимо найти упоминания @ethersphere/bee-js@13.3.0 в lock-файлах, кэшах пакетов, внутренних реестрах, журналах установки CI и среди копий, доставленных другими зависимостями. Следует закрепить версию 13.2.0 и удалить кэшированные экземпляры 13.3.0, в том числе копии в используемых npm-зеркалах.
При установке 13.3.0 с разрешёнными установочными скриптами нужно считать скомпрометированным устройство или CI-раннер, даже если журнал не содержит ошибок: код скрывает собственные сетевые ошибки. С чистой системы следует заменить пароли, токены и ключи, к которым мог иметь доступ пользователь, выполнивший установку, либо задание CI.
Что проверить пользователям Swarm Desktop
Нужно проверить журнал bee-desktop.log на строку «Bee Desktop version: 0.56.2 (production)». Эта версия записывается при каждом запуске непосредственно перед исполнением вредоносного кода.
Каталоги журналов:
- macOS: ~/Library/Logs/Swarm Desktop/;
- Windows: %LOCALAPPDATA%\Swarm Desktop\Log\;
- Linux: ~/.local/state/Swarm Desktop/.
Следует установить Swarm Desktop 0.56.3; в Linux замену пакета необходимо выполнить вручную. Если 0.56.2 запускалась хотя бы один раз, ключ и пароль узла следует считать похищенными. С чистого устройства нужно перевести средства узла, чековую книжку и стейк на новый ключ.
На системах, где подтверждён запуск вредоносного кода, нужно искать ~/.solidity/, пользовательскую службу solidity-langsupport-runner[.]service в Linux, LaunchAgent com[.]solidity[.]langsupport[.]runner в macOS и службу Windows ScreenConnect Client (5cbe79c9c25524df). Перед удалением ~/.solidity/ следует проверить содержимое и зафиксировать артефакты: сам по себе путь может использоваться для не связанных с инцидентом данных или инструментов Solidity. Обновление, переустановка или удаление исходного приложения либо пакета не удаляют эти механизмы закрепления. Предпочтительная мера — переустановка системы из доверенного образа, а не очистка на месте.
Индикаторы компрометации
Для поиска следов инцидента можно использовать следующие IOC:
- домен: api[.]frameworkmetrics[.]xyz;
- URL-путь загрузчика bee-js: /v1/analytics;
- URL-путь загрузчика Swarm Desktop: /v1/electron;
- URL-путь дополнительных полезных нагрузок: /v1/assets/;
- URL-путь для отправки файлов кошелька: /v1/swarm/report;
- HTTP-заголовок: X-Ethersphere: 1;
- C2 evjawbreaker: 193[.]57[.]9[.]155:4912;
- ретранслятор ScreenConnect: 185[.]232[.]84[.]169:8041;
- Ethereum-контракт: 0xf8a900Db50b3331be6B768bA460BB59f3E40C344;
- путь: ~/.solidity/;
- модуль systemd: solidity-langsupport-runner[.]service;
- LaunchAgent: com[.]solidity[.]langsupport[.]runner;
- служба Windows: ScreenConnect Client (5cbe79c9c25524df);
- SHA-256 linux_amd64: 9b73e7cd4e1425e770392549d8df46c706139ef476f4f7b9ac405165dc8d9696;
- SHA-256 linux_arm64: b601776817363b96295119f7221338a122d5247a35a77a64b04f286e1bbcc565;
- SHA-256 darwin_amd64: 80d2672e2599732d3c0ae2a4cd0d1e3fe4d555a60273ce33feb99db3f34d250f;
- SHA-256 darwin_arm64: fae61f31f00988fdc5cc9e7272b51e08af2e245d81003237875415930fd27358;
- SHA-256 invoke.ps1: 37d14bff30762ca701e9c1f8bc6c57c065bb20ae3a2208cb7411a6530610f08e;
- SHA-256 app.msi: 7527e86d70e7c9493db4356f1c3775380431b310000f2602c1e993cf435d01da.
Совпадение отдельного IOC само по себе не подтверждает компрометацию: его следует сопоставлять с фактом установки или запуска указанных версий, журналами и другими следами. Отсутствие сетевых совпадений также не исключает компрометацию, поскольку адрес C2 evjawbreaker операторы могут менять через Ethereum-контракт, а ScreenConnect является легитимным ПО.
Практический вывод: организациям, использующим Swarm Desktop, bee-js или зависимые от него инструменты, недостаточно обновить версии. Нужно проверить факт установки либо запуска скомпрометированных релизов, изолировать затронутые рабочие станции и CI-раннеры, провести ротацию доступных им секретов и при подтверждённом запуске восстановить систему из доверенного образа.
