← Volver al blog de ciberseguridad

jscrambler comprometido en npm: el infostealer que va a por las llaves de tus herramientas de IA

Por Adrián González · CEO · Publicado: 26 de julio de 2026 · Actualizado: 26 de julio de 2026
infostealer en jscrambler roba credenciales de herramientas de IA

El 11 de julio de 2026, alguien tomó prestada la cuenta de publicación de jscrambler en npm y subió una versión troyanizada de una herramienta que, precisamente, se vende para proteger código. La 8.14.0 parecía una actualización rutinaria de un paquete con unas 15.800 descargas semanales. En realidad arrastraba un ladrón de credenciales escrito en Rust que se ejecutaba con solo instalar el paquete. Socket lo detectó seis minutos después de su publicación.

Lo que separa este incidente de la larga lista de compromisos de npm de 2026 no es el vector —una credencial de publicación robada, otra vez—, sino la lista de la compra del atacante. Además de las llaves de nube y las carteras de criptomonedas de siempre, el ladrón buscaba de forma deliberada los ficheros de configuración de Cursor, Windsurf, Claude Desktop y los servidores MCP: el sitio donde los equipos de desarrollo guardan hoy las claves de sus asistentes de inteligencia artificial. La cadena de suministro del software se cruza con la seguridad de la IA en el mismo binario.

Qué ocurrió, en orden

El punto de entrada no fue una vulnerabilidad. La propia jscrambler confirmó que el atacante publicó los paquetes con una credencial de publicación de npm comprometida, según SecurityWeek. Es la misma historia de fondo que hemos visto repetirse todo el año: no hace falta un exploit cuando basta con una llave que nadie ha revocado.

La primera versión maliciosa, la 8.14.0, apareció y Socket la marcó a los seis minutos. En las tres horas siguientes el mismo actor empujó la 8.16.0, la 8.17.0, la 8.18.0 y la 8.20.0. Entre medias hubo publicaciones limpias, como la 8.15.0, y la 8.22.0 es la versión buena a la que conviene volver, según recoge The Hacker News. Esa mezcla de versiones limpias y maliciosas es deliberada: complica el diagnóstico y alarga la ventana de exposición.

El daño no viajaba en el código de jscrambler que un revisor abriría, sino en un binario nativo que el paquete dejaba caer y ejecutaba, con una compilación distinta para Windows, macOS y Linux. Es la misma familia de táctica que analizamos en el ataque a easy-day-js contra el ecosistema de Mastra, solo que aquí el objetivo final es mucho más ambicioso.

La anatomía: del preinstall al arranque por importación

Las primeras versiones usaban un gancho preinstall de npm, la instrucción que se ejecuta de forma automática al instalar un paquete. Son ganchos que existen por motivos legítimos —compilar módulos nativos, por ejemplo—, pero también una puerta de ejecución de código que muchas organizaciones no vigilan.

A partir de la 8.18.0 el atacante cambió de táctica, y ese cambio es la parte interesante. En lugar del gancho de instalación, inyectó el mismo cargador como una función autoejecutable al principio de los ficheros de entrada del módulo. El efecto, a nivel conceptual, es importante: el código deja de dispararse al instalar y pasa a dispararse al importar el paquete o al usar su comando de línea.

Ese giro sortea a los analizadores que solo inspeccionan los scripts de instalación y sobrevive incluso cuando se instala desactivando esos scripts. La costumbre de instalar dependencias «sin ejecutar scripts» da una falsa sensación de seguridad cuando el código malicioso se ha mudado al propio punto de entrada del módulo. No es un detalle de implementación: es una lección sobre dónde ponemos la vigilancia.

Qué buscaba el ladrón

El binario en Rust barre el equipo del desarrollador en busca de secretos y los envía cifrados por TLS a un servidor de recogida. La lista de objetivos, documentada por Socket y CSO Online, dibuja el mapa de lo que hoy vale dinero en un portátil de desarrollo:

  • Credenciales de nube de AWS, Azure y Google Cloud, incluidos los endpoints de metadatos que usan los ejecutores de integración continua.
  • Carteras de criptomonedas y frases semilla de MetaMask, Phantom y Exodus.
  • El almacén del gestor de contraseñas Bitwarden y los perfiles de navegador de Chrome, Brave, Edge y Chromium.
  • Sesiones de Discord, Slack, Telegram y Steam, además de los llaveros del sistema operativo.
  • Ficheros de configuración de herramientas de IA: Claude Desktop, Cursor, Windsurf, VS Code, Zed y configuraciones de servidores MCP, que suelen contener claves de API y detalles de conexión.

