TL, д-р
Примерно за два месяцаВ сети вновь появился вредоносный npm-сервис, распространяющий информацию через различные пакеты, но с практически неизмененным содержимым. Изначально он был известен как... forge-jsxy, породил forge-jsx3 / forge-jsx4 братья и сестры, а затем полностью отказались от бренда "Forge", чтобы позиционировать себя как инфраструктуру для разработчиков — сначала zredis-typed, А в последнее время pinokio-redis.
Каждый вариант имеет тот же внутренний набор инструментов: файлы с именами forge-jsx-explorer-*, чтобы relayPackageServe модуль, который обслуживает forge-jsxy-package.tgzа также надежная среда выполнения, скрытая в каталоге, обозначенном точкой, благодаря чему она сохраняется после удаления пакета npm.
Полезная нагрузка содержит следующие данные: материал для криптовалютного кошелька и учетные данные разработчика от хоста и передает их на веб-сайт Discord.hooksПрограмма загружает данные через HuggingFace Hub и имеет жестко заданную конечную точку C2. Она устанавливает автозапуск на уровне ОС, чтобы снова запускаться после перезагрузки, и перехватывает активность буфера обмена, клавиатуры и экрана. Последний вариант, pinokio-redis, позиционирует себя как интеграция с "Autodesk Forge" — описание, не имеющее отношения к тому, что делает код.
| Экосистема | НПМ |
| Класс полезной нагрузки | многоступенчатый информационный шпион + агент дистанционного управления (RAT) |
| Основные цели | Криптовалютные кошельки, расширения для браузерных кошельков, учетные данные разработчика/облачного сервиса |
| Настойчивость | скрытая надежная среда выполнения + автозапуск ОС (сохраняется после удаления пакета) |
| эксфильтрации | сеть раздораhooks + реле, HuggingFace Hub, жестко запрограммированный C2 на порту 9877 |
| Наблюдаемый диапазон | Май 2026 г. – июль 2026 г. (продолжается) |
| Последнее имя | pinokio-redis:1.0.127 |
Анатомия атаки
Все варианты этого семейства устанавливаются одним и тем же способом: в виде пакета. На странице с описанием он выглядит инертным, но объявляет о наличии обработчика postinstall, поэтому Полезная нагрузка запускается в момент установки пакета в качестве зависимости. Крюк приводит в движение пятиступенчатую цепь.
- Этап 1 — материализация. Скрипт установки декодирует закодированный, упакованный файл. Создает объект типа blob и записывает его в набор скриптов среды выполнения в скрытую директорию, расположенную в каталоге конфигурации платформы (в версиях forge-jsxy использовался путь .forge-jsxy/runtime/v, обозначенный точкой). Поскольку эта копия находится вне папки node_modules, удаление или отмена публикации пакета npm не приводит к удалению запущенного агента.
- Этап 2 — проявлять настойчивость. Цепочка регистрирует запись автозапуска ОС, чтобы агент перезапускался при перезагрузке. В Windows это происходит через скрытый диагностический скрипт PowerShell; процесс агента запускается в отсоединенном режиме с параметром windowsHide, поэтому окно консоли не отображается.
- Этап 3 — уклонение. Среда выполнения проверяет наличие маркеров непрерывной интеграции и незаметно завершает работу при обнаружении среды CI, поэтому автоматизированные песочницы сборки ничего не видят. В версиях forge-jsxy в комментарии к исходному коду указывалось, что видимое поле forgeInstall было намеренно опущено в package.json, «потому что это поле будет видно в npm» — оператор намеренно не отображал метаданные триггера в публичном списке.
- Этап 4 — сбор. После запуска агент выполняет сбор данных за один проход:
- Материал для криптокошелька. Входящий в комплект файл secret_filename_patterns.json список целевых файлов запускает проверку файловой системы на наличие файлов wallet.dat и *.memonic /.Файлы .seed / *.phrase, keypair.json, Ethereum UTC – В комплект входят хранилища ключей, а также хранилища ключей в форматах *.p12 / *.pfx / *.jks. Библиотеки для создания кошельков (bip39, secp256k1, base58check и вспомогательные функции Solana) также присутствуют.
- Расширения для браузерных кошельков. Модуль chromiumExtensionDbHarvest считывает локальные базы данных хранилища расширений браузеров Chromium, где расширения-кошельки на основе браузера хранят свои данные хранилища.
- Учетные данные и секреты. Агент сканирует историю командной оболочки и файлы, содержащие секретные данные, считывает учетные данные разработчика/облачной среды, а затем кодирует учетные данные HuggingFace для загрузки.
- Ввод данных в реальном времени. Содержимое буфера обмена, ввод с клавиатуры и снимки экрана фиксируются в непрерывном режиме.
Этап 5 — эксфильтрацияСобранные данные покидают хост тремя способами. Каналы, работающие параллельно: веб-версия Discordhooks (discordWebhookPost) и Программа для загрузки файлов через Discord, которая взаимодействует с `discord.com/api/v10` (discordRelayUpload), загрузки HuggingFace Hub (hfUpload) и Заданная по умолчанию конечная точка C2 доступна через порт 9877. Сервер relayPackageServe Кроме того, модуль возвращает файл forge-jsxy-package.tgz — тот же самый. Название артефакта сохраняется при каждом переименовании.
Важный структурный момент заключается в том, что этапы 1–3 выполняются во время монтажа с Без взаимодействия с пользователем, и на первом этапе полезная нагрузка размещается где-то внутри упаковки. Менеджер не отслеживает. Разработчик, заметивший странную зависимость и При запуске команды npm uninstall удаляется запись, но не агент.
Полезная нагрузка также устойчива к быстрому считыванию. Скрипты среды выполнения не поставляются. В открытом виде: этап кодирования и развертывания сохраняет операционную логику в неизменном виде. закодированный двоичный файл, который преобразуется в читаемые скрипты только после завершения цепочки установки. декодирует его в скрытый каталог среды выполнения. Видимые файлы В описании указаны тонкая прокладка для установки после монтажа и диспергирование материала. Вспомогательная функция — мало что раскрывает о том, что в конечном итоге выполняется. Эта закодированная доставка Дизайн оказал ощутимое влияние на сортировку пациентов: на протяжении всей жизни семьи. С помощью автоматической классификации несколько подтвержденных вариантов были признаны безопасными. А содержимое пакета документов оказалось настолько непрозрачным, что полностью затормозило автоматическую проверку. Поведение, выдающее семью, становится видимым только после того, как оно будет закодировано. Сцена расширяется, и время выполнения считывается напрямую.
Лента
Грузоподъемность семейства оставалась на удивление стабильной; меняется лишь то, что Название на коробке. Дуга идет от открытого клейма «кузница» к маскируясь под несвязанные инструменты для разработчиков.
| Дата (2026) | Пакет: версия | Внимание |
|---|---|---|
| Май (начало) | forge-jsxy:1.0.81, :1.0.90 | Самые ранние подтвержденные варианты — RAT с C2, зашифрованным с помощью AES-256-GCM. |
| Май 19 | forge-jsxy:1.0.92 / 1.0.105 / 1.0.107 / 1.0.108 | Кампания находится в активной стадии публикации; версия 1.0.92 изначально была ошибочно помечена как безопасная и отменена после повторной проверки кода. |
| Конец мая | forge-jsx3 / forge-jsx4:1.0.122 / 1.0.123, zod-pino | Соседние названия пакетов, один и тот же набор инструментов. |
| июнь 4 | forge-jsxy:1.0.120 | Продолжение; классифицировано как безопасное моделью машинного обучения (промах) |
| 21–23 июня | forge-jsxy:1.0.121 | Набор модулей остался без изменений по сравнению с версией 1.0.120. |
| июль 6 | zredis-typed:1.0.127 | Слово «кузница» было исключено из названия; корабли по-прежнему... forge-jsxy-package.tgz и forgeAgent* ключи конфигурации |
| июль 7 | pinokio-redis:1.0.127 | Тот же набор инструментов; новый C2; позиционирует себя как интеграция с "Autodesk Forge". |
В ходе анализа хронологии событий бросаются в глаза две вещи. Во-первых, номер версии 1.0.127 используется дословно как в zredis-typed, так и в pinokio-redis — меняется название, но история сборки не сбрасывается. Во-вторых, отказ от имен типа «forge-*» совпадает с переходом к именам, которые воспринимаются как обычные инфраструктурные (redis, pinokio), что снижает вероятность того, что разработчик, просто взглянув на имя, засомневается.
Показатели компромисса
Приведённые ниже индикаторы компрометации (IOC) дезактивированы. Хост управления и контроля (C2) переключался между строками forge-jsxy. и новейший вариант, сохранивший тот же порт.
| Индикаторные | Значение | Видел в |
|---|---|---|
| Конечная точка C2 | 212.193.3[.]61:9877 | pinokio-redis:1.0.127 |
| Конечная точка C2 | 79.108.162[.]160:9877 | строка forge-jsxy, zredis-typed:1.0.127 |
| канал экс-выхода | discord.com/api/webhooks/… (пост веб-хука) | все варианты |
| канал экс-выхода | discord.com/api/v10 (передача данных) | все варианты |
| канал экс-выхода | Загрузка на HuggingFace Hub | все варианты |
| Поданный артефакт | forge-jsxy-package.tgz (через relayPackageServe) | все варианты |
| Файлы цепочки инструментов | chromiumExtensionDbHarvest, discordRelayUpload, discordWebhookPost, hfUpload, encode-hf-credentials, forge-jsx-explorer-* | все варианты |
| Список целей | secret_filename_patterns.json (wallet.dat, .mnemonic/.seed/.phrase, keypair.json, UTC--, .p12/.pfx/*.jks) | все варианты |
| Скрытая среда выполнения | пунктирный …/.forge-jsxy/runtime/v<version>/ путь к каталогу конфигурации | строка forge-jsxy |
| сохранение состояния Windows | скрытый скрипт автозапуска PowerShell "forge diagnostics". | все варианты |
| Установить триггер | хук postinstall, вызывающий цепочку скриптов dist-materialization. | все варианты |
Наиболее надежный сигнал обнаружения исходит не от какого-либо отдельного хоста или веб-хука, а от тех, которые... поворот — но имена файлов цепочки инструментов и файл forge-jsxy-package.tgz артефакт, который сохранился в неизменном виде при каждом переименовании.
Атрибуция и наблюдаемое поведение
Пакеты были опубликованы под несколькими учетными записями npm. forge-jsxy В строке использовано имя издателя jacksonkaandorp2 (jacksonkaandorp2@outlook[.]com); Последний вариант pinokio-redis был опубликован donimique. (donimiqueakers@gmail[.]com). Ни один из аккаунтов не имел подтвержденного адреса электронной почты. связанное хранилище исходных кодов. Объединяющей нитью между учетными записями является набор инструментов, а не идентификатор издателя — те же названия модулей, те же самые Распространяемые файлы .tgz, и схема извлечения данных повторяется независимо от того, кто их опубликовал.
Некоторые наблюдаемые модели поведения указывают скорее на преднамеренное сокрытие, чем на что-либо другое. случайный избыточный сбор:
Среда выполнения размещается вне папки node_modules в скрытом каталоге, поэтому она существует дольше, чем пакет, который её предоставил.
Агент прекращает работу при обнаружении среды CI, ограничивая риски в автоматизированных аналитических средах.
Процесс агента запускается в автономном режиме. window-hidden.In В версиях forge-jsxy комментарий связывал отсутствие видимого поля установки с тем, что это поле «видимо в npm».
Описания общедоступных пакетов не имеют отношения к коду — pinokio-redis представлен как интеграция с «Autodesk Forge».
Стоит отметить один повторяющийся пробел в обнаружении, на который могут обратить внимание защитники, полагающиеся на Автоматическая классификация: в этой семье было подтверждено несколько вариантов. классификатор машинного обучения оценил код как безопасный до того, как проверка кода внесла исправления. Вердикт. Стабильные элементы, на которые может опираться рецензент — время установки. цепочка, скрытая среда выполнения, имена файлов цепочки инструментов — это именно те, которые которые сохранились после переименований.
Мы описываем вышеописанное как наблюдаемое поведение. Мы не приписываем это поведение каким-либо конкретным лицам. рекламную кампанию для любого указанного участника, и мы не делаем никаких заявлений относительно оператора. идентичность или цели, выходящие за рамки того, что демонстрируют код и инфраструктура.
Влияние, тенденции и рекомендации для защитников
Кто подвергся опасности. Данный набор инструментов ориентирован исключительно на разработчиков. устройства: криптовалютные кошельки и хранилища ключей, расширения для браузерных кошельков, История командной строки и учетные данные облачных сервисов. Любой, кто устанавливает затронутый пакет — напрямую или в качестве транзитивная зависимость — во время Окно, в котором оно работало, находится в пределах допустимых параметров, а архитектура обеспечения постоянного хранения данных означает, что Воздействие не прекращается после извлечения упаковки.
Почему важна настойчивость. Поскольку на первом этапе полезная нагрузка копируется в скрытый каталог среды выполнения и регистры второго этапа автозапуска, обычные инстинктивное исправление (удалить некорректную зависимость, удалить папку node_modules, Переустановка не удаляет агента. Служба реагирования на инциденты должна искать... не только пакет, но и среду выполнения, находящуюся вне основного дерева исходного кода, и запись автозапуска.
Тенденция. Эта семья иллюстрирует закономерность, заслуживающую внимания: Полезная нагрузка, стабильная и отработанная, упакованная в поток одноразовых материалов.Названия пакетов, которые отличаются от названий, использованных при предыдущем удалении. Узнаваемые, ориентированные на названия, которые воспринимаются как обычные объекты инфраструктуры. Названия, основанные на именах. В таких условиях списки заблокированных пользователей и репутация издателей быстро устаревают; поведение а сигналы, основанные на артефактах, — нет.
Для разработчиков и потребителей
Рассматривайте скрипты, используемые во время установки, как основной источник риска. Устанавливайте систему с отключенными скриптами, где это возможно, и проверяйте все зависимости, которые объявляют о наличии скриптов. после установки. Проверяйте и отслеживайте транзитивные зависимости; этот класс вредоносных программ может проникнуть в систему как через подзависимости, так и напрямую.
На подозрительном хосте поищите проблему за пределами пакета: поищите скрытый каталог среды выполнения в расположении конфигурации платформы, неожиданную запись автозапуска, и исходящие соединения с веб-перехватчиком Discord или конечными точками :9877.
Предположим, что любая сид-фраза кошелька, хранилище ключей или учетные данные, присутствующие на затронутом хосте в течение периода уязвимости, скомпрометированы, и выполните ротацию.
Для реестров и защитников
Предупреждение о постоянных артефактах (forge-jsxy-package.tgz, forge-jsx-explorer-* / chromiumExtensionDbHarvest / discordRelayUpload) имена файлов, а не имя пакета, которое меняется.
Укажите структурную комбинацию, на которую опирается семейство программ — пост-установка, которая размещает скрипты в скрытом пути к каталогу конфигурации, плюс операционная система. Автозапуск регистрации — независимо от используемых строк.
Название на упаковке менялось как минимум четыре раза; содержимое ящика также менялось. Это не так. Система обнаружения, основанная на работе кода, пережила все предыдущие. Пока что это переименование.





