sistema: OPERATIVO
← volver a todos los hacks
SUPPLY CHAIN CRITICAL

Mini Shai-Hulud: el gusano de supply chain que apuntó al stack de tooling de IA

Divulgado entre el 11 y el 18 de mayo de 2026, el gusano Mini Shai-Hulud troyanizó más de 170 paquetes de npm y PyPI — incluidos Mistral AI, Guardrails AI y TanStack — y persiste dentro de Claude Code y VS Code.

2026-05-22 // 8 min affects: tanstack, mistral-ai-python-sdk, guardrails-ai, uipath-sdk, opensearch-js, claude-code, vs-code, openai-macos-deps

Qué pasó

El 11 de mayo de 2026, el actor TeamPCP comenzó a publicar versiones troyanizadas de paquetes npm muy utilizados, empezando por TanStack y, en cuestión de horas, pivotando hacia el SDK Python de Mistral AI, Guardrails AI, UiPath y OpenSearch. En cinco horas se publicaron más de 400 versiones maliciosas repartidas en 172 paquetes distintos en npm y PyPI, con un acumulado histórico de unos 518 millones de descargas. El 12 de mayo, el código fuente completamente armado se publicó brevemente en repositorios públicos de GitHub antes de ser retirado. Una segunda oleada, desde el 18 de mayo, comprometió más de 300 paquetes @antv mediante una cuenta de mantenedor secuestrada. La campaña — apodada Mini Shai-Hulud en referencia al gusano npm más grande de finales de 2025 — se rastrea como CVE-2026-45321 (CVSS 9.6) para el vector inicial de TanStack.

Lo que justifica un artículo propio aquí: el stack de tooling de IA fue un objetivo primario, no un daño colateral.

Cómo funciona

El punto de entrada en TanStack encadena tres errores de configuración en GitHub Actions. El atacante hace fork del repositorio objetivo bajo una cuenta renombrada (zblgg/configuration en lugar de zblgg/router) para evadir búsquedas en la lista de forks, abre un pull request y dispara un workflow pull_request_target. Ese workflow hace checkout y ejecuta el código del fork del atacante dentro del contexto confiable del repositorio base — con secretos, un scope id-token: write y acceso de escritura a la caché de GitHub Actions. El fork incluye un store pnpm envenenado que queda en caché; las ejecuciones legítimas posteriores de CI tiran esa caché envenenada y publican en npm tarballs troyanizados con atestaciones de procedencia válidas, ya que la publicación se hizo desde el pipeline oficial.

El payload en sí es modular:

# Esquema conceptual — derivado de los análisis públicos de IoC, no ejecutable.
# El post-install malicioso:
#  1. Exfiltra el entorno a un C2 externo (triple canal redundante).
#  2. Roba: GITHUB_TOKEN, claves AWS IAM, tokens HashiCorp Vault, secretos K8s.
#  3. Falsifica tokens de publicación npm firmados con OIDC vía id-token: write.
#  4. Instala un servicio `gh-token-monitor` que re-exfiltra los tokens rotados.
#  5. Persiste escribiendo en:
#       ~/.claude/settings.json    # hook de Claude Code
#       ~/.vscode/tasks.json       # task runner de VS Code
#  6. Si api.github.com devuelve HTTP 40x (token revocado):
#       rm -rf ~/                   # [PAYLOAD DESTRUCTIVO — REDACTADO]

Las variantes de PyPI para Mistral AI y Guardrails AI llevan un stealer distinto, adaptado a entornos Python — mismos C2, mismos objetivos de exfiltración, pero hooks adaptados. La oleada de @antv una semana después usó credenciales robadas de un mantenedor en lugar de envenenamiento de CI, pero el payload post-install pertenece a la misma familia.

Por qué importa

Tres elementos distinguen esta campaña de un ataque clásico a la cadena de suministro de npm.

El stack de IA está en el alcance. Guardrails AI es, por diseño, una librería defensiva que las aplicaciones LLM envuelven alrededor de sus llamadas al modelo. Una versión troyanizada convierte un guardrail en un canal de exfiltración saliente, situado justo en la frontera entre aplicación y modelo. El SDK Python de Mistral AI toca cualquier proyecto que llame a la API de Mistral. Según el análisis de Rescana, los productos desktop macOS de OpenAI se vieron afectados indirectamente a través de una cadena de dependencias de TanStack.

La persistencia ataca específicamente a los agentes de IA. Escribir en ~/.claude/settings.json sobrevive a npm uninstall y rearma el stealer en el próximo arranque de Claude Code. El mismo patrón funciona contra cualquier agente que auto-carga su configuración al iniciar. La envolvente de privilegios del agente — acceso a shell, a repositorios y a credenciales — se convierte en la envolvente de privilegios del gusano.

Las atestaciones de procedencia eran válidas. Como la publicación se hizo desde el pipeline legítimo de GitHub Actions, la firma de procedencia de npm pasa los controles. Las defensas que dependen solo de la atestación no detectan esto.

Defensas

No hay mitigación del lado del modelo aquí. Las correcciones son higiene de CI/CD y disciplina de credenciales.

  1. Audite sus lockfiles en busca de cualquier versión de un paquete afectado instalada después del 29 de abril de 2026. Use npm audit, Snyk o los scanners comunitarios (GLPMC/Tanstack-Worm-Detector, omarpr/mini-shai-hulud-ioc-scanner). Cualquier coincidencia debe tratarse como un incidente confirmado.
  2. Rote todo lo accesible desde una estación o un runner CI comprometidos: PATs y tokens OAuth de GitHub, tokens npm, claves IAM de nube (AWS/GCP/Azure), tokens HashiCorp Vault, secretos de cuentas de servicio de Kubernetes.
  3. Restrinja pull_request_target. Nunca haga checkout de código de un fork bajo este trigger sin un guard repository_owner. Mueva los builds de forks a pull_request sin secretos.
  4. Fije las acciones de terceros por SHA, no por tag. Fije también los consumidores internos.
  5. Limite id-token: write al job mínimo, nunca a nivel de workflow.
  6. Limpie la persistencia de Claude Code y VS Code. Inspeccione ~/.claude/settings.json y ~/.vscode/tasks.json (y sus copias locales del workspace) en busca de entradas de hook que usted no haya creado. Los scanners de IoC detectan las variantes conocidas.
  7. Re-escope las cachés de CI por rama. El endurecimiento de TanStack incluyó borrar todas las cachés y aislar los builds de fork del lado del fork. Aplique el mismo patrón.

Estado

ObjetivoVectorDivulgaciónParcheado / Limpieza
TanStack (@tanstack/*)Envenenamiento de caché de CI vía pull_request_target2026-05-11Versiones maliciosas retiradas; CI restructurada
Mistral AI Python SDKRelease PyPI troyanizada2026-05-11Versiones afectadas yanked, nueva release republicada
Guardrails AIRelease PyPI troyanizada2026-05-11Versiones afectadas yanked
UiPath, OpenSearch-jsReleases npm troyanizadas2026-05-11Retiradas
@antv/* (300+ paquetes)Cuenta de mantenedor comprometida2026-05-18Mantenedor reseteado, paquetes limpiados
CVE-2026-45321 (cadena CI TanStack)2026-05-12CVSS 9.6 — mitigaciones publicadas

La lección de fondo: el stack de tooling de IA es ahora un objetivo de supply chain de alto valor por mérito propio. Un gusano que aterriza en ~/.claude/settings.json no necesita romper el modelo — posee al agente.

Sources