Para no depender de una única ejecución, el ladrón se instalaba de forma persistente mediante el Programador de tareas en Windows y agentes de arranque (LaunchAgents) en macOS. Es el comportamiento de un infostealer maduro, no de una prueba de concepto.

Por qué las herramientas de IA se han convertido en botín

Hasta hace poco, un infostealer que llegaba a un equipo de desarrollo apuntaba a lo previsible: tokens de nube, claves SSH, credenciales de git. La novedad aquí es que el atacante trata la configuración de los asistentes de IA como un activo de primera. Y tiene su lógica: un fichero de Claude Desktop, de Cursor o de un servidor MCP puede guardar claves de API con acceso a modelos, repositorios, sistemas de tickets y, cada vez más, a acciones sobre la propia infraestructura.

Esas claves rara vez se rotan, casi nunca llevan segundo factor y a menudo conceden más permisos de los necesarios. Para un atacante son identidades no humanas mal gobernadas con acceso directo a la cadena de desarrollo. Si tu organización ya conecta agentes a sistemas internos, conviene revisar los controles de producción para MCP y agentes de IA con esta amenaza en mente.

Por qué los controles habituales no bastan

El portátil del desarrollador sigue siendo, en muchas organizaciones, una zona de confianza implícita. Instala dependencias a diario, ejecuta código de terceros y guarda credenciales de producción. Aquí fallan tres supuestos a la vez: que revisar el código del paquete basta, cuando el daño estaba en un binario y en el punto de entrada del módulo; que desactivar los scripts de instalación protege, cuando el arranque se mudó a la importación; y que un antivirus tradicional detendrá un binario nuevo compilado para tres plataformas.

El escaneo de dependencias que solo mira manifiestos y scripts de instalación tampoco alcanza. Hace falta vigilar el comportamiento en tiempo de ejecución, no únicamente el contenido declarado. La seguridad de la cadena de desarrollo se juega tanto en prácticas de DevSecOps como en la telemetría del puesto de trabajo.

Detección: qué mirar de verdad

En clave defensiva, el incidente deja señales claras que un equipo de threat hunting o de respuesta puede convertir en detecciones concretas:

  • Un proceso de Node.js o de npm que lanza un binario nativo recién escrito en un directorio temporal o dentro de node_modules es una anomalía que el EDR captura por la relación padre-hijo.
  • Conexiones TLS salientes desde equipos de desarrollo o ejecutores de CI hacia dominios sin reputación, justo después de una instalación de dependencias o de importar un módulo.
  • Creación de tareas programadas en Windows o de LaunchAgents en macOS por parte de procesos de desarrollo: un patrón de persistencia que no debería aparecer nunca en ese contexto.
  • Lecturas de los ficheros de configuración de navegadores, gestores de contraseñas y herramientas de IA por procesos que no son esas aplicaciones.
  • Peticiones al endpoint de metadatos de instancia (169.254.169.254) desde un contenedor o ejecutor de CI que normalmente no las hace.

Para las organizaciones con inteligencia de amenazas operativa, los indicadores publicados por los investigadores —versiones afectadas, hashes de los binarios y dominios de recogida— permiten una búsqueda retroactiva en el histórico de telemetría, no solo un bloqueo hacia adelante.

Defensa práctica

  • Fija las dependencias con archivos de bloqueo y revisa cada cambio de versión; evita los rangos flexibles que resuelven a la última publicación sin control humano.
  • Instala en dos tiempos: resolver y auditar antes de permitir la ejecución de código de instalación, en lugar de confiar en desactivar los scripts.
  • Aísla la integración continua con ejecutores efímeros, sin credenciales de larga duración y con filtrado de salida hacia destinos conocidos.
  • Sustituye las claves estáticas por credenciales de corta duración y federación (OIDC) siempre que puedas, para que un secreto robado caduque por sí solo.
  • Trata la configuración de las herramientas de IA y de los servidores MCP como secretos: fuera del control de versiones, con rotación periódica y con el mínimo privilegio.

Y si sospechas exposición, la respuesta es la de siempre, pero con prisa: revoca y rota las credenciales que pudieran vivir en esos equipos, revisa los accesos recientes en la nube y activa la respuesta a incidentes si hay indicios de uso indebido.

Lo que pide el cumplimiento

