Guías de seguridad

La cadena de compromiso de TanStack, Nx Console y GitHub (mayo de 2026): qué deben revisar los desarrolladores

En mayo de 2026, un compromiso de npm de TanStack llevó a una extensión manipulada de Nx Console y al robo de repositorios internos de GitHub. Cómo revisar, qué rotar, ajustes de CI.

Publicado 2026-09-30 Actualizado 2026-09-30 Última verificación 2026-09-30 20 min de lectura
En esta página

Para: desarrolladores que instalan dependencias de JavaScript con npm (incluidos pnpm y yarn), quien usa extensiones en VS Code o sus variantes, mantenedores que publican paquetes desde GitHub Actions, y administradores de GitHub Enterprise Server. Este artículo se basa en las autopsias y anuncios publicados por TanStack, Nx y GitHub y no cubre técnicas de ataque.

Qué deben hacer hoy los desarrolladores

1

Revise los lockfiles y los registros de CI en busca de las versiones afectadas de TanStack

Los paquetes afectados son 42 paquetes Router/Start, 84 versiones, entre ellos @tanstack/react-router, @tanstack/react-start, @tanstack/router-core y @tanstack/history (lista completa en el aviso de GitHub GHSA-g7cv-rxg3-hmpx). TanStack afirma que Query, Table, Form, Virtual y sus demás paquetes no se vieron afectados. Revise no solo el contenido actual de su lockfile, sino también su historial de cambios alrededor del 11 de mayo de 2026. Las versiones maliciosas se eliminaron de npm en cuestión de horas, por lo que una instalación durante ese periodo podría no aparecer en el lockfile actual. En CI, busque trabajos que hayan ejecutado una instalación después de las 19:20 UTC del 11 de mayo.

2

Compruebe si tenía Nx Console v18.95.0

La autopsia de Nx muestra cómo verificar la versión instalada con code --list-extensions --show-versions (el ID de la extensión contiene angular-console). Solo se vio afectada la v18.95.0, que estuvo disponible el 18 de mayo entre las 12:30 y las 13:09 UTC. Nx pide que quien tuviera Nx Console con actualización automática activada durante ese periodo considere la máquina como comprometida, sea cual sea la cifra de instalaciones que resulte correcta. La autopsia también enumera archivos y procesos que buscar (indicadores de compromiso); si está afectado, siga esa lista.

3

Si está afectado, rote todas las credenciales accesibles desde esa máquina

TanStack y Nx indican los mismos objetivos: tokens de GitHub, tokens de npm, claves SSH, credenciales de nube (AWS, GCP, Azure), Kubernetes, tokens de Vault y el contenido de cualquier archivo .env. Nx añade las credenciales que las herramientas de la máquina pudieron haber generado durante el periodo (credenciales temporales de nube, tokens de la CLI de GitHub, etc.), y recomienda considerar una reconstrucción completa de la máquina después de la rotación. Para el orden de revocación y cómo tratar un malware residente, consulte la sección "si sospecha de infección" de Cómo defenderse de gusanos de cadena de suministro en npm.

4

Si mantiene paquetes de npm, revise el historial de publicación

Según TanStack, el código buscaba otros paquetes que mantiene la víctima e intentaba republicarlos con la misma inyección. Si publica en npm, revise el historial de versiones de sus paquetes en busca de versiones que usted no publicó desde el 11 de mayo.

5

Averigüe dónde se almacena su token de GitHub en la máquina

Según Nx, la credencial robada era un token de la CLI de GitHub. En ese entorno estaba guardada en un archivo en disco y era legible por cualquier proceso que se ejecutara como el usuario, y se usó contra la API de GitHub en 74 segundos. Ejecute gh auth status para ver dónde está el suyo; si está en un archivo de texto plano, considere moverlo al llavero del sistema operativo o a una integración con un gestor de contraseñas que inyecte la credencial solo en tiempo de ejecución. Tras el incidente, la política de Nx ya no permite el uso directo de la CLI de GitHub en equipos de desarrollo. Para reducir la vigencia y el alcance del token, consulte Cómo defenderse de gusanos de cadena de suministro en npm.

6

Verifique que su ajuste de antigüedad mínima de publicación realmente surta efecto

Según Nx, el proyecto del colaborador comprometido tenía minimum-release-age=10080 (7 días) en su .npmrc, pero el proyecto fijaba pnpm 10.14, que no admite ese ajuste y lo ignoró silenciosamente. El soporte empieza con pnpm 10.16. La versión maliciosa tenía solo 77 minutos de antigüedad en el momento de la instalación, así que un ajuste funcionando la habría bloqueado. Revise la versión fijada en el campo packageManager de package.json y haga que CI verifique que sea lo bastante reciente. El ajuste equivalente para npm se explica en Cómo defenderse de gusanos de cadena de suministro en npm.

