**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.
