Recientemente se reportó una campaña de ataque de cadena de suministro bautizada como Mini Shai‑Hulud. Se trata de un malware del tipo worm o gusano, que ha comprometido múltiples paquetes npm, empezando por el ecosistema @tanstack/*, publicando versiones maliciosas a través de los propios pipelines de GitHub Actions de los proyectos utilizando tokens OIDC robados. Estas versiones maliciosas incluyen payloads ofuscados que roban credenciales de CI/CD, cloud, repositorios y herramientas de desarrollo, se mantienen persistentes en máquinas de desarrolladores y se auto‑propagan a otros paquetes utilizando tokens npm y OIDC válidos.
npm es el principal registry de paquetes para el ecosistema JavaScript y TypeScript, y se ha convertido en una pieza crítica de la cadena de suministro de software moderna. Millones de aplicaciones y pipelines CI/CD consumen automáticamente nuevas versiones de paquetes publicados en npm, lo que convierte cualquier compromiso de cuentas de mantenedores o de sus pipelines en un vector de impacto masivo y transversal. Esta dependencia estructural hace imprescindible aplicar controles de seguridad adicionales (registries intermedios, validación de versiones, políticas de publicación y observabilidad) en lugar de confiar ciegamente en que todo lo que llega desde npm es confiable.
La gravedad es crítica porque el worm puede leer memoria del runner de GitHub Actions y extraer absolutamente todos los secretos de un pipeline (incluyendo secretos “mascarados”), abusar de OIDC para publicar nuevos paquetes maliciosos con SLSA Build Level 3 válido, y además establece persistencia en estaciones de desarrollo e IDEs. En la práctica, cualquier entorno que haya instalado versiones comprometidas debe asumir compromiso total de todos los secretos accesibles desde esa máquina o pipeline.
Paquete comprometidos
| Paquete | Ecosistema | Versiones comprometidas | Comentario rápido |
| @tanstack/react-router | npm | 1.169.5, 1.169.8 | Router React muy utilizado en front‑end. |
| @tanstack/solid-router | npm | 1.169.5, 1.169.8 | Router para aplicaciones SolidJS. |
| @tanstack/vue-router | npm | 1.169.5, 1.169.8 | Router para aplicaciones Vue. |
| @tanstack/react-start | npm | 1.167.68, 1.167.71 | Framework full‑stack sobre React. |
| @tanstack/solid-start | npm | 1.167.65, 1.167.68 | Framework full‑stack sobre Solid. |
| @tanstack/vue-start | npm | 1.167.61, 1.167.64 | Framework full‑stack sobre Vue. |
| @mistralai/mistralai | npm | 2.2.3, 2.2.4 | SDK TypeScript oficial de Mistral AI. |
| mistralai | PyPI | 2.4.6 | SDK Python de Mistral AI. |
| guardrails-ai | PyPI | 0.10.1 | Librería popular para guardrails de LLM. |
| @opensearch-project/opensearch | npm | 3.6.2 | Cliente de OpenSearch. |
| @uipath/cli | npm | 1.0.1 | CLI de UiPath usada en automatización/RPA. |
| @uipath/robot | npm | 1.3.4 | Componente de robot UiPath. |
| @uipath/project-packager | npm | 1.1.16 | Paquete clave en proyectos UiPath. |
| @draftlab/auth | npm | 0.24.1, 0.24.2 | Auth para aplicaciones DraftLab. |
| @squawk/airport-data | npm | 0.7.4, 0.7.5, 0.7.7 | Datos aeronáuticos, usado en soluciones de aviación. |
Detalles técnicos del ataque
Vector de compromiso y publicación de paquetes
El grupo de amenazas TeamPCP lanzó una nueva ola del worm Mini Shai‑Hulud dirigida contra TanStack y otros proyectos de alto valor. Para ello, el atacante creó un fork malicioso del repositorio TanStack/router usando la cuenta voicproducoes y añadió dos artefactos clave: un paquete falso @tanstack/setup y un archivo de gran tamaño y fuertemente ofuscado llamado tanstack_runner.js. Este paquete @tanstack/setup se declara como dependencia opcional mediante una URL github: con un commit hash que aparenta pertenecer al repositorio oficial de TanStack, pero que en realidad apunta a ese fork malicioso.
En cada paquete comprometido se observaron dos cambios característicos:
- Se agregó en package.json un bloque optionalDependencies apuntando a @tanstack/setup a través de una URL github:tanstack/router#<commit-malicioso>.
- Se añadió un archivo grande router_init.js en la raíz del paquete, que no debería estar presente según el campo files (que solo lista dist y src), evidenciando manipulación del tarball fuera del proceso de build normal.
La publicación de los paquetes maliciosos no se hizo con credenciales robadas a un maintainer, sino comprometiento el propio pipeline de GitHub Actions, aprovechando el token OIDC del runner para publicar directamente en npm. Como parte de la campaña, los paquetes maliciosos incluyen attestations SLSA v1 de nivel 3 emitidas por la infraestructura de firmado de npm (Sigstore/Fulcio/Rekor), de forma que parecen legítimos a pesar de haber sido generados por un pipeline ya comprometido.
Características del gusano y del payload
El archivo router_init.js:
(hash SHA‑256 ab4fcadaec49c03278063dd269ea5eef82d24f2124a8e15d7b90f2fa8601266c) contiene un payload de unas 2,3 MB altamente ofuscado que implementa un stealer multi‑stage con capacidades de worm.
Principales capacidades:
- Ofuscación avanzada: tres capas de ofuscación, incluyendo tabla de strings ofuscada, un cifrado de sustitución con PBKDF2‑SHA256 y cargas secundarias cifradas con AES‑256‑GCM que se descomprimen con Bun.gunzipSync.
- Uso del runtime Bun: el payload instala y utiliza Bun 1.3.13 en vez de Node.js, evadiendo herramientas de seguridad centradas en hooks de Node (–require, etc.).
- Scraping de memoria del runner de GitHub Actions: un payload en Python lee /proc/<pid>/mem del proceso Runner.Worker para extraer JSON internos del tipo {«value»:»…»,»isSecret»:true}, obteniendo todos los secretos configurados en el workflow, aunque estén enmascarados o nunca se escriban a disco.
- Robo de credenciales cloud: invoca metadatos de AWS (169.254.169.254 IMDSv2), ECS (169.254.170.2), y sockets locales de HashiCorp Vault (127.0.0.1:8200) para obtener credenciales temporales, tokens y secretos.
- Recolección de ficheros de credenciales: recorre más de 100 rutas conocidas para extraer tokens npm, PATs de GitHub, claves de AWS, GCP, Azure, archivos de wallets de criptomonedas, historiales de shell y configuraciones de herramientas de IA y mensajería.
- Persistencia en estaciones de trabajo: crea archivos en .claude/ y .vscode/ para engancharse a eventos de apertura de sesión en Claude Code y apertura de carpeta en VS Code, y además instala servicios tipo gh-token-monitor vía LaunchAgents en macOS o systemd user en Linux.
Auto‑propagación
Mini Shai‑Hulud se comporta como un gusano (worm) de npm, utilizando tokens robados para comprometer más paquetes:
- Busca tokens npm con bypass_2fa true (publicación sin 2FA) y, si los encuentra, enumera todos los paquetes del mismo maintainer usando la API de búsqueda de npm.
- En entornos CI/CD, intercambia tokens OIDC de GitHub por tokens de publicación npm por paquete mediante el endpoint de oidc/token/exchange, evitando el flujo estándar de autenticación.
- Publica artefactos infectados para todos los paquetes con permisos suficientes, replicando la infección.
Además, inyecta workflows maliciosos en .github/workflows/codeql_analysis.yml que utilizan toJSON(secrets) para serializar todos los secretos del repositorio y exfiltrarlos directamente a infraestructura de C2 (por HTTP POST) o como artefactos subidos en acciones aparentemente legítimas.
Exfiltración y ransom
La exfiltración de datos combina dos canales principales:
- Session Protocol CDN: subida de blobs cifrados a filev2.getsession.org, parte de la infraestructura de la red Session, usando cifrado híbrido RSA‑4096 + AES‑256‑GCM.
- Dead‑drop en GitHub: usa la API GraphQL de GitHub para crear commits en repositorios controlados por el atacante, firmados como claude@users.noreply.github.com, con mensajes chore: update dependencies y ramas que imitan la convención de Dependabot (dependabot/github_actions/format/<palabra-dune>).
La campaña incluye también un componente de extorsión/ransom: el malware crea tokens npm con descripción IfYouRevokeThisTokenItWillWipeTheComputerOfTheOwner, indicando que revocar el token puede disparar una rutina destructiva que borra el equipo del propietario.
Detección e indicadores claves
A nivel de sysadmin/DevOps, son indicadores muy prácticos:
- Presencia de router_init.js en node_modules o en la raíz de paquetes @tanstack/*.
- package.json con optionalDependencies apuntando a github:tanstack/router#79ac49eedf774dd4b0cfa308722bc463cfe5885c.
- Crecimiento inusual del tamaño del tarball (paquetes ~900 KB frente a ~190 KB para versiones limpias).
- Procesos bun ejecutándose durante npm install de paquetes que normalmente no usan Bun.
- Procesos python3 leyendo /proc/*/mem en runners de CI.
- Conexiones de red desde npm install o jobs de CI hacia filev2.getsession.org, api.masscan.cloud o git-tanstack.com.
- Tokens npm con descripción IfYouRevokeThisTokenItWillWipeTheComputerOfTheOwner.
- Commits inesperados firmados como claude@users.noreply.github.com con ramas tipo dependabot/github_actions/format/<palabra-dune>.
| Tipo | Valor | Descripción / uso sugerido |
| SHA‑256 | ab4fcadaec49c03278063dd269ea5eef82d24f2124a8e15d7b90f2fa8601266c | Hash de router_init.js (payload principal en paquetes TanStack). Bloquear/alertar en EDR, AV y búsquedas forenses. |
| Proceso | bun | Ejecuciones de bun durante npm install o jobs de CI en repos que no usan Bun de forma legítima. Crear regla de detección/anomalía. |
| Fichero local | router_init.js | Archivo malicioso añadido en la raíz de paquetes @tanstack/*. Buscar en disco, contenedores y artefactos. |
| Fichero local | .claude/router_runtime.js, .claude/setup.mjs | Persistencia en entornos de desarrollo (Claude Code). Revisar y eliminar. |
| Fichero local | .vscode/setup.mjs | Persistencia en VS Code vía tareas/extensiones. Revisar y eliminar. |
| Servicio | gh-token-monitor | Servicio de usuario (systemd / LaunchAgent) usado para monitorizar tokens. Buscar y deshabilitar. |
| Dominio C2 | filev2.getsession.org | CDN de la red Session usado para exfiltrar datos cifrados. Bloquear o alertar en proxy/firewall. |
| Dominio/C2 | api.masscan.cloud | Infraestructuras relacionadas usadas en campañas previas de la misma familia. Monitorizar conexiones salientes. |
| Infra GitHub | Commits con autor claude@users.noreply.github.com en ramas dependabot/github_actions/format/<palabra-dune> | Dead‑drop en repos de la víctima. Crear hunting query en GitHub / código fuente. |
| Red interna | http://169.254.169.254 | Acceso a AWS IMDS (robo de credenciales). Alertar si se ve desde contenedores/runners que no deberían tocar metadatos. |
| Red interna | http://169.254.170.2 | Endpoint ECS/Task metadatos. Idem anterior. |
| Red interna | http://127.0.0.1:8200 | Intentos de acceso a HashiCorp Vault local. Monitorizar en runners de CI. |
| Token npm | Descripción IfYouRevokeThisTokenItWillWipeTheComputerOfTheOwner | Tokens maliciosos creados por el malware. Enumerar tokens npm y tratarlos como indicador de compromiso crítico. |
Mitigación recomendada
Evaluar exposición (dev y CI/CD)
- Revisar package-lock.json / pnpm-lock.yaml / yarn.lock por versiones afectadas de @tanstack/* y otros paquetes listados (UiPath, DraftLab, etc.).
- Buscar router_init.js y referencias a @tanstack/setup en node_modules y repos locales.
- Revisar logs de GitHub Actions (o CI) por:
- menciones a @tanstack/setup,
- uso de bun run tanstack_runner.js u otros comandos Bun,
- conexiones de red inusuales durante la instalación de dependencias.
Contención y análisis forense
- Aislar cualquier dev machine o runner CI que haya hecho npm install con versiones comprometidas de @tanstack/*.
- Obtener imagen forense antes de limpiar, sobre todo si hay tokens npm con el mensaje de amenaza.
- No revocar de inmediato tokens npm con IfYouRevokeThisTokenItWillWipeTheComputerOfTheOwner hasta aislar y analizar el equipo.
Eliminación de persistencia:
En equipos de desarrollo
- Claude / VS Code:
- Borrar .claude/router_runtime.js y .claude/setup.mjs.
- Revisar/restaurar .claude/settings.json.
- Revisar .vscode/tasks.json y borrar .vscode/setup.mjs.
- Servicios de monitorización de tokens:
- macOS: launchctl unload ~/Library/LaunchAgents/com.user.gh-token-monitor.plist y borrar plist, ~/.local/bin/gh-token-monitor.sh y ~/.config/gh-token-monitor.
- Linux: systemctl –user stop/disable gh-token-monitor y borrar ~/.config/systemd/user/gh-token-monitor.service.
En repositorios
- Auditar .github/workflows/codeql_analysis.yml y workflows recientes que usen toJSON(secrets) o hagan POST a dominios no esperados, y eliminarlos o corregirlos.
Rotación de secretos
Asumiendo compromiso donde se instaló una versión maliciosa:
- Rotar:
- tokens npm (incluidos los de CI),
- PATs y tokens de GitHub (usuario y Actions),
- credenciales de AWS, GCP, Azure, Vault y otros clouds,
- claves SSH usadas en esos equipos o runners.
- Si hay wallets de criptomonedas, mover fondos a nuevas wallets.
Solución y recomendaciones de hardening
Actualización / limpieza de dependencias
- Pin a versiones seguras de @tanstack/* según las tablas de versiones limpias publicadas por TanStack y los reportes de StepSecurity/Snyk; la regla operativa es regresar a la última versión anterior a las fechas del ataque (11 de mayo de 2026 para TanStack) y eliminar versiones publicadas en esa ventana.
- Tras ajustar versiones, ejecutar:
- rm -rf node_modules
- npm install (o equivalente en pnpm/yarn) para regenerar el árbol con versiones no comprometidas.
Endurecer pipelines CI/CD
Buenas prácticas específicas para este caso:
- Restringir al mínimo los permisos de tokens OIDC en workflows (id-token: write solo donde sea imprescindible) y usar jobs separados con políticas de menor privilegio para publicación en registries.
- Implementar un cooldown para versiones nuevas de paquetes (p.ej. 3–10 días) en un registry intermedio (Artifactory, Nexus, o soluciones como StepSecurity Secure Registry), de modo que paquetes publicados hace minutos no se consuman automáticamente en CI.
- Implementar egress control en runners de CI (whitelists de dominios permitidos), de forma similar a soluciones como Harden‑Runner, que bloquean conexiones a dominios de C2 en tiempo real.
- Automatizar comprobaciones de reputación de paquetes y firmas (SLSA, Sigstore) entendiendo que la provenance no garantiza ausencia de compromiso, solo identifica el pipeline que generó el artefacto.
Controles adicionales en desarrollo
- Introducir escaneo continuo de dependencias para malware y campañas conocidas (Mini Shai‑Hulud, Shai‑Hulud 2.0, etc.) utilizando feeds de inteligencia actualizados de proveedores de seguridad.
- Limitar el uso de dependencias github: en package.json, sobre todo cuando apuntan a commits de forks, y establecer revisiones manuales en PRs que introduzcan este patrón.
Referencias
- StepSecurity – “TeamPCP’s Mini Shai‑Hulud Is Back: A Self-Spreading Supply Chain Attack Compromises TanStack npm Packages”
- TanStack – “Postmortem: TanStack npm supply-chain compromise”
- GitHub Security Advisory – GHSA‑g7cv‑rxg3‑hmpx: Malware in @tanstack/* packages exfiltrates cloud credentials
- Snyk – “TanStack npm Packages Hit by Mini Shai‑Hulud”
- Wiz – “Mini Shai‑Hulud Strikes Again: TanStack + more npm packages compromised”
- Saiyam Pathak – “How an Attacker Hijacked 84 TanStack Packages”
- GitHub – TanStack/router issue #7383 “Several npm latest releases are compromised”
- GitLab / GitHub Advisory Mirror – CVE‑2026‑45321: Malware in @tanstack/* packages
Anexo – Todos los paquetes comprometidos
En total, la campaña Mini Shai‑Hulud afectó a 170 paquetes distintos y dio lugar a al menos 348 artefactos maliciosos publicados en los registries npm y PyPI durante esta ola.
| # | Scope / paquete | Versiones comprometidas | Ecosistema | Notas relevantes |
| 1 | @mistralai/mistralai | 2.2.3, 2.2.4 | npm | SDK TypeScript oficial de Mistral AI |
| 2 | @mistralai/mistralai-azure | 1.7.2, 1.7.3 | npm | Cliente para despliegues en Azure |
| 3 | @mistralai/mistralai-gcp | 1.7.2, 1.7.3 | npm | Cliente para despliegues en GCP |
| 4 | mistralai | 2.4.6 | PyPI | SDK Python de Mistral; tratar entornos como comprometidos |
| 5 | guardrails-ai | 0.10.1 | PyPI | Librería de guardrails para LLM afectada en la campaña |
| 6 | @opensearch-project/opensearch | 3.6.2 | npm | Cliente relacionado con OpenSearch |
| 7 | @tanstack/router-utils | 1.161.11, 1.161.14 | npm | Parte del stack de routing de TanStack |
| 8 | @tanstack/router-core | 1.169.5, 1.169.8 | npm | Núcleo del router TanStack |
| 9 | @tanstack/history | 1.161.9, 1.161.12 | npm | Gestión de historial para el router |
| 10 | @tanstack/react-router | 1.169.5, 1.169.8 | npm | Router React, muy usado en front‑end |
| 11 | @tanstack/react-router-devtools | 1.166.16, 1.166.19 | npm | Devtools del router React |
| 12 | @tanstack/react-router-ssr-query | 1.166.15, 1.166.18 | npm | Integración SSR + queries |
| 13 | @tanstack/react-start | 1.167.68, 1.167.71 | npm | Framework full‑stack react‑start |
| 14 | @tanstack/react-start-client | 1.166.51, 1.166.54 | npm | Cliente de react‑start |
| 15 | @tanstack/react-start-rsc | 0.0.47, 0.0.50 | npm | Soporte React Server Components |
| 16 | @tanstack/react-start-server | 1.166.55, 1.166.58 | npm | Servidor react‑start |
| 17 | @tanstack/router-cli | 1.166.46, 1.166.49 | npm | CLI del router TanStack |
| 18 | @tanstack/router-devtools | 1.166.16, 1.166.19 | npm | Devtools del router (core) |
| 19 | @tanstack/router-devtools-core | 1.167.6, 1.167.9 | npm | Núcleo de devtools para router |
| 20 | @tanstack/router-generator | 1.166.45, 1.166.48 | npm | Generador de rutas |
| 21 | @tanstack/router-plugin | 1.167.38, 1.167.41 | npm | Plugin de router |
| 22 | @tanstack/router-ssr-query-core | 1.168.3, 1.168.6 | npm | Core para SSR + queries |
| 23 | @tanstack/router-vite-plugin | 1.166.53, 1.166.56 | npm | Plugin de Vite para router |
| 24 | @tanstack/solid-router | 1.169.5, 1.169.8 | npm | Router para SolidJS |
| 25 | @tanstack/solid-router-devtools | 1.166.16, 1.166.19 | npm | Devtools para Solid router |
| 26 | @tanstack/solid-router-ssr-query | 1.166.15, 1.166.18 | npm | SSR + queries para Solid |
| 27 | @tanstack/solid-start | 1.167.65, 1.167.68 | npm | Framework Solid Start |
| 28 | @tanstack/solid-start-client | 1.166.50, 1.166.53 | npm | Cliente Solid Start |
| 29 | @tanstack/solid-start-server | 1.166.54, 1.166.57 | npm | Servidor Solid Start |
| 30 | @tanstack/start-client-core | 1.168.5, 1.168.8 | npm | Core cliente TanStack Start |
| 31 | @tanstack/start-fn-stubs | 1.161.9, 1.161.12 | npm | Stubs de funciones Start |
| 32 | @tanstack/start-plugin-core | 1.169.23, 1.169.26 | npm | Core de plugins Start |
| 33 | @tanstack/start-server-core | 1.167.33, 1.167.36 | npm | Core de servidor Start |
| 34 | @tanstack/start-static-server-functions | 1.166.44, 1.166.47 | npm | Funciones de servidor estático |
| 35 | @tanstack/start-storage-context | 1.166.38, 1.166.41 | npm | Contexto de almacenamiento Start |
| 36 | @tanstack/arktype-adapter | 1.166.12, 1.166.15 | npm | Adaptador de tipos ArkType |
| 37 | @tanstack/valibot-adapter | 1.166.12, 1.166.15 | npm | Adaptador Valibot |
| 38 | @tanstack/virtual-file-routes | 1.161.10, 1.161.13 | npm | Rutas basadas en archivos virtuales |
| 39 | @tanstack/vue-router | 1.169.5, 1.169.8 | npm | Router para Vue |
| 40 | @tanstack/vue-router-devtools | 1.166.16, 1.166.19 | npm | Devtools Vue router |
| 41 | @tanstack/vue-router-ssr-query | 1.166.15, 1.166.18 | npm | SSR + queries para Vue |
| 42 | @tanstack/vue-start | 1.167.61, 1.167.64 | npm | Framework Vue Start |
| 43 | @tanstack/vue-start-client | 1.166.46, 1.166.49 | npm | Cliente Vue Start |
| 44 | @tanstack/vue-start-server | 1.166.50, 1.166.53 | npm | Servidor Vue Start |
| 45 | @tanstack/zod-adapter | 1.166.12, 1.166.15 | npm | Adaptador Zod |
| 46 | @tanstack/eslint-plugin-router | 1.161.9, 1.161.12 | npm | Plugin ESLint para router |
| 47 | @tanstack/eslint-plugin-start | 0.0.4, 0.0.7 | npm | Plugin ESLint para Start |
| 48 | @squawk/airways | 0.4.2, 0.4.3, 0.4.5 | npm | Parte del ecosistema aeronáutico Squawk |
| 49 | @squawk/airport-data | 0.7.4, 0.7.5, 0.7.7 | npm | Datos de aeropuertos |
| 50 | @squawk/airports | 0.6.2, 0.6.3, 0.6.5 | npm | API de aeropuertos |
| 51 | @squawk/airspace | 0.8.1, 0.8.2, 0.8.4 | npm | Datos de espacio aéreo |
| 52 | @squawk/airspace-data | 0.5.3, 0.5.4, 0.5.6 | npm | Dataset de espacio aéreo |
| 53 | @squawk/airway-data | 0.5.4, 0.5.5, 0.5.7 | npm | Dataset de aerovías |
| 54 | @squawk/fix-data | 0.6.4, 0.6.5, 0.6.7 | npm | Puntos de navegación (fixes) |
| 55 | @squawk/fixes | 0.3.2, 0.3.3, 0.3.5 | npm | API de fixes |
| 56 | @squawk/flight-math | 0.5.4, 0.5.5, 0.5.7 | npm | Utilidades de cálculo de vuelo |
| 57 | @squawk/flightplan | 0.5.2, 0.5.3, 0.5.5 | npm | Planificación de vuelos |
| 58 | @squawk/geo | 0.4.4, 0.4.5, 0.4.7 | npm | Funciones geoespaciales |
| 59 | @squawk/icao-registry | 0.5.2, 0.5.3, 0.5.5 | npm | Registro ICAO |
| 60 | @squawk/icao-registry-data | 0.8.4, 0.8.5, 0.8.7 | npm | Dataset ICAO |
| 61 | @squawk/mcp | 0.9.1, 0.9.2, 0.9.4 | npm | Herramientas MCP |
| 62 | @squawk/navaid-data | 0.6.4, 0.6.5, 0.6.7 | npm | Datos de radio‑ayudas |
| 63 | @squawk/navaids | 0.4.2, 0.4.3, 0.4.5 | npm | API de navaids |
| 64 | @squawk/notams | 0.3.6, 0.3.7, 0.3.9 | npm | NOTAMs |
| 65 | @squawk/procedure-data | 0.7.3, 0.7.4, 0.7.6 | npm | Datos de procedimientos |
| 66 | @squawk/procedures | 0.5.2, 0.5.3, 0.5.5 | npm | API de procedimientos |
| 67 | @squawk/types | 0.8.1, 0.8.2, 0.8.4 | npm | Tipos compartidos |
| 68 | @squawk/units | 0.4.3, 0.4.4, 0.4.6 | npm | Unidades de medida |
| 69 | @squawk/weather | 0.5.6, 0.5.7, 0.5.9 | npm | Datos meteorológicos |
| 70 | @uipath/* (múltiples paquetes) | Versiones listadas en tu texto original | npm | Más de 50 paquetes en el scope @uipath afectados |
| 71 | @draftauth/client | 0.2.1, 0.2.2 | npm | Cliente de autenticación DraftAuth |
| 72 | @draftauth/core | 0.13.1, 0.13.2 | npm | Núcleo DraftAuth |
| 73 | @draftlab/auth | 0.24.1, 0.24.2 | npm | Auth de DraftLab |
| 74 | @draftlab/auth-router | 0.5.1, 0.5.2 | npm | Router de autenticación |
| 75 | @draftlab/db | 0.16.1, 0.16.2 | npm | Capa de datos DraftLab |
| 76 | @beproduct/nestjs-auth | 0.1.2–0.1.17, 0.1.19 | npm | Múltiples versiones comprometidas |
| 77 | @dirigible-ai/sdk | 0.6.2, 0.6.3 | npm | SDK Dirigible AI |
| 78 | @ml-toolkit-ts/preprocessing | 1.0.2, 1.0.3 | npm | Parte de ml‑toolkit‑ts |
| 79 | @ml-toolkit-ts/xgboost | 1.0.3, 1.0.4 | npm | Binding XGBoost |
| 80 | ml-toolkit-ts | 1.0.4, 1.0.5 | npm | Paquete principal |
| 81 | @tallyui/* (components, core, etc.) | Versiones indicadas en tu lista | npm | Scope @tallyui afectado en bloque |
| 82 | @mesadev/rest | 0.28.3 | npm | Parte del ecosistema MesaDev |
| 83 | @mesadev/saguaro | 0.4.22 | npm | Paquete MesaDev |
| 84 | @mesadev/sdk | 0.28.3 | npm | SDK MesaDev |
| 85 | safe-action | 0.8.3, 0.8.4 | npm | Paquete de acciones seguras |
| 86 | @supersurkhet/cli | 0.0.2–0.0.7 | npm | CLI Supersurkhet |
| 87 | @supersurkhet/sdk | 0.0.2–0.0.7 | npm | SDK Supersurkhet |
| 88 | cmux-agent-mcp | 0.1.3–0.1.8 | npm | Herramienta MCP |
| 89 | git-git-git | 1.0.8–1.0.10, 1.0.12 | npm | Utilidades git |
| 90 | git-branch-selector | 1.3.3–1.3.5, 1.3.7 | npm | Selector de ramas git |
| 91 | nextmove-mcp | 0.1.3–0.1.5, 0.1.7 | npm | Cliente MCP |
| 92 | agentwork-cli | 0.1.4, 0.1.5 | npm | CLI AgentWork |
| 93 | wot-api | 0.8.1, 0.8.2, 0.8.4 | npm | API WoT |
| 94 | cross-stitch | 1.1.3, 1.1.4, 1.1.6 | npm | Librería utilitaria |
| 95 | ts-dna | 3.0.1, 3.0.2, 3.0.4 | npm | Paquete TypeScript |