7

Administradores de GitHub Enterprise Server: rote la clave de firma

El 26 de mayo, GitHub anunció que está rotando claves, incluida la que firma los paquetes de actualización de GitHub Enterprise Server. Los administradores deben rotar las claves públicas GPG de su instancia; de lo contrario, las futuras actualizaciones fallarán con un error que indica que el archivo no es un paquete GHES válido. Las instrucciones y el digest SHA256 del script auxiliar están en la publicación de GitHub. GitHub también pide a los clientes que descarguen las actualizaciones de GHES solo desde la fuente oficial y que se preparen para recibir actualizaciones de seguridad con mayor frecuencia en los próximos meses. Los clientes de GitHub Enterprise Cloud no necesitan hacer nada.

Qué deben revisar en CI los publicadores de paquetes

Las autopsias de TanStack y de Nx indican con precisión qué ajustes permitieron pasar la cadena. A continuación, esos hallazgos se traducen en ajustes y políticas que puede comprobar en sus propios repositorios.

1

No ejecute código de forks bajo pull_request_target

Según TanStack, un flujo de control de tamaño de bundle se ejecutaba con pull_request_target y, dentro de él, descargaba y construía código de un pull request desde un fork. pull_request_target se ejecuta con los privilegios del repositorio base, y TanStack señala que la puerta de aprobación para colaboradores nuevos no se aplica a este disparador. Limítelo a tareas que nunca ejecuten código externo, como etiquetar y comentar. Tras el incidente, TanStack eliminó todo uso de pull_request_target de su CI.

2

No comparta cachés entre trabajos no confiables y trabajos de publicación

Según TanStack, la caché de GitHub Actions se comparte por repositorio: las ejecuciones de pull_request_target y los envíos a main usan el mismo ámbito. Además, guardar en caché no se bloquea configurando permissions: del flujo como solo lectura. Como resultado, el flujo de publicación restauró una caché escrita por un trabajo que había ejecutado código externo. Tras el incidente, TanStack desactivó la caché de paquetes en su pipeline de publicación y purgó todas las cachés. No restaurar cachés en los flujos que publican es la línea más sencilla de trazar.

3

Conceda permisos de publicación (id-token: write) solo al trabajo de publicación, detrás de una aprobación

El flujo de publicación de TanStack tenía id-token: write para la publicación confiable de npm (OIDC). Según la autopsia, la publicación maliciosa no provino del paso de publicación definido en el flujo; código que se ejecutaba en otra etapa de la misma ejecución extrajo un token y publicó directamente. La lección que TanStack extrae es que un vínculo de editor confiable no tiene revisión por cada publicación. Separe la publicación en su propio trabajo, aparte de la compilación y las pruebas, dé el permiso solo a ese trabajo y colóquelo detrás de un entorno de GitHub con revisores obligatorios. Tras el incidente, Nx hizo obligatoria la aprobación para publicar por alguien distinto de quien activó la ejecución.

4

Fije las acciones de terceros a un SHA de commit

Tras el incidente, tanto TanStack como Nx fijaron cada referencia de acción a un SHA de commit en lugar de a una etiqueta o rama. TanStack describe las referencias flotantes como un "riesgo permanente para la cadena de suministro, independiente de este incidente".

5

Envíe las notificaciones de publicación y los registros de auditoría a alguien que los lea

Nx detectó la publicación manipulada gracias al correo de notificación rutinario que el marketplace de extensiones envía con cada subida. Un mantenedor que no esperaba una publicación la reconoció como anómala y la retiró en unos 11 minutos. El segundo canal de distribución no tenía esa notificación, y la retirada allí tardó unos 36 minutos. Mientras tanto, la actividad con el token robado, como la eliminación de ejecuciones de flujos de trabajo, permaneció una semana en el registro de auditoría sin que nadie la notara. Compruebe que las notificaciones de publicación lleguen a alguien del equipo y que alguien vigile el registro de auditoría en busca de ejecuciones de flujos eliminadas.

Qué ocurrió (según los comunicados de las tres organizaciones)

