forge-jsxy npm Infostealer: Guía de detección e indicadores de compromiso (IOC)

forge-jsxy: El ladrón de información de npm que no deja de cambiar de nombre.

TL; DR

Por aproximadamente dos meses, un único ladrón de información de npm ha resurgido bajo una serie rotativa de nombres de paquetes mientras distribuye una carga útil casi sin cambios. Comenzó abiertamente como forge-jsxy, engendrado forge-jsx3 / forge-jsx4 hermanos, luego abandonaron por completo la marca "forja" para hacerse pasar por infraestructura de desarrolladores, primero zredis-typed, Y más recientemente pinokio-redis.

Cada variante lleva el misma cadena de herramientas internas: archivos llamados forge-jsx-explorer-*, una relayPackageServe módulo que sirve para un forge-jsxy-package.tgzy un entorno de ejecución duradero oculto bajo un directorio con puntos para que sobreviva a la eliminación del paquete npm.

La carga útil dice Material para billeteras de criptomonedas y las credenciales de desarrollador del host y las transmite a Discord webhooks, HuggingFace Hub carga archivos y un punto final C2 codificado. Instala el inicio automático a nivel del sistema operativo para que se ejecute de nuevo después del reinicio y captura la actividad del portapapeles, el teclado y la pantalla. La última variante, pinokio-redisSe describe a sí misma como una integración de "Autodesk Forge", una descripción que no guarda relación con lo que hace el código.

Ecosistemanpm
Clase de carga útilAgente de robo de información multietapa + agente de control remoto (RAT)
Objetivos principalesmonederos de criptomonedas, extensiones de monedero para navegador, credenciales de desarrollador/en la nube
PersistenciaEntorno de ejecución persistente oculto + inicio automático del sistema operativo (sobrevive a la eliminación del paquete)
exfiltraciónweb de discordiahooks + relé, HuggingFace Hub, C2 codificado en el puerto 9877
Lapso observadoMayo de 2026 – Julio de 2026 (en curso)
Último nombrepinokio-redis:1.0.127

Anatomía del ataque

Cada variante de esta familia se instala mediante la misma forma: un paquete que parece inerte en su página de listado pero declara un gancho postinstalación, por lo que La carga útil se ejecuta en el momento en que el paquete se instala como dependencia. El gancho acciona una cadena de cinco etapas.

  • Etapa 1: materializarse. El script de instalación decodifica un archivo empaquetado y codificado. blob en un conjunto de scripts de tiempo de ejecución y los escribe en un directorio oculto bajo la ubicación de configuración de la plataforma (las versiones de forge-jsxy usaban un .forge-jsxy/runtime/v con puntos / ruta). Debido a que esta copia se encuentra fuera de node_modules, eliminar o anular la publicación del paquete npm no elimina el agente en ejecución.
  • Etapa 2: persistir. La cadena registra una entrada de inicio automático del sistema operativo para que el agente se reinicie al reiniciar el equipo. En Windows, esto se ejecuta mediante un script de diagnóstico oculto de PowerShell; el proceso del agente se inicia de forma independiente y con la propiedad windowsHide activada, por lo que no aparece ninguna ventana de consola.
  • Etapa 3: evadir. El entorno de ejecución comprueba los marcadores de integración continua y finaliza silenciosamente cuando detecta un entorno de CI, por lo que los entornos de compilación automatizados no ven nada. En las versiones de forge-jsxy, un comentario en el código fuente indicaba que se había omitido deliberadamente un campo visible forgeInstall de package.json "porque ese campo sería visible en npm"; el operador mantuvo los metadatos del activador fuera de la lista pública a propósito.
  • Etapa 4 — recolectar. Una vez en funcionamiento, el agente recolecta, en una sola pasada:
  1. Material para monederos de criptomonedas. Una lista de objetivos Secreto_filename_patterns.json empaquetada impulsa un escaneo del sistema de archivos para wallet.dat, *.mnemonic /Archivos .seed / *.phrase, keypair.json, Ethereum UTC– Almacenes de claves y almacenes de claves *.p12 / *.pfx / *.jks. Las bibliotecas de derivación de billetera (bip39, secp256k1, base58check y auxiliares de Solana) están presentes en el paquete.
  2. Extensiones de monedero para navegador. El módulo chromiumExtensionDbHarvest lee las bases de datos locales de almacenamiento de extensiones de los navegadores Chromium, el lugar donde las extensiones de billetera basadas en el navegador guardan sus datos de bóveda.
  3. Credenciales y Secretos. El agente escanea el historial de la consola y los archivos que contienen Secreto, lee las credenciales de desarrollador/nube y, a continuación, codifica las credenciales de HuggingFace para su carga.
  4. Entrada en directo. El contenido del portapapeles, la entrada del teclado y las capturas de pantalla se registran de forma continua.
  • Etapa 5 — exfiltraciónLos datos recopilados salen del host a través de tres Canales que operan en paralelo: Discord webhooks (discordWebhookPost) y un cargador de relés de Discord que habla con `discord.com/api/v10` (discordRelayUpload), cargas de HuggingFace Hub (hfUpload) y una Se alcanzó el punto final C2 codificado a través del puerto 9877. Un servidor de paquetes de retransmisión. El módulo también sirve un archivo forge-jsxy-package.tgz de vuelta, el mismo nombre del artefacto en cada cambio de nombre.