Para una empresa sujeta a NIS2 o a DORA, esto no es una curiosidad técnica. Ambas normas colocan el riesgo de terceros y de la cadena de suministro TIC en el centro de la gestión: inventario de proveedores y componentes, vigilancia de vulnerabilidades y una capacidad de reacción que se pueda demostrar.

Un paquete de npm en un servidor de compilación es, a estos efectos, un proveedor más. La gestión del riesgo de terceros deja de ser un cuestionario anual y pasa a incluir lo que tu gente instala cada día. La diferencia entre un susto y una brecha reportable suele estar en si la organización sabía qué dependencias ejecutaba y con qué credenciales.

En esencia

El mensaje de fondo de jscrambler no es «cuidado con este paquete». Es que la frontera de tu organización ya no está en el cortafuegos ni en el portátil, sino en cada dependencia que tu gente instala y en cada clave que tus asistentes de IA guardan sin que nadie las mire. Que el objetivo sea una herramienta pensada para proteger código solo subraya la ironía: proteger la cadena de desarrollo dejó de ser tarea exclusiva de los desarrolladores para convertirse en parte del modelo de amenazas de la empresa.

Este artículo describe el incidente y las medidas de detección y defensa a nivel conceptual, con fin divulgativo. No incluye indicadores completos ni instrucciones de explotación; antes de actuar en tu entorno, contrasta siempre con las fuentes citadas y con tu propio equipo de seguridad.

Preguntas frecuentes

¿Qué pasó con jscrambler en npm?

El 11 de julio de 2026 un atacante usó una credencial de publicación comprometida para subir versiones troyanizadas del paquete jscrambler a npm. Esas versiones ejecutaban un infostealer escrito en Rust que robaba credenciales de la máquina del desarrollador. Socket detectó la primera versión maliciosa, la 8.14.0, seis minutos después de su publicación.

¿Qué versiones están afectadas y cuál es segura?

Las versiones maliciosas conocidas son la 8.14.0, 8.16.0, 8.17.0, 8.18.0 y 8.20.0, publicadas en una ventana de unas tres horas. Hubo publicaciones limpias intercaladas, como la 8.15.0, y la versión buena a la que conviene actualizar es la 8.22.0. Revisa tu archivo de bloqueo y tus servidores de compilación por si resolvieron a alguna versión maliciosa durante la ventana del ataque.

¿Qué información robaba el infostealer?

El binario buscaba credenciales de nube de AWS, Azure y Google Cloud (incluidos los endpoints de metadatos de los ejecutores de CI), carteras y frases semilla de criptomonedas, el almacén de Bitwarden, perfiles de navegador, sesiones de Discord, Slack, Telegram y Steam, los llaveros del sistema y los ficheros de configuración de herramientas de IA como Claude Desktop, Cursor, Windsurf, VS Code, Zed y servidores MCP.

¿Por qué instalar con los scripts desactivados no protegió?

Porque a partir de la versión 8.18.0 el código malicioso dejó de depender del gancho de instalación. Se inyectó como una función autoejecutable en el punto de entrada del módulo, de modo que se disparaba al importar el paquete o al usar su comando, no al instalarlo. Desactivar los scripts de instalación no detiene ese arranque.

¿Cómo sé si mis equipos están comprometidos?

Busca en la telemetría procesos de Node o npm que lancen binarios nativos, conexiones salientes hacia dominios sin reputación tras una instalación de dependencias, y creación de tareas programadas o LaunchAgents por procesos de desarrollo. Cruza los indicadores publicados por los investigadores (versiones, hashes y dominios de recogida) con tu histórico de EDR y revoca cualquier credencial que pudiera estar expuesta.

¿Por qué es tan grave que apunte a Cursor, Windsurf o MCP?

Porque los ficheros de configuración de esos asistentes suelen contener claves de API con acceso a modelos, repositorios y, cada vez más, a acciones sobre infraestructura. Son identidades no humanas que rara vez se rotan y casi nunca llevan segundo factor, así que una sola exposición puede abrir varios sistemas a la vez.

¿Qué relación tiene con NIS2 y DORA?

NIS2 y DORA sitúan el riesgo de terceros y de la cadena de suministro TIC en el centro de la gestión de seguridad. Un paquete de npm en un servidor de compilación es, a efectos prácticos, un proveedor. Ambas normas esperan que la organización mantenga inventario de componentes, vigilancia de vulnerabilidades y una capacidad de reacción documentada, precisamente lo que este incidente pone a prueba.