Todo lo siguiente es lo que indican la autopsia de TanStack, la de Nx y el anuncio de GitHub. Las horas están en UTC.

  1. 11 de mayo de 2026, 19:20–19:26

    A través del flujo de publicación del repositorio Router/Start de TanStack, se publican en npm 84 versiones maliciosas de 42 paquetes.
  2. 11 de mayo, 19:46

    Un investigador externo presenta un informe detallado en el repositorio de TanStack. TanStack inicia su respuesta.
  3. 11 de mayo, 20:43

    Un colaborador de Nx ejecuta pnpm install en un proyecto no relacionado con Nx y resuelve el paquete malicioso @tanstack/zod-adapter@1.166.15. Según Nx, el token de la CLI de GitHub fue robado y usado en 74 segundos.
  4. 11 de mayo, antes de las 21:03

    TanStack ha marcado como obsoletas las 84 versiones.
  5. 11 de mayo, 22:13–23:55

    npm elimina del registro los tarballs afectados.
  6. 15 de mayo

    TanStack emite un comunicado de tranquilidad: todas las versiones publicadas actualmente son seguras.
  7. 18 de mayo, 12:30–13:09

    Usando el acceso robado del colaborador, Nx Console v18.95.0 se publica en dos canales de distribución de extensiones y luego se retira.
  8. 18 de mayo (lunes, hora de EE. UU.)

    GitHub detecta y contiene un compromiso del dispositivo de un empleado relacionado con una extensión envenenada de VS Code, elimina la versión maliciosa de la extensión y aísla el equipo. Los secretos críticos se rotan ese día y el siguiente.
  9. 20 de mayo

    GitHub hace público que su evaluación es que solo se extrajeron repositorios internos de GitHub.
  10. 21 de mayo

    Nx publica su autopsia.
  11. 26 de mayo

    GitHub actualiza su publicación: está rotando claves, incluida la clave de firma de GitHub Enterprise Server, y enumera acciones para los administradores.