El punto estructural importante es que las etapas 1 a 3 se ejecutan en el momento de la instalación con sin interacción del usuario, y la etapa 1 coloca la carga útil en algún lugar del paquete. El administrador no realiza seguimiento. Un desarrollador que nota la extraña dependencia y Al ejecutar npm uninstall se elimina el listado, pero no el agente.

La carga útil también dificulta una lectura rápida. Los scripts de tiempo de ejecución no se incluyen. en claro: un paso de codificación-despliegue mantiene la lógica operativa como un blob codificado que solo se expande en scripts legibles una vez que la cadena de instalación lo decodifica en el directorio de tiempo de ejecución oculto. Los archivos que son visibles en el listado: la lámina delgada posterior a la instalación y una materialización de distribución ayudante: revela poco sobre lo que finalmente se ejecuta. Esta entrega codificada El diseño ha tenido un efecto medible en el triaje: a lo largo de la vida de la familia, Múltiples variantes confirmadas fueron calificadas como seguras mediante clasificación automatizada, y la carga útil ha sido lo suficientemente opaca como para paralizar por completo la revisión automatizada. Los comportamientos que delatan a la familia solo son visibles después de la codificación. La etapa se expande y el tiempo de ejecución se lee directamente.

Cronograma

La carga útil de la familia se ha mantenido notablemente estable; lo que cambia es la nombre en la caja. El arco va desde la marca "forja" abierta hacia Se disfraza de herramientas de desarrollo no relacionadas.

Fecha (2026) Paquete: versión Nota:
Mayo (principios) forge-jsxy:1.0.81, :1.0.90 Variantes confirmadas más tempranas: RAT con C2 cifrado AES-256-GCM
19 de mayo forge-jsxy:1.0.92 / 1.0.105 / 1.0.107 / 1.0.108 Campaña en fase de publicación activa; la versión 1.0.92 fue inicialmente etiquetada erróneamente como segura y revertida tras una nueva revisión del código.
A finales de mayo forge-jsx3 / forge-jsx4:1.0.122 / 1.0.123, zod-pino Nombres de paquetes hermanos, misma cadena de herramientas
jun 4 forge-jsxy:1.0.120 Continuación; clasificado como seguro por el modelo ML (un fallo)
21–23 de junio forge-jsxy:1.0.121 El conjunto de módulos permanece sin cambios desde la versión 1.0.120.
jul 6 zredis-typed:1.0.127 "forja" se eliminó del nombre; todavía se envían barcos forge-jsxy-package.tgz y forgeAgent* claves de configuración
jul 7 pinokio-redis:1.0.127 Misma cadena de herramientas; nuevo C2; se describe a sí mismo como una integración de "Autodesk Forge".

Dos aspectos destacan a lo largo de la cronología. Primero, el número de versión 1.0.127 se reutiliza textualmente tanto en zredis-typed como en pinokio-redis: la nomenclatura cambia, pero el linaje de compilación no se reinicia. Segundo, el abandono de los nombres "forge-*" coincide con un cambio hacia nombres que se leen como infraestructura común (redis, pinokio), lo que reduce la probabilidad de que un desarrollador lea el nombre superficialmente y dude.

Indicadores de compromiso

Los IOC que aparecen a continuación están desactivados. El host C2 rotó entre la línea forge-jsxy. y la última variante manteniendo el mismo puerto.

