🛡 MALWARE 🛡

Paquete MALFEX de npm 'imgdecode' oculta un cargador de shellcode en un complemento nativo de Windows.

🛡CyberObservatorio
Paquete MALFEX de npm 'imgdecode' oculta un cargador de shellcode en un complemento nativo de Windows.
Idioma

Paquete MALFEX de npm 'imgdecode' oculta un cargador de shellcode en un complemento nativo de Windows.

Fuente: The Hacker News

**Descubrimiento de un Paquete Malicioso en npm: La Amenaza del MALFEX**

En un contexto donde la seguridad cibernética es cada vez más crítica, investigadores han identificado un paquete malicioso en el registro de npm que forma parte de una campaña reciente de ataque a la cadena de suministro de software conocida como MALFEX. Esta situación resalta la vulnerabilidad de los entornos de desarrollo y la importancia de una vigilancia constante ante las amenazas de seguridad que pueden comprometer sistemas operativos e infraestructuras digitales.

El paquete en cuestión, denominado "imgdecode", fue subido al registro de npm el 30 de septiembre de 2026 por un usuario que opera bajo el seudónimo "malfexteste8". Hasta la fecha de este informe, el paquete había sido descargado 979 veces y aún se encontraba disponible en npm. La versión más reciente de este paquete es 1.0.3. Este tipo de incidentes subraya la necesidad de que desarrolladores y empresas adopten prácticas de seguridad rigurosas para proteger sus aplicaciones y sistemas de posibles compromisos.

De acuerdo con el análisis realizado por SafeDep, "el paquete npm imgdecode oculta un cargador malicioso en un complemento compilado de Node.js". El archivo JavaScript, que solo consta de nueve líneas, carga una biblioteca de enlace dinámico (DLL) de Windows. Cuando un programa de Node.js llama a `require('imgdecode')` desde una consola de Windows, la DLL intenta descargar un código shell cifrado desde GitHub, lo desencripta e inyecta el resultado en un nuevo proceso llamado dllhost.exe.

La campaña MALFEX fue documentada por primera vez por Checkmarx y CloudSEK, quienes han atribuido a un actor de amenazas desconocido la publicación de paquetes maliciosos en npm desde el 6 de agosto de 2023, con el objetivo de comprometer sistemas Windows. Estos paquetes fueron distribuidos a través de cinco identificadores de publicación en npm: malfexkkj, malfex_user, malfexteste2, malfexteste3 y malfexteste4.

De los ocho paquetes identificados, tres actuaron como cargadores para el RAT (Remote Access Trojan) denominado Overlord, mientras que otros tres, específicamente "cdn-img-fetch", "img-to-native" y "native-runner", colaboraron para descargar y ejecutar un ladrón de información basado en Node.js. Un tercer camino de infección implicó el uso de un gancho postinstalación para ejecutar un JavaScript capaz de contactar a un servidor externo y recuperar un binario no especificado para la siguiente fase del ataque.

Es particularmente preocupante que el actor detrás de esta campaña parece estar respondiendo a las divulgaciones y eliminaciones públicas en npm, publicando reemplazos para "native-runner" e "img-to-native" en un lapso de dos días, bajo las denominaciones "runhelper" e "imgbundle". Ese mismo día se publicó la primera versión de "imgdecode", lo que indica una rápida adaptación y persistencia por parte del atacante.

La cronología de eventos es la siguiente:

- 26 de septiembre de 2026: Se publican las versiones 1.0.0 de cdn-img-fetch, img-to-native y native-runner. - 28 de septiembre de 2026, a las 16:06 UTC: npm elimina native-runner y img-to-native. - 30 de septiembre de 2026, a las 03:29 UTC: Se publica imgbundle 1.0.0 como reemplazo de img-to-native. - 30 de septiembre de 2026, a las 03:37 UTC: Se publica runhelper 1.0.0 como reemplazo de native-runner. - 30 de septiembre de 2026, a las 16:13 UTC: runhelper es eliminado. - 30 de septiembre de 2026, a las 22:32 UTC: Se publica imgdecode 1.0.0. - 30 de septiembre de 2026, a las 23:07 UTC: Se publica imgdecode 1.0.1. - 1 de octubre de 2026, a las 17:48 UTC: Se publica imgdecode 1.0.2. - 7 de octubre de 2026, a las 23:06 UTC: npm elimina imgbundle. - 8 de octubre de 2026, a las 13:03 UTC: npm elimina cdn-img-fetch. - 11 de octubre de 2026, a las 22:09 UTC: Se publica imgdecode 1.0.3.

