В экосистеме пакетного менеджера npm обнаружена серьёзная угроза для разработчиков, использующих платформу Node.js. Пакет forge-jsx с первой же версии, опубликованной 7 апреля 2026 года, оказался не библиотекой для интеграции с Autodesk Forge, а полноценным инструментом удалённого доступа с функциями шпионажа. Он способен перехватывать каждое нажатие клавиш на любом приложении, отслеживать содержимое буфера обмена, сканировать файловую систему в поисках файлов с переменными окружения (.env), читать историю команд оболочки и открывать постоянный удалённый доступ к файлам через WebSocket. Все собранные данные передаются на IP-адрес 204.10.194[.]247. Специалисты компании SafeDep, проводившие анализ, классифицировали пакет как вредоносный с самого начала его существования - никогда не было легитимной версии, к которой позже добавили бы вредоносную нагрузку.
Описание
Пакет разработан так, чтобы обходить обнаружение в средах непрерывной интеграции (CI). Его скрипты, запускаемые после установки, проверяют наличие переменных окружения, характерных для систем сборки вроде GitHub Actions, GitLab CI, Jenkins или Travis. Если такая среда распознаётся, агент немедленно завершает работу. На обычных компьютерах разработчиков выполнение продолжается. При этом все процессы запускаются скрытно - без вывода сообщений в консоль и без всплывающих окон на Windows, что заметно усложняет визуальное обнаружение.
Закрепление в системе реализовано на всех трёх основных платформах. На Linux создаётся пользовательский systemd-сервис, который перезапускается при сбоях, а также добавляется запись в автозапуск через XDG. На macOS устанавливается агент LaunchAgent. На Windows регистрируется задача в Планировщике заданий и ключ в реестре HKCU. Благодаря этому вредоносный процесс восстанавливается после перезагрузки и после выхода пользователя из сессии. Каждой скомпрометированной машине присваивается уникальный идентификатор, который отправляется в каждом HTTP-запросе к серверу управления - так злоумышленник может связать все данные с конкретной жертвой.
Сбор информации включает несколько механизмов. Во-первых, глобальный перехват нажатий клавиш через системные хуки: низкоуровневый на Windows, X11 Record на Linux и CGEventTap на macOS. Все символы, вводимые в любом приложении, буферизируются и отправляются на сервер после паузы в 1,2 секунды или сразу после нажатия Enter. Во-вторых, буфер обмена опрашивается каждые 400 миллисекунд - любой скопированный текст немедленно утекает. В-третьих, агент сканирует файловую систему, начиная с текущей директории и домашней папки, собирая файлы с тринадцатью разновидностями имени .env. Их содержимое отправляется пакетами по 25 штук, причём для повторяющихся файлов загружается только новая версия. В-четвёртых, извлекается история команд оболочки: .bash_history, .zsh_history, история fish и PowerShell PSReadLine. В-пятых, при первом запуске собирается полный инвентарь системы - имя хоста, версия ОС, версия Node.js и список установленных приложений (через dpkg, rpm или реестр PowerShell).
Но самым опасным компонентом является постоянное WebSocket-соединение к серверу управления. Агент поддерживает канал, через который злоумышленник может просматривать корневые каталоги, читать любые файлы (с разбивкой на фрагменты для больших объектов), архивировать и скачивать целые директории. Доступ защищён вызовом-ответом на основе SHA-256 с паролем, который жёстко зашит в конфигурационном блоке. Сам пароль и адрес сервера хранятся в зашифрованном виде с помощью AES-256 в режиме GCM, а ключ дешифрования замаскирован через операцию XOR между двумя массивами байтов. Интересно, что в коде имеются комментарии разработчиков, которые прямо указывают на то, что они намеренно не сохраняют IP-адрес и порт в открытом виде в аргументах командной строки, чтобы их невозможно было увидеть в выводе ps aux.
Анализ связей показывает, что за пакетом стоят два аккаунта. Первый - johnceballos0716 с почтой johnceballos0716@gmail.com, опубликовавший версии с v1.0.0 по v1.0.6. Второй - johntaohunter с почтой john@taohunter.ai, выпустивший scoped-пакет @johntaohunter/forge-jsx версии v1.0.4 14 апреля. Оба пакета указывают на один и тот же сервер управления. Домен taohunter.ai, согласно данным WHOIS, зарегистрирован на GoDaddy и представляет собой разреженную страницу, имитирующую ИИ-компанию. В коде также присутствуют отсылки к Python-аналогу того же инструментария - упоминаются файлы cfgmgr/table_naming.py и forge-db, что говорит о существовании более широкой закрытой инфраструктуры, не опубликованной в открытых реестрах.
Анализ специалистов SafeDep подтверждает, что на момент исследования ни одна публичная система threat intelligence не связывала этот IP-адрес, эти учётные записи или сам пакет с известными угрозами. Это означает, что кампания могла оставаться незамеченной в течение нескольких дней после публикации.
Разработчикам, установившим любую версию forge-jsx или @johntaohunter/forge-jsx, следует исходить из того, что все ключи API, пароли и секреты, вводимые на заражённой машине, скомпрометированы. Необходимо удалить пользовательский systemd-сервис, агент LaunchAgent или задачу Планировщика Windows, сменить все учётные данные, хранившиеся в .env-файлах, и проверить историю команд оболочки на наличие утёкших паролей. Данный инцидент лишний раз напоминает, что пакеты из реестра npm, даже с безобидными описаниями, могут нести скрытую угрозу, и доверять только проверенным источникам - критически важно для безопасности процесса разработки.
Индикаторы компрометации
IPv4
- 204.10.194.247
URLs
- http://204.10.194.247:8765
WebSocket
- ws://204.10.194.247:9877
SHA256
- 4cb96c3b033c1aaf7b3d0fe54749058f14d4d914947a6d6d430aca108a7daa5a