Подпись настоящая, ключи чужие: зараженный релиз bee-js собрали на штатном конвейере проекта

Подпись настоящая, ключи чужие: зараженный релиз bee-js собрали на штатном конвейере проекта

Репозиторий настоящий, конвейер публикации штатный, подпись происхождения сборки валидная. Подделкой оказался только исходный код. Пакет @ethersphere/bee-js версии 13.3.0 опубликовали в npm 9 ноября 2026 года. При установке он скачивал и запускал чужой JavaScript с правами того, кто начал установку. Скачанный код искал файлы кошелька Swarm Desktop и оставлял постоянный удаленный доступ на Linux, macOS и Windows.

Описание

За сутки до публикации в ветку будущего релиза внесли коммит от имени служебной учетной записи bee-worker. Заголовок повторял принятое в проекте именование релизов, а подписи под коммитом не было. Запрос на слияние, который обычно проходит ревью перед выпуском, в тот момент оставался открытым. Предыдущую версию, 13.2.0, выпустили через подписанный и смерженный запрос. Среди проверенных запусков GitHub Actions не нашлось ни одного, который создал бы этот коммит. Дальше сработала рутина: публикация релиза на GitHub запустила существующий конвейер выкладки в npm. Вредоносный код уже лежал в исходниках, которые собирал конвейер, поэтому подпись SLSA указывала на легитимный репозиторий и правильный рабочий процесс.

Следы ведут к использованию релизной учетной записи не по назначению. Украденный токен или пароль - правдоподобное объяснение, но каким именно ключом воспользовались и как его добыли, не установлено. По данным StepSecurity, установочный сценарий запускался раньше, чем кто-либо успевал импортировать библиотеку. Правку внесли в манифест пакета: служебный скрипт переехал в этап, который выполняется сам при установке, а каталог со скриптом попал в состав публикуемых файлов. Скрипт обращался к внешнему хосту, получал код под конкретную платформу и исполнял его с доступом к файлам, процессам и сети. Сетевые ошибки он глушил, поэтому чистый лог установки ничего не опровергает. Дальше нагрузка искала в каталоге данных Swarm Desktop файл настроек и зашифрованный ключ кошелька Ethereum V3. Найденное уходило на тот же сторонний хост, а пароль для расшифровки ключа может лежать в настройках.

Автозапуск код прописывал по-разному. На Linux и macOS он создавал пользовательскую службу, на Windows - ставил пакет средства удаленного доступа и на время добавлял своему каталогу исключение в Microsoft Defender. Linux-исполняемые файлы удалось получить и разобрать: внутри нашли клиент подключения к управляющему серверу и запуск интерактивных оболочек. Версии для macOS и Windows в руки исследователей не попали, их возможности не проверены. Проверенная 13.2.0 вредоносного сценария не содержит, зато проекты с диапазоном зависимости, допускающим 13.3.0, могли подтянуть зараженный пакет при обновлении файла блокировки зависимостей. Удаление зависимости не убирает службу или агент, уже прописанные в системе, а блокировка скриптов установки мешает только повторному запуску. Если сценарий все-таки отработал, машину изолируют и пересобирают с доверенного образа, а доступные пользователю или CI-задаче учетные данные меняют с чистого окружения. Вдобавок цифра 3,560 скачиваний относится ко всем версиям за первую неделю ноября, то есть ко времени до зараженного релиза, и о масштабе ничего не говорит.

Спустя полчаса после публикации npm все еще отдавал 13.3.0 как последнюю версию, а сервер доставки уже отвечал безобидной заглушкой или ошибкой 404. О находке сообщили мейнтейнерам через GitHub issue #1294 и в npm; сколько установок успело получить настоящую нагрузку, источник не сообщает.

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

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