El ladrón de información basado en Node.js es notable porque ninguno de los paquetes presenta un gancho de instalación. En cambio, el código malicioso se ejecuta cuando se carga "native-runner". Este paquete lista "img-to-native" como su dependencia, que a su vez depende de "img-to-native".

El funcionamiento exacto de cada uno de estos paquetes es el siguiente:

El paquete "cdn-img-fetch" descarga "banner.png" de un repositorio de GitHub ("cavecrew/proj") y extrae un blob cifrado.

"img-to-native" desencripta el blob utilizando la clave "malfexteam2027" y escribe el contenido en el disco como un ejecutable de Go ("%APPDATA%\Microsoft\Windows\node_runtime_helper.exe").

"native-runner" ejecuta el ejecutable de Go, que a su vez descarga el binario ladrón ("setup.exe", también conocido como movinlike) desde "104.234.65[.]75:700".

Por su parte, "runhelper", promocionado como una utilidad auxiliar para "lanzar binarios nativos desde proyectos de Node.js", funciona de manera similar a "native-runner", pues está diseñado para ejecutar código malicioso. Su función principal es localizar un archivo JPG ("cdn-img-fetch/.runtime/rt.jpg"), extraer código shell de él, copiarlo en memoria ejecutable y ejecutarlo utilizando Koffi, un módulo de Interfaz de Funciones Externas (FFI) para Node.js.

SafeDep destaca que "seis horas después de que runhelper fue eliminado, el operador publicó imgdecode con una DLL compilada para ejecutar el código shell". Desde la versión 1.0.1, la DLL también descarga y desencripta la carga útil. Las versiones 1.0.1 y 1.0.2 aún llaman a `require('imgbundle')` antes de cargar la DLL, mientras que la versión 1.0.3 elimina esa dependencia y no necesita ningún otro paquete de MALFEX.

Al igual que en el caso de "runhelper", la versión 1.0.0 de "imgdecode" espera a que "imgbundle" escriba un archivo en la ubicación "cdn-img-fetch/.runtime/" y, una vez que este está disponible, lee su contenido en memoria y lo pasa a un complemento nativo de Node.js para decodificar los datos.

El complemento es una DLL de Microsoft Visual C++ (MSVC) de 64 bits que primero verifica si se está ejecutando en el terminal de un desarrollador y luego procede a obtener un archivo JPG ("banner.jpg") del mismo repositorio ("cavecrew/proj"), desencripta la carga útil embebida utilizando la clave "nif-runtime-2027" y, finalmente, inyecta la salida en "dllhost.exe".

SafeDep explica que "después de la desencriptación, la DLL verifica los primeros bytes del texto plano". Si coinciden con una firma de JPEG o PNG, la DLL se detiene. Esto sugiere que el operador podría desactivar el cargador al servir contenido cifrado que se desencripta como una imagen, mientras que servir una imagen ordinaria generalmente causaría que la desencriptación fallara antes de esta verificación.

Aunque la cuenta de GitHub "cavecrew" ya no es accesible, una captura de pantalla del Archivo de Internet de la imagen fechada el 6 de octubre de 2026 muestra que es el mismo descargador basado en Go utilizado para recuperar el ladrón de Node.js y la herramienta de acceso remoto ("movinlike") desde "104.234.65[.]75:700".

La aplicación de Node.js incluye un archivo .env que contiene una dirección de comando y control (C2) ("104.234.65[.]75:7007") y una clave de licencia de MALFEX, lo que indica el uso de un generador de malware o sistema de licencias para crear tales cargas útiles.

