По данным SafeDep, пакет npm imgdecode связан с кампанией MALFEX и скрывает загрузчик в скомпилированном дополнении для Node.js. Его опубликовал аккаунт malfexteste8 30 сентября 2026 года. На момент описания пакет оставался доступен на npm, имел 979 загрузок и последнюю версию 1.0.3. JavaScript-обёртка занимает всего девять строк: когда программа Node.js запускается в консоли Windows и вызывает require('imgdecode'), она загружает DLL. Та пытается получить с GitHub зашифрованный шелл-код, расшифровать его и внедрить в новый процесс dllhost.exe.

MALFEX — название кампании, о которой ранее писали Checkmarx и CloudSEK. Неизвестный злоумышленник, как сообщалось, публикует вредоносные npm-пакеты с 6 августа 2023 года, нацеливаясь на компьютеры под управлением Windows. Среди использовавшихся им аккаунтов издателей были malfexkkj, malfex_user, malfexteste2, malfexteste3 и malfexteste4. Исследователи выявили восемь пакетов: три загружали Overlord RAT, три — cdn-img-fetch, img-to-native и native-runner — вместе доставляли похититель данных на Node.js, а ещё один путь заражения использовал хук postinstall для запуска JavaScript-кода, связывавшегося с внешним сервером и получавшего следующую бинарную нагрузку.
Цепочка с похитителем данных обходилась без хуков установки: вредоносный код запускался при загрузке native-runner. В описании зависимостей указано, что native-runner подключал img-to-native, а у самого img-to-native в зависимостях также значился img-to-native. cdn-img-fetch скачивал из репозитория GitHub cavecrew/proj файл banner.png и извлекал из него зашифрованный блок. Затем img-to-native расшифровывал данные ключом malfexteam2027 и сохранял их как исполняемый файл Go по адресу %APPDATA%\Microsoft\Windows\node_runtime_helper.exe. native-runner запускал этот файл; тот скачивал с 104.234.65[.]75:700 похититель данных setup.exe, также называвшийся movinlike.
После публичных сообщений и удаления пакетов npm злоумышленник, судя по хронологии, выпустил замены для native-runner и img-to-native менее чем через два дня. 28 сентября 2026 года в 16:06 UTC npm удалил оба пакета. 30 сентября в 03:29 вышел imgbundle 1.0.0, сменивший img-to-native, а в 03:37 — runhelper 1.0.0, заменивший native-runner. В тот же день в 16:13 runhelper сняли с публикации. Первая версия imgdecode появилась в 22:32, версия 1.0.1 — в 23:07. В исходном описании перед этой хронологией также есть фрагмент «0.0 published», но определить, к какому событию он относится, невозможно.
runhelper представляли как инструмент для «запуска нативных бинарных файлов в проектах Node.js». По оценке SafeDep, он работал сходно с native-runner и предназначался для исполнения вредоносного кода: находил cdn-img-fetch/.runtime/rt.jpg, извлекал шелл-код, копировал его в исполняемую область памяти и запускал через Koffi — модуль FFI для Node.js. Примерно через шесть часов после снятия runhelper с публикации оператор выпустил imgdecode со скомпилированной DLL для запуска шелл-кода.
В версии imgdecode 1.0.0 пакет ожидал, пока imgbundle запишет файл в cdn-img-fetch/.runtime/, считывал его в память и передавал нативному дополнению Node.js для расшифровки. В версиях 1.0.1 и 1.0.2 DLL уже сама скачивала и расшифровывала нагрузку, но перед её загрузкой код всё ещё вызывал require('imgbundle'). Версия 1.0.2 вышла 1 октября 2026 года в 17:48 UTC. В версии 1.0.3, опубликованной 11 октября в 22:09, зависимость от imgbundle убрали: пакет больше не требовал других компонентов MALFEX. Между этими датами npm удалил imgbundle 7 октября в 23:06 и cdn-img-fetch 8 октября в 13:03.
DLL — 64-разрядный файл Microsoft Visual C++. Она проверяет, запущена ли программа в терминале разработчика, получает из cavecrew/proj файл banner.jpg, расшифровывает встроенную нагрузку ключом nif-runtime-2027 и внедряет результат в dllhost.exe. SafeDep отмечает и механизм отключения: библиотека проверяет первые байты расшифрованных данных и прекращает работу, если видит сигнатуру JPEG или PNG. По предположению исследователей, оператор мог остановить загрузчик, разместив содержимое, которое после расшифровки становилось изображением. Обычная незашифрованная картинка, как правило, не подошла бы: расшифровка завершилась бы ошибкой ещё до проверки сигнатуры.
Аккаунт GitHub cavecrew сейчас недоступен. Однако на снимке страницы в Internet Archive, датированном 6 октября 2026 года, исследователи увидели изображение с тем же загрузчиком на Go. Он получал похититель данных и средство удалённого доступа 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, , Minecraft и Ubisoft. Через WebSocket программа может связываться с C2-сервером и принимать команды на выполнение оболочки, передачу файлов, управление процессами, чтение буфера обмена, создание снимков экрана, а также управление мышью и клавиатурой. Для закрепления в системе она добавляет ключ Run в реестр и создаёт запланированную задачу MicrosoftEdgeUpdateService.
Разработчикам, устанавливавшим любой из описанных пакетов, следует считать Windows-систему потенциально скомпрометированной: изолировать её от сети, проверить механизмы автозапуска и запланированные задачи, сменить учётные данные. Если на компьютере хранились сид-фразы, средства следует перевести на новые кошельки — одной смены паролей в таком случае недостаточно.