84 versiones
Versiones maliciosas de TanStack (42 paquetes × 2)
~39 min
Periodo en que Nx Console v18.95.0 estuvo disponible (ambos canales combinados)
7 días
Tiempo, según Nx, durante el que el token robado estuvo activo en los repositorios de Nx
Ninguna acción
Requerida a los clientes de GitHub Enterprise Cloud (según GitHub)
Lo que revelaron las tres organizaciones
TanStack: alcance
42 paquetes, 84 versiones del repositorio Router/Start. Query, DB, Store, Table, Form, Virtual y otros repositorios no afectados. TanStack afirma que no tiene evidencia de que se hayan robado tokens de npm
TanStack: qué hacía el código
Se ejecutaba como script durante la instalación, recopilaba credenciales de nube, Kubernetes, Vault, npm, GitHub y SSH, las enviaba fuera e intentaba propagarse a otros paquetes que mantiene la víctima
TanStack: causa raíz
La combinación de (1) construir código de forks bajo pull_request_target, (2) que ese trabajo pudiera escribir una caché que el flujo de publicación restaura y (3) que el flujo de publicación pudiera generar un token OIDC capaz de publicar
Nx: alcance
Solo Nx Console v18.95.0 (v18.100.0 y posteriores son seguras). CLI de Nx, plugins oficiales @nx/* y Nx Cloud no afectados. El marketplace oficial contabilizó 28 instalaciones; el segundo canal, 41 descargas. Las propias analíticas de Nx muestran unas 6.000 activaciones, y la diferencia aún se está conciliando
Nx: causa raíz
(1) El compromiso previo de TanStack, (2) un ajuste de antigüedad mínima de publicación ignorado silenciosamente por una versión antigua de pnpm, (3) un token de la CLI de GitHub legible en disco, (4) un flujo que permitió que un solo colaborador publicara la extensión
GitHub: alcance
Evaluación: extracción solo de repositorios internos de GitHub. Sin evidencia de impacto en la información de clientes almacenada fuera de ellos, como la de las empresas, organizaciones y repositorios propios de los clientes. Algunos repositorios internos sí contienen información de clientes, como fragmentos de interacciones de soporte
GitHub: respuesta
Eliminó la versión maliciosa de la extensión y aisló el equipo. Rotó los secretos críticos, por orden de mayor impacto. Rotó claves, incluida la clave de firma de GitHub Enterprise Server, y pidió a los administradores que roten la clave pública. Afirma que publicará un informe más completo cuando concluya la investigación

Nota de lectura: el «número de repositorios extraídos de GitHub» no es una cifra propia de GitHub

La publicación de GitHub menciona un número de repositorios extraídos, pero la presenta como una afirmación del atacante, diciendo solo que es "direccionalmente coherente" con su investigación hasta ahora. Este sitio no trata las afirmaciones del atacante como hechos, por lo que la cifra no se repite aquí. Del mismo modo, Nx indica que sus cifras de instalaciones no coinciden entre fuentes y que aún se están conciliando. En lugar de cualquier número, decida según si tenía la versión afectada durante el periodo.

Dónde se pudo cortar la cadena

1. CI de TanStack

Código de PR externo escribe en una caché compartida con la publicación

↓

Cortar aquí

Sin pull_request_target / sin restaurar caché en flujos de publicación / aprobación para publicar

2. 84 versiones maliciosas de npm

Publicadas por la vía legítima, por eso parecían reales

↓

Cortar aquí

Un retraso de antigüedad de publicación, en una versión de la herramienta que lo respete

3. Equipo de un colaborador de Nx

Token de la CLI de GitHub leído desde un archivo en disco

↓

Cortar aquí

Sin archivos de token en texto plano / vigilar eliminaciones en el registro de auditoría

4. Nx Console v18.95.0

El acceso de una sola persona publica la extensión

↓

Cortar aquí

Exigir aprobación de alguien distinto de quien activa la publicación

5. Dispositivo de un empleado de GitHub

Extensión envenenada, y después extracción de repositorios internos

↓

Cortar aquí

Tratar las actualizaciones de extensiones como dependencias (sección siguiente)

La cadena reconstruida a partir de los tres comunicados. La columna derecha muestra el ajuste o la política que podría haber cortado la cadena en cada paso (incluidas las medidas que las organizaciones adoptaron después).

Lo que no demostró ser seguro en esta ocasión

  • Ruta de publicación legítima y procedencia: las versiones maliciosas de TanStack salieron de un vínculo OIDC válido
  • Una cuenta de colaborador real: Nx Console se publicó con el acceso de un colaborador auténtico
  • Los controles automáticos del canal de distribución: según Nx, la versión manipulada superó la verificación automática del marketplace oficial
  • Ajustes configurados pero no aplicados realmente: el ajuste de antigüedad de publicación fue ignorado silenciosamente por una versión antigua de pnpm

Lo que podría haber cortado la cadena (según las autopsias)

  • La aprobación de una segunda persona antes de publicar: Nx ya la tenía en otros repositorios, pero no en Nx Console
  • Separar los flujos de publicación de las cachés: TanStack desactivó la caché después
  • Un retraso de antigüedad de publicación que realmente se ejecute: la versión maliciosa tenía 77 minutos de antigüedad al instalarse
  • Una persona que lea la notificación rutinaria de publicación: fue la única detección de Nx

Opinión de este sitio: la actualización automática de extensiones es incorporación automática de dependencias

Para las dependencias de npm, "no instalar nada publicado en los últimos días" se está volviendo una práctica habitual. Sin embargo, las extensiones del editor suelen actualizarse automáticamente por defecto, y ese criterio aún no se ha aplicado a ellas. Por eso Nx escribió que quien tenga la actualización automática activada debe asumir un compromiso. Además, una extensión se ejecuta en la máquina que guarda sus credenciales de GitHub y de la nube, con los privilegios de usted. En equipos que tienen derechos de producción o de publicación de paquetes, considere desactivar las actualizaciones automáticas con el ajuste extensions.autoUpdate de VS Code y aplicar las actualizaciones usted mismo después de algunos días. El costo son correcciones de seguridad más lentas, pero una versión retirada pocos minutos después de su publicación, como en este caso, se evita solo con el retraso.

Un punto más: esta cadena cruzó los límites de las organizaciones. El colaborador de Nx instaló el paquete malicioso en un proyecto no relacionado con Nx, y el empleado de GitHub instaló la extensión de Nx. Su equipo de desarrollo forma parte de la cadena de suministro de cada proyecto al que envía código, no solo de la de su empleador.

Fuentes (registro público)

Los hechos de este artículo proceden de las fuentes públicas siguientes. No cubrimos técnicas de ataque ni información que identifique a los atacantes.

  • TanStack, "Postmortem: TanStack npm supply-chain compromise" (publicado el 11 de mayo de 2026; actualizado el 15 de mayo) — tanstack.com
  • TanStack, "Hardening TanStack After the npm Compromise" (cambios posteriores al incidente) — tanstack.com
  • GitHub Advisory Database, "GHSA-g7cv-rxg3-hmpx (CVE-2026-45321)" (lista completa de versiones afectadas) — github.com
  • Nx, "Postmortem: Nx Console v18.95.0 supply-chain compromise" (21 de mayo de 2026) — nx.dev
  • Aviso de seguridad de Nx Console "GHSA-c9j4-9m59-847w" — github.com
  • GitHub, "Investigation update: GitHub Enterprise Server signing key rotation" (publicado el 20 de mayo de 2026; actualizado el 26 de mayo) — github.blog
  • GitHub Security Lab, "Keeping your GitHub Actions and workflows secure: Preventing pwn requests" (uso seguro de pull_request_target) — securitylab.github.com
  • GitHub Docs, "Managing environments for deployment" (revisores obligatorios) — docs.github.com

Historial de actualizaciones

2026-09-30: Primera versión, basada en la autopsia de TanStack (revisión del 15 de mayo), la autopsia de Nx (21 de mayo) y el anuncio de GitHub (actualización del 26 de mayo). GitHub indica que publicará un informe más completo cuando concluya su investigación; actualizaremos esta página cuando lo haga.

Lectura siguiente

FAQ

Q¿Qué paquetes de TanStack fueron comprometidos?
A

Según la autopsia (postmortem) de TanStack, se vieron afectados 42 paquetes publicados desde el repositorio Router/Start, con dos versiones cada uno, 84 versiones en total (por ejemplo, @tanstack/react-router 1.169.5 y 1.169.8, @tanstack/history 1.161.9 y 1.161.12). La lista completa está en el aviso de seguridad de GitHub GHSA-g7cv-rxg3-hmpx (CVE-2026-45321). Los paquetes de otros repositorios, como Query, Table, Form y Virtual, no se vieron afectados, y TanStack afirma que todas las versiones publicadas actualmente son seguras para instalar.

Q¿Qué debo hacer si instalé una versión afectada?
A

TanStack recomienda encarecidamente que quien haya instalado una versión afectada el 11 de mayo de 2026 (UTC) rote las credenciales de AWS, GCP, Kubernetes, Vault, GitHub, npm y SSH accesibles desde el equipo donde se hizo la instalación. Como el código se ejecutó durante la instalación, los runners de CI cuentan igual que las máquinas de los desarrolladores.

QUso Nx Console. ¿Me afecta?
A

Según la autopsia de Nx, solo se vio afectada la versión v18.95.0 de Nx Console, que estuvo disponible el 18 de mayo de 2026 entre las 12:30 y las 13:09 UTC. Las versiones v18.100.0 y posteriores son seguras. Nx pide que quien tuviera Nx Console instalado con actualización automática activada durante ese periodo considere la máquina como comprometida y rote todas las credenciales. La CLI de Nx (el paquete nx), los plugins oficiales @nx/* y Nx Cloud no se vieron afectados.

Q¿Se filtraron los repositorios de los usuarios de GitHub?
A

Según GitHub, la actividad implicó la extracción únicamente de repositorios internos de GitHub, y no tiene evidencia de impacto en la información de clientes almacenada fuera de esos repositorios, como la de las empresas, organizaciones y repositorios propios de los clientes. Algunos repositorios internos sí contienen información de clientes, por ejemplo fragmentos de interacciones de soporte, y GitHub afirma que notificará a los clientes por los canales establecidos si se encuentra algún impacto. Los clientes de GitHub Enterprise Cloud no necesitan hacer nada.

Q¿Qué deben hacer los administradores de GitHub Enterprise Server?
A

En su actualización del 26 de mayo, GitHub indicó que está rotando claves, incluida la clave utilizada para firmar los paquetes de actualización de GitHub Enterprise Server, y pidió a los administradores que roten las claves públicas GPG de sus instancias. Sin esa rotación, las futuras actualizaciones fallarán en la verificación. Las instrucciones y el digest SHA256 del script auxiliar están en la publicación de GitHub. GitHub también pide a los clientes que descarguen las actualizaciones de GHES solo desde la fuente oficial.

Q¿Están relacionados los tres incidentes?
A

El vínculo entre TanStack y Nx se indica en la autopsia de Nx: el 11 de mayo, un colaborador de Nx ejecutó pnpm install en un proyecto no relacionado, resolvió el paquete comprometido @tanstack/zod-adapter 1.166.15 y le robaron un token de la CLI de GitHub. La publicación de GitHub vincula la «extensión envenenada de VS Code» que comprometió el dispositivo de su empleado con el aviso de seguridad de Nx Console.

Q¿Cuál fue la causa raíz?
A

La autopsia de TanStack señala tres debilidades que solo funcionaron en conjunto: un flujo pull_request_target construía código de pull requests desde forks; ese trabajo podía escribir en una caché de GitHub Actions compartida con el flujo de publicación; y el flujo de publicación podía generar el token OIDC (un token de corta duración emitido para cada ejecución de CI) usado para publicar en npm. Nx señala un ajuste de antigüedad mínima de publicación ignorado silenciosamente por una versión antigua de pnpm, un token almacenado donde cualquier proceso local podía leerlo, y un flujo que permitía a una sola persona publicar la extensión.