Перейти к содержанию
Tech Threat Lab
TTL

В npm выявлен пакет imgdecode, связанный с кампанией MALFEX

В npm выявлен пакет imgdecode, связанный с кампанией MALFEX

Исследователи обнаружили в npm вредоносный пакет imgdecode, связанный с кампанией MALFEX. При вызове require('imgdecode') он использует скомпилированное нативное дополнение Node.js для Windows: DLL загружает с GitHub зашифрованную полезную нагрузку, расшифровывает её и внедряет в новый процесс dllhost.exe.

По данным SafeDep, пакет опубликовал 30 сентября 2026 года пользователь malfexteste8. На момент исследования imgdecode оставался доступен в npm, последней версией была 1.0.3, а число скачиваний достигло 979. В рассмотренном источнике не приведены сведения о целевых атаках на российские организации. Отсутствие таких сведений не исключает компрометацию российских Windows-окружений при установке пакета: разработчикам стоит проверить, не попал ли он в Windows-сборки или рабочие окружения.

Связь с MALFEX

Кампанию MALFEX ранее документировали Checkmarx и CloudSEK. Как минимум с 6 августа 2023 года неизвестный оператор публикует вредоносные npm-пакеты, рассчитанные на компрометацию Windows-систем. До появления imgdecode эти пакеты выходили от имени пяти npm-аккаунтов: malfexkkj, malfex_user, malfexteste2, malfexteste3 и malfexteste4.

Из восьми выявленных пакетов три выполняли роль загрузчиков RAT Overlord. Ещё три — cdn-img-fetch, img-to-native и native-runner — составляли цепочку загрузки и запуска стилера для Node.js. В отдельном варианте заражения использовался post-install hook: он запускал JavaScript-код, который связывался с внешним сервером и получал неуказанный бинарный файл следующей стадии.

По наблюдениям исследователей, оператор быстро заменял удалённые пакеты. После блокировки native-runner и img-to-native в npm появились runhelper и imgbundle, а затем — imgdecode.

Хронология этой части кампании:

  • 26 сентября 2026 года опубликованы cdn-img-fetch, img-to-native и native-runner версии 1.0.0;
  • 28 сентября в 16:06 UTC npm удалил native-runner и img-to-native;
  • 30 сентября в 03:29 UTC опубликован imgbundle 1.0.0 как замена img-to-native;
  • 30 сентября в 03:37 UTC опубликован runhelper 1.0.0 как замена native-runner;
  • 30 сентября в 16:13 UTC runhelper был удалён;
  • 30 сентября в 22:32 UTC опубликован imgdecode 1.0.0;
  • 30 сентября в 23:07 UTC выпущен imgdecode 1.0.1;
  • 1 октября в 17:48 UTC опубликован imgdecode 1.0.2;
  • 7 октября в 23:06 UTC npm удалил imgbundle;
  • 8 октября в 13:03 UTC npm удалил cdn-img-fetch;
  • 11 октября в 22:09 UTC вышел imgdecode 1.0.3.

Предыдущая цепочка загрузки

Цепочка со стилером для Node.js не использовала установочные хуки в самих пакетах. Вредоносная логика запускалась при загрузке native-runner. Этот пакет указывал img-to-native в зависимостях; при этом у img-to-native также была указана зависимость img-to-native.

Компоненты выполняли разные роли:

  • cdn-img-fetch скачивал файл banner[.]png из GitHub-репозитория cavecrew/proj и извлекал из него зашифрованный блок данных;
  • img-to-native расшифровывал этот блок ключом malfexteam2027 и записывал результат на диск как исполняемый Go-файл %APPDATA%\Microsoft\Windows\node_runtime_helper.exe;
  • native-runner запускал этот Go-файл, после чего тот загружал бинарный стилер setup.exe, также известный как movinlike, с 104.234.65[.]75:700.