Además, el malware realiza verificaciones anti-análisis que auditan la presencia de máquinas virtuales, sandboxes y herramientas de análisis como Process Monitor y Wireshark, antes de cosechar archivos que coincidan con frases semilla y extensiones específicas (.kdbx, .pem, .ppk y .env), así como datos de navegadores web basados en Chromium, Discord, Telegram, billeteras de criptomonedas y aplicaciones de juegos (Steam, Epic Games, Riot, Battle.net, Minecraft y Ubisoft).

El malware también puede establecer una conexión WebSocket con el servidor C2, lo que le permite aceptar comandos para la ejecución de shell, transferencia de archivos, control de procesos, acceso al portapapeles, captura de pantallas e interacción con el teclado y el ratón. Para mantener la persistencia, agrega una clave de ejecución en el Registro y crea una tarea programada llamada "MicrosoftEdgeUpdateService".

Ante esta alarmante situación, se recomienda a los desarrolladores que hayan instalado alguno de los paquetes mencionados que consideren sus sistemas Windows como potencialmente comprometidos, los aíslen, verifiquen la existencia de entradas de persistencia, roten credenciales y transfieran fondos a nuevas billeteras si se almacenaron frases semilla en ellas. La prevención y la pronta respuesta son esenciales para mitigar el impacto de estas amenazas en el ecosistema digital.

MALFEX npm Package 'imgdecode' Hides Shellcode Loader in Windows Native Addon

Source: The Hacker News

