flawopen.com/Incidents/tensorlake-npm-install-hook-compromise-october-2026
Tensorlake npm 0.5.144: hook malicioso de instalación
Una versión maliciosa del SDK de IA de Tensorlake añadió un cargador preinstall. El equipo confirmó cambios directos en main y reforzó las publicaciones; el aviso de GitHub considera comprometidos los equipos donde se ejecutó. Los investigadores vinculan el patrón del cargador con la familia ChainDrop/Shai-Hulud; el aviso de GitHub no confirma esa atribución.[1], [2], [3], [4], [5]
Instalar este paquete fue como enchufar un aparato que empieza a funcionar en cuanto recibe corriente: no hacía falta pulsar un botón ni usarlo. npm ejecutó el hook malicioso de preinstalación con los permisos de quien lo instaló, antes de que alguien importara el SDK.[3], [6], [1]
Conceptos Clave y Términos
hook preinstall- Script que npm puede ejecutar durante la instalación. El manifiesto publicado de Tensorlake 0.5.144 invocaba un cargador desde este hook, sin necesidad de importar el SDK.[1], [6]
atestación de procedencia- Evidencia sobre el origen y la compilación de un artefacto. El equipo indicó que la publicación maliciosa tenía procedencia npm; eso no demuestra que el código fuente fuera seguro.[2], [3]
barrera para scripts de instalación- Control de CI que falla si un manifiesto publicado declara scripts de instalación. Tras el incidente, Tensorlake añadió este control y npm ci --ignore-scripts.[3]
Mapeos de marcos
- Referencia CWE para la debilidad descrita en esta guía: CWE-506
Cronología del Incidente
Flujo de Ataque Paso a Paso
Las credenciales y la persistencia del equipo quedaron en riesgo
El aviso de malware de GitHub indica que un equipo afectado debe tratarse como comprometido. StepSecurity y Socket informan de robo de credenciales y persistencia, incluido un monitor que podía reaccionar a la revocación de tokens. Atribuye esos detalles a los investigadores; no des por hecho que todas las capacidades se ejecutaron en todos los equipos.[1], [4], [5]
El equipo restableció los controles de publicación
La respuesta revirtió los commits maliciosos, añadió npm ci --ignore-scripts y una barrera de manifiestos, reforzó las protecciones del repositorio y de publicación, y sustituyó el paquete por 0.5.145. El GHSA no enumera una versión corregida porque clasifica malware, no un rango de código vulnerable convencional.[3], [7]
Código Fuente: Vulnerable vs. Seguro
Esta comparación de CI sigue la PR integrada #1016; no es el paquete malicioso ni un exploit. La barrera se ejecuta antes de instalar y rechaza hooks de instalación en manifiestos publicados; ignore-scripts impide que npm ci ejecute scripts de ciclo de vida de dependencias. El equipo indicó que sus pruebas y la compilación del SDK funcionaron con este ajuste. Puede afectar a paquetes que requieran hooks, y los comandos invocados explícitamente, como npm test, aún ejecutan sus scripts. Aísla los pasos posteriores y no confundas procedencia con una revisión del código fuente. El fragmento es parcial: además de comprobar los hooks de instalación declarados, la barrera del mantenedor también rechaza archivos inesperados en typescript/lib/.[3], [6]
steps:
- run: npm cisteps:
- run: node scripts/check-no-install-scripts.mjs
- run: npm ci --ignore-scriptsLista de Verificación de Seguridad para Ingeniería
- ✓Busca tensorlake@0.5.144 en manifiestos, archivos de bloqueo, cachés y registros de compilación. El aviso identifica esa versión npm exacta; no deduzcas exposición solo por el nombre del paquete.[1]
- ✓Si se ejecutó la instalación, aísla el equipo de la red y conserva las pruebas. Quitar la dependencia no demuestra que desaparecieran la persistencia u otros cambios; reconstruye desde medios confiables si no puedes confirmar la integridad.[1], [4], [5]
- ✓Mantén el equipo aislado y coordina con respuesta a incidentes la identificación y retirada de la persistencia que, según los investigadores, podía activarse al revocar tokens, antes de revocar o rotar tokens. Sigue las indicaciones actuales y realiza la respuesta desde sistemas limpios.[4], [5]
- ✓Cuando el equipo de respuesta haya tratado la persistencia descrita, usa un sistema limpio para revocar y rotar las credenciales accesibles al proceso instalador. Revisa los repositorios y publicaciones de paquetes accesibles e inspecciona artefactos de CI y registros de auditoría en busca de cambios no autorizados.[4], [5], [3]
- ✓En CI, ejecuta una barrera revisada antes de instalar dependencias, usa npm ci --ignore-scripts si es compatible, aísla los scripts de compilación necesarios, elimina bypasses de envío directo/admin y exige aprobación independiente para publicar paquetes.[3], [6]
- ✓A fecha de 2026-10-12, comprueba si tu entorno instaló alguno de estos seis paquetes complementarios en la versión
0.5.144: `tensorlake-native-*family:tensorlake-native-linux-x64-gnu,tensorlake-native-linux-x64-musl,tensorlake-native-linux-arm64-gnu,tensorlake-native-linux-arm64-musl,tensorlake-native-darwin-arm64,tensorlake-native-win32-x64. El registro npm devolvió metadatos de versión para cada uno ese día; trátalos como todavía publicados e inclúyelos en el inventario de exposición. Esto solo confirma su disponibilidad en el registro, no que un paquete complementario contuviera la carga del incidente. En la PR #1016 ya fusionada, el mantenedor indicó que esas versiones aún debían retirarse en aquel momento.[3], [8], [9], [10], [11], [12], [13]
Fuentes
- GitHub Advisory Database — GHSA-rqxj-g25x-4v9v
- Tensorlake — issue del incidente #1014
- Tensorlake — PR de respuesta #1016
- StepSecurity — análisis técnico
- Socket — análisis técnico
- npm v10 — npm ci e ignore-scripts
- Tensorlake — versión limpia 0.5.145
- npm registry — tensorlake-native-linux-x64-gnu@0.5.144
- npm registry — tensorlake-native-linux-x64-musl@0.5.144
- npm registry — tensorlake-native-linux-arm64-gnu@0.5.144
- npm registry — tensorlake-native-linux-arm64-musl@0.5.144
- npm registry — tensorlake-native-darwin-arm64@0.5.144
- npm registry — tensorlake-native-win32-x64@0.5.144