Пакет runhelper позиционировался как вспомогательная утилита для запуска нативных бинарников из Node.js-проектов. Однако, согласно выводам исследователей, его назначением было выполнение вредоносного кода. Runhelper искал JPG-файл cdn-img-fetch/.runtime/rt.jpg, извлекал из него шелл-код, копировал его в память исполняемого файла и запускал через Koffi — FFI-модуль для Node.js.

При планировании таких работ можно отдельно изучить в разделе услуг ИТБ по информационной безопасности доступные направления и сопоставить их с задачами своей организации.

Переход к imgdecode

SafeDep сообщает, что примерно через шесть часов после удаления runhelper оператор опубликовал imgdecode с DLL, скомпилированной для запуска шелл-кода. В версии 1.0.0 пакет ожидал, пока imgbundle создаст файл в каталоге cdn-img-fetch/.runtime/, затем читал данные в память и передавал их нативному дополнению Node.js для декодирования.

Нативное дополнение представляет собой 64-разрядную DLL, собранную Microsoft Visual C++. Сначала она проверяет, запущена ли в терминале разработчика. Затем DLL загружает banner[.]jpg из того же репозитория cavecrew/proj, расшифровывает встроенные данные ключом nif-runtime-2027 и внедряет результат в dllhost.exe.

Начиная с imgdecode 1.0.1 DLL стала самостоятельно загружать и расшифровывать полезную нагрузку. Версии 1.0.1 и 1.0.2 перед загрузкой DLL всё ещё выполняли require('imgbundle'). В версии 1.0.3 эта зависимость устранена: для работы пакета больше не требуются другие компоненты MALFEX.

После расшифровки DLL проверяет первые байты открытого текста. Если они соответствуют сигнатуре JPEG или PNG, выполнение прекращается. По оценке SafeDep, это могло дать оператору способ отключить загрузчик: достаточно передать зашифрованный контент, который после расшифровки окажется изображением. Передача обычного изображения, напротив, обычно должна вызвать ошибку расшифровки ещё до этой проверки.

К моменту исследования аккаунт cavecrew на GitHub был недоступен. Однако архивный снимок изображения от 6 октября 2026 года показал, что в нём находился тот же Go-загрузчик, который использовался для получения стилера Node.js и инструмента удалённого доступа movinlike с 104.234.65[.]75:700.

Возможности полезной нагрузки

В приложении Node.js исследователи нашли файл .env с адресом C2 104.234.65[.]75:7007 и лицензионным ключом MALFEX. По их оценке, это указывает на использование конструктора вредоносного ПО либо системы лицензирования для выпуска таких полезных нагрузок.

Вредоносная программа проверяет наличие виртуальных машин, песочниц и средств анализа, включая Process Monitor и Wireshark. Затем она собирает файлы, соответствующие определённым начальным фразам, а также файлы с расширениями .kdbx, .pem, .ppk и .env. Целями также становятся данные браузеров на базе Chromium, Discord, Telegram, криптовалютных кошельков и игровых приложений Steam, Epic Games, Riot, Battle[.]net, Minecraft и Ubisoft.

Через WebSocket-соединение с C2 программа может получать команды на запуск командной оболочки, передачу файлов, управление процессами, доступ к буферу обмена, создание снимков экрана и получение ввода с мыши и клавиатуры. Для закрепления она создаёт ключ Run в реестре Windows и запланированную задачу MicrosoftEdgeUpdateService.

Что проверить

SafeDep рекомендует разработчикам, у которых были установлены перечисленные пакеты, исходить из потенциальной компрометации Windows-систем. Такие хосты следует изолировать, проверить наличие механизмов закрепления, включая ключи Run и задачу MicrosoftEdgeUpdateService, а также сменить учётные данные. Если на машине хранились seed-фразы криптокошельков, средства следует перевести в новые кошельки.

Практический вывод состоит в том, что imgdecode версии 1.0.3 больше не зависит от других известных пакетов MALFEX. Поэтому проверку зависимостей нельзя ограничивать ранее удалёнными cdn-img-fetch, img-to-native, native-runner, runhelper и imgbundle. Необходимо отдельно искать imgdecode и оценивать все Windows-окружения, где этот пакет мог быть загружен или вызван.