Изображение носит иллюстративный характер
MALFEX — название кампании, о которой ранее писали Checkmarx и CloudSEK. Неизвестный злоумышленник, как сообщалось, публикует вредоносные npm-пакеты с 6 августа 2023 года, нацеливаясь на компьютеры под управлением Windows. Среди использовавшихся им аккаунтов издателей были malfexkkj, malfex_user, malfexteste2, malfexteste3 и malfexteste4. Исследователи выявили восемь пакетов: три загружали Overlord RAT, три — cdn-img-fetch, img-to-native и native-runner — вместе доставляли похититель данных на Node.js, а ещё один путь заражения использовал хук postinstall для запуска JavaScript-кода, связывавшегося с внешним сервером и получавшего следующую бинарную нагрузку.
Цепочка с похитителем данных обходилась без хуков установки: вредоносный код запускался при загрузке native-runner. В описании зависимостей указано, что native-runner подключал img-to-native, а у самого img-to-native в зависимостях также значился img-to-native. cdn-img-fetch скачивал из репозитория GitHub cavecrew/proj файл banner.png и извлекал из него зашифрованный блок. Затем img-to-native расшифровывал данные ключом malfexteam2027 и сохранял их как исполняемый файл Go по адресу %APPDATA%\Microsoft\Windows\node_runtime_helper.exe. native-runner запускал этот файл; тот скачивал с 104.234.65[.]75:700 похититель данных setup.exe, также называвшийся movinlike.
После публичных сообщений и удаления пакетов npm злоумышленник, судя по хронологии, выпустил замены для native-runner и img-to-native менее чем через два дня. 28 сентября 2026 года в 16:06 UTC npm удалил оба пакета. 30 сентября в 03:29 вышел imgbundle 1.0.0, сменивший img-to-native, а в 03:37 — runhelper 1.0.0, заменивший native-runner. В тот же день в 16:13 runhelper сняли с публикации. Первая версия imgdecode появилась в 22:32, версия 1.0.1 — в 23:07. В исходном описании перед этой хронологией также есть фрагмент «0.0 published», но определить, к какому событию он относится, невозможно.
runhelper представляли как инструмент для «запуска нативных бинарных файлов в проектах Node.js». По оценке SafeDep, он работал сходно с native-runner и предназначался для исполнения вредоносного кода: находил cdn-img-fetch/.runtime/rt.jpg, извлекал шелл-код, копировал его в исполняемую область памяти и запускал через Koffi — модуль FFI для Node.js. Примерно через шесть часов после снятия runhelper с публикации оператор выпустил imgdecode со скомпилированной DLL для запуска шелл-кода.
В версии imgdecode 1.0.0 пакет ожидал, пока imgbundle запишет файл в cdn-img-fetch/.runtime/, считывал его в память и передавал нативному дополнению Node.js для расшифровки. В версиях 1.0.1 и 1.0.2 DLL уже сама скачивала и расшифровывала нагрузку, но перед её загрузкой код всё ещё вызывал require('imgbundle'). Версия 1.0.2 вышла 1 октября 2026 года в 17:48 UTC. В версии 1.0.3, опубликованной 11 октября в 22:09, зависимость от imgbundle убрали: пакет больше не требовал других компонентов MALFEX. Между этими датами npm удалил imgbundle 7 октября в 23:06 и cdn-img-fetch 8 октября в 13:03.
DLL — 64-разрядный файл Microsoft Visual C++. Она проверяет, запущена ли программа в терминале разработчика, получает из cavecrew/proj файл banner.jpg, расшифровывает встроенную нагрузку ключом nif-runtime-2027 и внедряет результат в dllhost.exe. SafeDep отмечает и механизм отключения: библиотека проверяет первые байты расшифрованных данных и прекращает работу, если видит сигнатуру JPEG или PNG. По предположению исследователей, оператор мог остановить загрузчик, разместив содержимое, которое после расшифровки становилось изображением. Обычная незашифрованная картинка, как правило, не подошла бы: расшифровка завершилась бы ошибкой ещё до проверки сигнатуры.
Аккаунт GitHub cavecrew сейчас недоступен. Однако на снимке страницы в Internet Archive, датированном 6 октября 2026 года, исследователи увидели изображение с тем же загрузчиком на Go. Он получал похититель данных и средство удалённого доступа 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, , Minecraft и Ubisoft. Через WebSocket программа может связываться с C2-сервером и принимать команды на выполнение оболочки, передачу файлов, управление процессами, чтение буфера обмена, создание снимков экрана, а также управление мышью и клавиатурой. Для закрепления в системе она добавляет ключ Run в реестр и создаёт запланированную задачу MicrosoftEdgeUpdateService.
Разработчикам, устанавливавшим любой из описанных пакетов, следует считать Windows-систему потенциально скомпрометированной: изолировать её от сети, проверить механизмы автозапуска и запланированные задачи, сменить учётные данные. Если на компьютере хранились сид-фразы, средства следует перевести на новые кошельки — одной смены паролей в таком случае недостаточно.