TanStack npm "Mini Shai-Hulud" Cadena de Suministro - TeamPCP Cadena de Ataque, COI & Remediación completa

Cómo el actor de amenaza TeamPCP desplegó el gusano Mini Shai-Hulud para envenenar paquetes TanStack y entornos de construcción de desarrolladores de compromiso.

TanStack npm "Mini Shai-Hulud" Cadena de Suministro - TeamPCP Cadena de Ataque, COI & Remediación completa
📌
Serie de Redondas de Seguridad: Semana del 12 de junio de 20264 min de lectura

Este post forma parte del Semana del 12 de junio de 2026.


Fondo: ¿Qué es TanStack?

TanStack es una colección de bibliotecas de código abierto JavaScript/TypeScript con 12 millones de descargas semanales en paquetes incluidos @tanstack/react-query, @tanstack/router, @tanstack/table, y @tanstack/virtual. Estos son ampliamente utilizados en aplicaciones web de producción en OpenAI, Vercel, Grafana y miles de empresas.

El ataque: "Mini Shai-Hulud"

On 11 de mayo de 2026 entre 19:20 y 19:26 UTC (una ventana de seis minutos), grupo de agentes amenazados TeamPCP publicado 84 versiones maliciosas enfrente 42 paquetes @tanstack/*. Al final del día, la campaña se había expandido hasta más 160 paquetes en npm y PyPI a través de un mecanismo de gusano autopropagante, llamado colectivamente "Mini Shai-Hulud".

Técnica de ataque: conquista de pwn + envenenamiento de caché + OIDC Hijack

El ataque combina tres técnicas de ataque de GitHub Actions conocidas públicamente con cero código novedoso:

  1. Pwn Request (pull request target): El atacante forked TanStack/router y presentó un PR. El CI/CD del repositorio utilizó el pull_request_target gatillo, que corre con permisos de escritura incluso de fork PRs, un patrón peligroso conocido documentado desde 2021.
  2. GitHub Actions Cache Poisoning: El PR malicioso inyectó una entrada de caché de pnpm envenenada. Cuando el flujo de trabajo de liberación de TanStack restauró el caché, cargó paquetes controlados por atacantes en lugar de los legítimos.
  3. Extracción de Token OIDC: Con el código ejecutando en el corredor, el atacante extrajo el token GitHub Actions OIDC directamente de la memoria del proceso del corredor, permitiendo a las npm publicar utilizando la propia identidad de confianza de TanStack con valida procedencia SLSA.

Malware Payload Analysis

Los paquetes maliciosos contenían un archivo obfuscado ~2.3 MB, router_init.js, inyectado como optionalDependency con una prepare guión del ciclo de vida. Cuando npm install / pnpm install corrió contra cualquier versión afectada:

# What router_init.js collected and exfiltrated:
- GitHub tokens (GITHUB_TOKEN, PAT tokens from env)
- AWS credentials (~/.aws/credentials, AWS_* env vars)
- GCP service account keys (~/.config/gcloud/)
- SSH private keys (~/.ssh/id_*)
- Kubernetes configs (~/.kube/config)
- CI/CD tokens (CIRCLE_TOKEN, TRAVIS_TOKEN, etc.)
- Docker registry tokens (~/.docker/config.json)
- NPM tokens (~/.npmrc)

# Exfiltration method:
# HTTPS POST to C2 (see IOCs below)
# Runs as a persistent background daemon on developer machines

Indicadores de cumplimiento

Malicious package indicator:
  File: node_modules/.pnpm/*/node_modules/@tanstack/router/router_init.js
  File size: ~2.3 MB (legitimate router files are much smaller)
  Package versions: @tanstack/* published 2026-05-11T19:20:00Z to 19:26:00Z

# Check for affected versions in your lockfile:
grep -E "@tanstack/[^:]+:(2026|.*2026-05-11)" package-lock.json yarn.lock pnpm-lock.yaml

# Check for IOC file:
find node_modules -name "router_init.js" -size +1M 2>/dev/null

# Check for suspicious background processes:
ps aux | grep -i "router_init\|tanstack" | grep -v grep

C2 infrastructure (defanged):
  teamPCP-associated infrastructure — see TeamPCP threat intel reports for full IOC list
  Look for: HTTPS POST requests to non-CDN endpoints from npm lifecycle scripts

Confirmado Impacto de Downstream

  • OpenAI: confirmada compromiso ambiental del desarrollador; rota las credenciales afectadas
  • Vercel: exposición confirmada al CI/CD; investigación interna completa
  • Grafana Labs: confirmada npm instalar versiones afectadas; credenciales rotadas
  • 334+ entornos de desarrolladores individuales confirmados comprometidos

Pasos de rehabilitación

# Step 1: Update all @tanstack packages to latest verified clean versions
npm update @tanstack/react-query @tanstack/router @tanstack/table @tanstack/virtual
# Or for pnpm:
pnpm update "@tanstack/*"

# Step 2: Delete and reinstall node_modules to clear any cached malicious content
rm -rf node_modules package-lock.json
npm install

# Step 3: If affected versions ran in your environment, rotate ALL secrets immediately:
# - GitHub Personal Access Tokens and repository deploy keys
# - AWS IAM access keys
# - GCP service account keys
# - Kubernetes service account tokens
# - Docker Hub / registry tokens
# - NPM publish tokens
# - Any CI/CD tokens (CircleCI, TravisCI, GitHub Actions secrets)
# - SSH private keys (generate new keypairs)

# Step 4: Harden your GitHub Actions workflows
# Pin actions to commit SHAs instead of tags:
# uses: actions/checkout@v4  →  uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683

# Step 5: Enable SLSA verification in your CI
# Use GitHub's artifact attestation (available since May 2024):
gh attestation verify path/to/artifact.tgz --owner your-org

# Step 6: Audit pull_request_target usage in your repos
grep -r "pull_request_target" .github/workflows/
# Any workflow triggered by pull_request_target that checks out PR code
# and has write permissions should be refactored to use pull_request instead