Indicador Valor Visto en
Punto final C2 212.193.3[.]61:9877 pinokio-redis:1.0.127
Punto final C2 79.108.162[.]160:9877 línea forge-jsxy, zredis-typed:1.0.127
Canal de exfiltración discord.com/api/webhooks/… (publicación de webhook) todas las variantes
Canal de exfiltración discord.com/api/v10 (carga de relé) todas las variantes
Canal de exfiltración Carga de HuggingFace Hub todas las variantes
Artefacto servido forge-jsxy-package.tgz (a través de relayPackageServe) todas las variantes
Archivos de la cadena de herramientas chromiumExtensionDbHarvest, discordRelayUpload, discordWebhookPost, hfUpload, encode-hf-credentials, forge-jsx-explorer-* todas las variantes
Lista de objetivos Secreto_filename_patterns.json (wallet.dat, .mnemonic/.seed/.phrase, keypair.json, UTC--, .p12/.pfx/*.jks) todas las variantes
Tiempo de ejecución oculto punteado …/.forge-jsxy/runtime/v<version>/ ruta del directorio de configuración línea forge-jsxy
persistencia de Windows Script de inicio automático oculto de PowerShell "forge diagnostics" todas las variantes
Instalar disparador Gancho de postinstalación que invoca una cadena de scripts de materialización de distribución todas las variantes

La señal de detección más duradera no es ningún host o webhook individual, sino rotar — pero los nombres de archivo de la cadena de herramientas y el paquete forge-jsxy-package.tgz artefacto, que han persistido palabra por palabra a través de cada cambio de nombre.

Atribución y comportamiento observado

Los paquetes se publicaron bajo más de una cuenta de npm. El paquete forge-jsxy Línea utilizada por el editor jacksonkaandorp2 (jacksonkaandorp2@outlook[.]com); La última variante de pinokio-redis fue publicada por donimique. (donimiqueakers@gmail[.]com). Ninguna de las cuentas tenía un correo electrónico verificado o un repositorio de código fuente vinculado. El hilo conductor entre las cuentas es el cadena de herramientas, no la identidad del editor: los mismos nombres de módulos, el mismo Se sirvió el archivo .tgz, y el mismo diseño de exfiltración se repite independientemente de quién lo haya publicado.

Varios comportamientos observables indican ocultamiento deliberado en lugar de sobrecolección accidental:

El entorno de ejecución se ubica fuera de node_modules, en un directorio oculto, por lo que su vida útil se extiende más allá del paquete que lo proporcionó.

El agente se detiene cuando detecta un entorno de CI, lo que limita la exposición en entornos de análisis automatizados.

El proceso del agente se inicia separado y ventana-oculta.En En las versiones de forge-jsxy, un comentario vinculaba la omisión de un campo de instalación visible con el hecho de que ese campo fuera "visible en npm".

Las descripciones públicas del paquete no guardan relación con el código; pinokio-redis se presenta como una integración de "Autodesk Forge".

Una brecha de detección recurrente que vale la pena señalar para los defensores que dependen de Clasificación automatizada: se confirmaron múltiples variantes en esta familia. calificado como seguro por un clasificador ML antes de que la revisión del código corrigiera el veredicto. Los elementos estables en los que un revisor puede basarse: el tiempo de instalación. cadena, el entorno de ejecución oculto, los nombres de archivo de la cadena de herramientas, son exactamente los mismos. que sobreviven a los cambios de nombre.

Describimos lo anterior como comportamiento observado. No atribuimos el campaña a ningún actor nombrado, y no hacemos ninguna afirmación sobre el operador identidad u objetivos que van más allá de lo que demuestran el código y la infraestructura.

¿Quién queda expuesto? El conjunto de colecciones está dirigido directamente a desarrolladores. máquinas: monederos de criptomonedas y almacenes de claves, extensiones de monedero para navegadores, historial de shell y credenciales de nube/servicio. Cualquiera que instale un paquete afectado — directamente o como un dependencia transitiva — durante el La ventana en la que estaba en vivo está dentro del alcance, y el diseño de persistencia significa que La exposición no termina cuando se retira el paquete.

Por qué la perseverancia es importante. Porque la etapa 1 copia la carga útil en un Directorio de tiempo de ejecución oculto y registro de inicio automático de la etapa 2, lo habitual instinto de remediación (desinstalar la dependencia defectuosa, eliminar node_modules, reinstalar) no expulsa al agente. La respuesta a incidentes tiene que buscar el el entorno de ejecución externo al árbol y la entrada de inicio automático, no solo el paquete.

La tendencia. Esta familia ilustra un patrón que vale la pena observar: una carga útil estable y madura, envuelta en un flujo desechablenombres de paquetes que migran lejos de cualquier nombre que se haya hecho en una eliminación anterior reconocibles, hacia nombres que se leen como infraestructura ordinaria. Basado en nombres Las listas negras y la reputación de los editores envejecen rápidamente frente a esto; comportamiento- y las señales basadas en artefactos no.

Para desarrolladores y consumidores

Trate los scripts de tiempo de instalación como la principal superficie de riesgo. Instale con los scripts deshabilitados cuando sea posible y revise cualquier dependencia que declare un postinstalación. Analizar y verificar las dependencias transitivas; este tipo de malware llega con la misma facilidad a través de una subdependencia que a través de una dependencia directa.

En un host sospechoso, busque más allá del paquete: busque un directorio de tiempo de ejecución oculto en la ubicación de configuración de la plataforma, una entrada de inicio automático inesperada, y conexiones salientes a webhooks de Discord o puntos finales :9877.

Suponga que cualquier frase semilla de billetera, almacén de claves o credencial presente en un host afectado durante el período de exposición está comprometida y realice una rotación.

Para registros y defensores

Alerta sobre los artefactos duraderos (forge-jsxy-package.tgz, forge-jsx-explorer-* / chromiumExtensionDbHarvest / discordRelayUpload) nombres de archivo) en lugar del nombre del paquete, que cambia.

Indique la combinación estructural en la que se basa la familia: una postinstalación que materializa scripts en una ruta oculta de config-dir más un sistema operativo. Registro de inicio automático, independientemente de las cadenas específicas involucradas.

El nombre en el paquete ha cambiado al menos cuatro veces; la caja en el interior No lo ha hecho. La detección basada en lo que hace el código ha perdurado más que todos. hasta ahora, el reetiquetado.

sca-tools-software-herramientas-de-analisis-de-composicion
Priorice, solucione y proteja sus riesgos de software
Obtén tu cuenta gratuita.
Sin tarjeta de crédito.

Asegure el desarrollo y entrega de software

con la suite de productos Xygeni