После удаления forge-jsx злоумышленники выпустили его продолжение forge-jsxy с кражи криптокошельков и браузерных расширений

information security

В начале мая специалисты npm (реестр пакетов Node.js) удалили вредоносный пакет forge-jsx, который устанавливал на машины разработчиков троян удалённого доступа. Однако уже через несколько часов после блокировки появился его двойник - forge-jsxy. Новый пакет не просто повторял функциональность предшественника, но и получил существенные дополнения: сканирование криптовалютных ключей с криптографической верификацией, кражу баз данных браузерных расширений и скрытое закрепление в системе, которое сохраняется даже после удаления самого пакета.

Описание

За 22 дня, с 4 по 26 мая 2026 года, оператор опубликовал 22 версии forge-jsxy под учётной записью jacksonkaandorp2. Нумерация версий начинается ровно с того же номера, на котором остановился оригинальный пакет forge-jsx - v1.0.66. Это прямо указывает на одного и того же автора. За время кампании было выпущено в общей сложности 88 версий двух пакетов, а вредоносная активность длилась 50 дней - с 7 апреля по 26 мая.

Вредоносное ПО (ВПО) распространяется через механизм postinstall, который запускается автоматически при установке пакета. Если среда разработки (CI) не обнаружена, на машину жертвы загружается полноценный агент удалённого доступа. Он перехватывает нажатия клавиш (кейлоггинг), следит за буфером обмена, сканирует файлы .env и историю команд оболочки, собирает информацию о системе и предоставляет удалённый доступ к файловой системе через WebSocket (постоянное соединение для обмена данными). Периодически агент делает скриншоты рабочего стола и отправляет их через вебхуки Discord (программные обработчики запросов) с использованием нескольких ботов.

Аналитики компании SafeDep, занимающейся безопасностью цепочек поставок, сообщили в своём отчёте, что forge-jsxy отличается высоким качеством реализации. Оператор выпускал новые версии по чёткому графику, добавляя возможности поэтапно. Например, 18 мая сразу шесть версий принесли полный набор для кражи криптовалют: сканер файлов с приватными ключами, поддержку трёх форматов блокчейнов и скрытое копирование агента за пределы каталога node_modules. Это делается специально, чтобы пережить удаление пакета командой npm uninstall.

Особый интерес представляет модуль кражи криптокошельков. Агент обходит все подключённые диски и ищет файлы по десяткам масок: wallet.dat, id.json, *.key, *.mnemonic и другие. Для каждого найденного файла выполняется криптографическая проверка. Мнемонические фразы BIP39 (стандарт записи резервной копии кошелька) проходят проверку контрольной суммы. Ключи Solana (криптовалюта на основе Proof-of-Stake) верифицируются через алгоритм Ed25519. А закрытые ключи для алгоритма secp256k1 (используется в биткоине и Ethereum) проверяются на принадлежность к правильному диапазону скаляров. Такая тщательная валидация необходима, чтобы отсеять ложные срабатывания и получить только реально действующие ключи, которые можно сразу использовать для вывода средств.

Агент также копирует базы данных LevelDB (формат хранения на диске) из профилей 21 браузера на основе Chromium. Речь идёт о расширениях-кошельках, таких как MetaMask, Phantom, Rabby. Скопированные данные загружаются в репозитории на Hugging Face (платформа для моделей машинного обучения), которые контролируются атакующим. Дело в том, что трафик к Hugging Face выглядит как обычный обмен данными, связанный с разработкой ИИ, и редко вызывает подозрения у систем защиты. Кража этих баз данных может дать злоумышленникам доступ к зашифрованным ключам, а если кейлоггер уже перехватил пароль от браузера, то расшифровывать их не составит труда.

Все украденные данные стекаются на один командный сервер (C2) с IP-адресом 204.10.194[.]247, размещённым в немецком Нюрнберге на мощностях провайдера Advin Services LLC. Агент общается с этим сервером через два канала: WebSocket-ретранслятор на порту 9877 и HTTP API на порту 8765. Через эти каналы оператор передаёт на заражённые машины новые версии агента, токены доступа к Hugging Face и команды. Автообновление происходит с задержкой до 6 часов, чтобы не вызвать подозрений массовыми запросами.

Сопоставление с другими известными кампаниями не выявило совпадения индикаторов компрометации с группировками из КНДР, которые также используют npm для распространения шпионского ПО. В отличие от них, создатели forge-jsxy применяют реалистичные западные имена учётных записей, поддерживают покрытие кода тестами (от 12 до 20 тестовых файлов за время кампании) и шифруют конфигурацию C2 с помощью специальной схемы на основе AES-256-GCM с разделением ключа на две части. Такой подход говорит о высоком уровне подготовки и намерении вести долгосрочную операцию.

Каковы последствия для разработчиков, которые установили любой из версий forge-jsx или forge-jsxy? Любой введённый пароль, любой токен в файле .env, любой ключ от криптокошелька - всё это скомпрометировано. Простое удаление пакета не решит проблему, так как на Linux агент сохраняется в каталоге ~/.local/share/cfgmgr/.forge-jsxy/, на macOS - ~/Library/Application Support/CfgMgr/data/.forge-jsxy/, на Windows - %LOCALAPPDATA%\CfgMgr\data\.forge-jsxy\. Кроме того, создаётся служба автозапуска: systemd на Linux, LaunchAgent на macOS, планировщик задач и запись в реестре на Windows. Поэтому требуется ручная очистка этих директорий и удаление сервисов. Криптовалютные активы, которые хранились в расширениях браузера, следует перевести на новые кошельки, созданные на чистой машине.

Учитывая, что после блокировки forge-jsx новый пакет появился в течение нескольких часов, можно ожидать, что и после удаления forge-jsxy оператор зарегистрирует следующую вариацию с тем же функционалом. Разработчикам стоит проявлять крайнюю осторожность при установке пакетов, названия которых похожи на известные библиотеки (в данном случае - опечатка в названии Autodesk Forge SDK). Кампания demon-стрирует, что вредоносные пакеты npm могут развиваться как настоящие программные проекты: с версионированием, тестами и поэтапным расширением возможностей. Игнорировать такую угрозу больше нельзя.

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

IPv4

  • 204.10.194.247

URLs

  • http://204.10.194.247:8765

WebSockets

  • ws://204.10.194.247:9877

SHA256

  • 4938d47fe6216f8f9fee0527bf5112c04c15a9ea62f87869677619aa5400f09f

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