Cybersecurity researchers have discovered a malicious npm package that's part of a recently disclosed software supply chain attack campaign dubbedMALFEX. The package, named "imgdecode," was uploaded to the package registry on September 30, 2026, by a user named "malfexteste8." It has been downloaded979 timesas of writing and is still available on npm as of writing. The latest version of the package is 1.0.3. "The npm package imgdecode hides a malicious loader in a compiled Node.js addon," SafeDepsaid. "Its nine-line JavaScript file loads a Windows dynamic-link library (DLL). When a Node.js program calls require('imgdecode') from a Windows console, the DLL attempts to download encrypted shellcode from GitHub. It decrypts the response and injects the result into a new dllhost.exe process." Firstdocumentedby both Checkmarx and CloudSEK, MALFEX is the name assigned to a long-running campaign in which an unknown threat actor has been publishing malicious packages to npm since August 6, 2023, with an aim to compromise Windows systems. These packages were published across five npm publisher handles: malfexkkj, malfex_user, malfexteste2, malfexteste3, malfexteste4. Of the eight identified packages, three were found to act as a loader for Overlord RAT, while three others ("cdn-img-fetch," "img-to-native," and "native-runner") worked together to download and run a Node.js stealer. A third infection pathway involved the use of a postinstall hook to execute JavaScript capable of contacting an external server and retrieving an unspecified next-stage binary. Interestingly, the threat actor behind the campaign appears to be responding to public disclosures and npm removals by publishing replacements for "native-runner" and "img-to-native" within two days in the form of "runhelper" and "imgbundle." That same day, the first version of "imgdecode" was published. The timeline of events is as follows - September 26, 2026 - cdn-img-fetch, img-to-native, and native-runner 1.0.0 published September 28, 2026, at 4:06 p.m. UTC - npm removes native-runner and img-to-native September 30, 2026, at 3:29 a.m. UTC - imgbundle 1.0.0 published, replacing img-to-native September 30, 2026, at 3:37 a.m. UTC - runhelper 1.0.0 published, replacing native-runner September 30, 2026, at 4:13 p.m. UTC - runhelper unpublished September 30, 2026, at 10:32 p.m. UTC - imgdecode 1.0.0 published September 30, 2026, at 11:07 p.m. UTC - imgdecode 1.0.1 published October 1, 2026, at 5:48 p.m. UTC - imgdecode 1.0.2 published October 7, 2026, at 11:06 p.m. UTC - npm removes imgbundle October 8, 2026, at 1:03 p.m. UTC - npm removes cdn-img-fetch October 11, 2026, at 10:09 p.m. UTC - imgdecode 1.0.3 published The Node.js stealer chain is notable for the fact that none of the packages featured an install hook. Instead, the malicious code runs when "native-runner" is loaded. The package lists "img-to-native" as its dependency, which, in turn, has "img-to-native" as a dependency. The exact functionality of each of these packages is below - cdn-img-fetch downloads "banner.png" from a GitHub repository ("cavecrew/proj") and extracts an encrypted blob. img-to-native decrypts the blob using the key "malfexteam2027" and writes the contents to disk as a Go executable ("%APPDATA%\Microsoft\Windows\node_runtime_helper.exe"). native-runner executes the Go executable, which then downloads the stealer binary ("setup.exe" aka movinlike) from "104.234.65[.]75:700." "Runhelper," advertised as a helper utility for "launching native binaries from Node.js projects," functions similarly to "native-runner" in that it's designed to run malicious code. Its primary responsibility is to locate a JPG file ("cdn-img-fetch/.runtime/rt.jpg"), extract shellcode from it, copy it into executable memory, and run it usingKoffi, a Foreign Function Interface (FFI) module for Node.js. "Six hours after runhelper was unpublished, the operator published imgdecode with a compiled DLL to run the shellcode," SafeDep said. "From version 1.0.1, the DLL also downloads and decrypts the payload. Versions 1.0.1 and 1.0.2 still call require('imgbundle') before loading the DLL. Version 1.0.3 removes that dependency and needs no other MALFEX package." Like in the case of "runhelper," version 1.0.0 of "imgdecode" waits for "imgbundle" to write a file at the location "cdn-img-fetch/.runtime/" and, once it becomes available, reads its contents into memory, and passes them to a native Node.js addon for decoding the data. The addon is a 64-bit Microsoft Visual C++ (MSVC) DLL that first checks if it's running in a developer's terminal, and then proceeds to fetch a JPG file ("banner.jpg") from the same repository ("cavecrew/proj"), decrypt the embedded payload using the key "nif-runtime-2027," and ultimately inject the output into "dllhost.exe." "After decryption, the DLL checks the first bytes of the plaintext," SafeDep explained. "If they match a JPEG or PNG signature, the DLL stops. Inference: the operator could turn the loader off by serving encrypted content that decrypts to an image. Serving an ordinary image would instead generally cause decryption to fail before this check." Although the GitHub account "cavecrew" is no longer accessible, an Internet Archive screenshot of the image file dated October 6, 2026, shows that it's the same Go-based downloader used for retrieving the Node.js stealer and remote access tool ("movinlike") from "104.234.65[.]75:700." The Node.js application includes a .env file containing a command-and-control (C2) address ("104.234.65[.]75:7007") and a MALFEX license key, indicating the use of a malware builder or licensing system to craft such payloads. The malware runs anti-analysis checks that audit for the presence of virtual machines, sandboxes, and analysis tools like Process Monitor and Wireshark, before harvesting files matching seed phrases and specific extensions (.kdbx, .pem, .ppk, and .env), as well as data from Chromium-based web browsers, Discord, Telegram, cryptocurrency wallets, and gaming apps (Steam, Epic Games, Riot, Battle.net, Minecraft, and Ubisoft). It can also establish a WebSocket connection to the C2 server, allowing it to accept commands for shell execution, file transfer, process control, clipboard access, screenshots, and mouse and keyboard input. For persistence, it adds a Registry Run key and creates a scheduled task named "MicrosoftEdgeUpdateService." Developers who have installed any of the aforementioned packages should treat their Windows systems as potentially compromised, isolate them, check for persistence entries, rotate credentials, and transfer funds to new wallets if seed phrases were stored in them.

Paquete MALFEX de npm 'imgdecode' oculta un cargador de shellcode en un complemento nativo de Windows. | Ciberseguridad - NarcoObservatorio