Skip to main content

Uma conta esquecida de colaborador comprometeu todo o escopo de pacotes npm da Mastra

Escrito por
Headshot of Marian Corneci

Marian Corneci

blog feature toolkit

17 de junho de 2026

0 minutos de leitura

Em 17 de junho de 2026, um invasor republicou todo o escopo npm @mastra, inserindo uma única dependência maliciosa em 143 pacotes — e esse número continua crescendo. Entre eles está @mastra/core, que recebe cerca de 4 milhões de downloads por mês e é usado por centenas de projetos dependentes. A dependência injetada, easy-day-js, imita o dayjs. Seu script de instalação desativa a verificação de TLS, baixa uma carga maliciosa de segundo estágio de um endereço IP direto e executa em segundo plano um ladrão de criptomoedas multiplataforma. O ataque a esse pacote npm foi possível porque o acesso ao escopo de uma conta de um ex-colaborador nunca foi revogado.

Atenção: se você instalou algum pacote @mastra, ou algo que dependa de um deles, em uma árvore de dependências nova ou atualizada em 17 de junho de 2026 ou depois, considere isso um incidente de exposição de credenciais e carteiras e continue lendo.

ATUALIZAÇÃO: a Snyk adicionou um novo pacote comprometido: @mastra/node-speaker, versão 0.1.1.

Em resumo

  • Incidente: tomada do escopo npm @mastra, com republicação em massa e injeção de uma dependência maliciosa

  • Dependência maliciosa: easy-day-js@1.11.22 (um impostor do dayjs que atua como dropper)

  • Alerta da Snyk: SNYK-JS-EASYDAYJS-17353313, código malicioso incorporado, afeta easy-day-js 1.11.21 e 1.11.22

  • Pacotes afetados: praticamente todo o escopo @mastra, republicado em 17 de junho de 2026; a correção da própria Mastra abrange 142 pacotes publicáveis

  • Versões de destaque: @mastra/core@1.42.1, mastra@1.13.1, create-mastra@1.13.1

  • CVE / CVSS: nenhum atribuído; trata-se de um incidente ativo na cadeia de suprimentos, e o código-fonte da Mastra não foi modificado

  • Carga maliciosa: ladrão de carteiras de criptomoedas multiplataforma e trojan de acesso remoto com persistência

  • Status: easy-day-js foi removido do npm, ehindero não é mais proprietário do escopo, e a Mastra lançou versões limpas posteriores (PR #18056). A versão mais recente de @mastra/core latest voltou para a versão limpa 1.42.0. Considere qualquer versão comprometida que você já tenha resolvido como um incidente de exposição do host.

Como o ataque aconteceu

O ponto de entrada foi uma credencial antiga de mantenedor. O escopo @mastra era publicado pela conta npm ehindero, de um ex-colaborador real da Mastra. O histórico de publicações do registro npm mostra lançamentos alfa legítimos de @mastra/core feitos por essa conta no fim de 2024 e no início de 2025. Depois disso, ela ficou inativa, mas seu acesso ao escopo nunca foi revogado.

Há indícios de que a conta foi tomada por terceiros, e não de uma ação interna. Entre eles está a alteração do e-mail, que deixou de ser o endereço original do colaborador e passou a ser ehindero2016@tutamail[.]com. Vale refletir sobre como isso foi possível: o npm não expira permissões de publicação em escopos por inatividade. Assim, uma única credencial antiga de mantenedor bastou para publicar em todos os pacotes do escopo. A causa raiz foi a falta de cuidados básicos com o projeto, não uma vulnerabilidade de dia zero.

O vetor: uma linha em cada package.json

O invasor não alterou o código-fonte da Mastra. O código malicioso foi inserido nos arquivos tar publicados no momento da publicação, e a própria PR de correção da Mastra confirma que o repositório foi verificado e não continha easy-day-js em nenhum package.json ou arquivo de lock (PR #18056). Cada versão maliciosa publicada no npm acrescentou exatamente uma linha ao package.json publicado:

"easy-day-js": "^1.11.21"

A dependência nunca é importada no código-fonte da Mastra. Sua única função é introduzir um trojan durante a instalação. O truque está no intervalo indicado pelo circunflexo. Primeiro, o invasor publicou uma versão limpa de easy-day-js@1.11.21 em 16 de junho, um impostor idêntico byte a byte ao dayjs, até mesmo no arquivo incluído dayjs.min.js e na descrição do pacote. No dia seguinte, publicou easy-day-js@1.11.22 com o malware e a marcou como latest. Como 1.11.22 satisfaz ^1.11.21, uma execução normal de npm install resolve diretamente para a versão armada.

Em seguida, numa onda em 17 de junho de 2026, o invasor republicou o restante do escopo, com a mesma dependência injetada em cada pacote. A correção da própria Mastra identifica com precisão a extensão do impacto: o changeset de emergência avança 142 pacotes publicáveis do escopo @mastra/*, além de mastra, create-mastra e mastracode (PR #18056). As informações públicas variam de 80 a 144 pacotes, dependendo do momento considerado. Porém, a estimativa do próprio fornecedor é a referência mais confiável, e a conclusão é a mesma: praticamente todo o escopo foi afetado.

Em alguns pacotes, o invasor chegou a publicar versões superiores à versão legítima latest (por exemplo, @mastra/schema-compat@1.2.12, @mastra/react@1.0.1, @mastra/voice-playai@0.12.2). Isso obrigou a Mastra a fixar versões explicitamente mais altas, em vez de usar simples atualizações de patch para substituí-las (PR #18060).

O dropper do malware: desativar o TLS, baixar, executar em segundo plano e apagar

easy-day-js@1.11.22 inclui um setup.cjs que é executado como um hook de postinstall. Durante a instalação, ele:

  1. Desativa a validação de certificados TLS definindo NODE_TLS_REJECT_UNAUTHORIZED='0', permitindo que uma solicitação HTTPS seja concluída mesmo com um certificado autoassinado em um IP direto.

  2. Cria arquivos marcadores (~/.pkg_history, ~/.pkg_logs) para rastrear as instalações.

  3. Baixa uma carga maliciosa de segundo estágio de https://23.254.164[.]92:8000/update/49890878 (hospedado na Hostwinds).

  4. Grava o arquivo no diretório temporário e o inicia como um processo oculto e separado em segundo plano, sem saída no console.

  5. Apaga a si mesmo para reduzir os vestígios forenses.

A carga maliciosa: ladrão de criptomoedas multiplataforma e RAT

O segundo estágio (SHA256 221c45a790dec2a296af57969e1165a16f8f49733aeab64c0bbd768d9943badf) é um ladrão de carteiras de criptomoedas ofuscado, da mesma categoria de cargas maliciosas que a Snyk já identificou em outros ataques ao npm. Ele examina os perfis do Chrome, Brave e Edge em busca de uma lista codificada de extensões de navegador para carteiras de criptomoedas, incluindo MetaMask, Phantom, Solflare, Coinbase Wallet, OKX e Keplr. Além dos dados das carteiras, coleta nome de usuário, nome do host, sistema operacional e arquitetura, versão do Node, aplicativos instalados, histórico do navegador e lista de processos em execução. Depois, codifica tudo em Base64 e inclui os dados em um beacon JSON.

Ele também estabelece persistência disfarçado de ferramenta do Node e envia sinais para um C2 de RAT separado (23.254.164[.]123/49890878) aproximadamente a cada 10 minutos, usando um certificado de teste autoassinado do wolfSSL (CN=www.wolfssl.com, expirado em janeiro de 2018):

  • macOS: LaunchAgent em ~/Library/LaunchAgents/com.nvm.protocal.plist

  • Linux: serviço de usuário systemd ~/.config/systemd/user/nvmconf.service

  • Windows: execução do PowerShell preparada em C:\ProgramData\NodePackages

A dependência inicialmente limpa e depois armada, o dropper de postinstall setup, o download de um IP direto com desvio do TLS e a carga de roubo de criptomoedas são muito semelhantes ao comprometimento do pacote Axios no npm, analisado pela Snyk no início de 2026. A semelhança inclui o dropper executado durante a instalação que se apaga. A Microsoft Threat Intelligence atribuiu aquela campanha anterior ao agente que rastreia como Sapphire Sleet (BlueNoroff). A atribuição deste incidente especificamente não foi confirmada, e não faremos especulações; esse padrão merece atenção dos responsáveis pela defesa, mas não deve ser tratado como fato comprovado.

Análise do impacto

Só @mastra/core recebe cerca de 4 milhões de downloads por mês (registro do npm) e é usado por centenas de projetos dependentes; mastra acrescenta cerca de 1,5 milhão de downloads (registro do npm). Como 142 pacotes do escopo foram republicados, o volume agregado de downloads mensais chega a dezenas de milhões, o que significa que o potencial de impacto é amplo.

A exposição prática é mais restrita do que esse número sugere, e vale ser preciso. Você só está em risco se uma máquina de build ou de desenvolvimento resolveu uma das versões maliciosas durante o período de exposição. Os arquivos de lock são decisivos e representam uma forma segura e reproduzível de gerenciar dependências em projetos npm:

  • Fixada por um arquivo de lock versionado em uma versão anterior ao incidente: um npm ci não teria instalado a versão maliciosa. Provavelmente você está em segurança, mas confirme.

  • Sem arquivo de lock, usando um intervalo amplo ou fazendo uma instalação nova/regenerando o arquivo de lock em 17 de junho ou depois: o intervalo com circunflexo teria resolvido para a versão armada easy-day-js@1.11.22, e o hook de postinstall teria sido executado.

Como a carga maliciosa é executada durante a instalação, runners de CI, agentes de build temporários e laptops de desenvolvedores também estão em risco, não apenas servidores de produção. Qualquer um desses hosts pode ter exposto credenciais e carteiras.

Detecção: você foi afetado?

1. Verifique se easy-day-js já esteve na sua árvore de dependências. Não há motivo legítimo para ele estar lá:

npm ls easy-day-js

grep -r "easy-day-js" package-lock.json yarn.lock pnpm-lock.yaml 2>/dev/null

2. Audite as @mastra que foram resolvidas. As versões comprometidas foram publicadas em 17 de junho de 2026 e não têm proveniência SLSA. Verifique o que foi realmente fixado no arquivo de lock:

npm ls @mastra/core mastra create-mastra

3. Faça uma varredura com a Snyk. A Snyk sinaliza o pacote malicioso como SNYK-JS-EASYDAYJS-17353313 (código malicioso incorporado):

snyk test

snyk monitor

4. Procure artefatos nos hosts em qualquer máquina que tenha executado uma instalação durante o período:

#Dropper markers

ls -la ~/.pkg_history ~/.pkg_logs 2>/dev/null

#Persistence

ls -la ~/Library/LaunchAgents/com.nvm.protocal.plist 2>/dev/null      # macOS

ls -la ~/.config/systemd/user/nvmconf.service 2>/dev/null             # Linux

dir "C:\ProgramData\NodePackages"                                      # Windows

5. Verifique os logs de tráfego de saída em busca de conexões com 23.254.164[.]92:8000, 23.254.164[.]123 ou qualquer endereço em 23.254.164.0/24.

Para ver na prática como identificar e corrigir com a Snyk um comprometimento desse tipo que afeta todo um escopo npm, esta demonstração de correção apresenta o processo completo:

Shai-Hulud NPM Attack: Remediation with Snyk

Ataque Shai-Hulud ao NPM: correção com a Snyk (um fluxo prático de correção para um ataque à cadeia de suprimentos do npm com republicação em massa).

Correção

Se easy-day-js não estiver presente e o arquivo de lock tiver fixado versões de @mastra anteriores ao incidente: confirme seguindo as etapas de detecção acima, mantenha as versões fixadas no arquivo de lock e siga em frente.

Se você resolveu uma versão maliciosa, considere comprometido qualquer host afetado.

  1. Atualize para uma versão limpa; não basta fixar uma versão anterior. A Mastra lançou versões limpas posteriores para todos os 142 pacotes publicáveis e moveu a etiqueta de distribuição latest para além das versões comprometidas (PR #18056, PR #18049), em vez de depender da remoção dos pacotes. Atualize para a versão limpa atual (por exemplo, @mastra/core@1.42.0 ou posterior), gere um arquivo de lock limpo e remova qualquer vestígio de easy-day-js. Como o invasor publicou algumas versões acima da latest legítima, confirme que a versão escolhida é uma versão confiável da Mastra, e não uma versão maliciosa que permaneceu no registro.

  2. Altere todas as credenciais às quais o host poderia ter acesso: chaves de nuvem, segredos e tokens de CI, chaves de API de LLMs e outros serviços, tokens npm e chaves SSH. Como a Mastra é um framework de agentes, é especialmente provável que houvesse chaves de provedores de LLMs.

  3. Transfira seus criptoativos: se o perfil do navegador na máquina continha uma extensão de carteira visada, considere expostas a frase-semente e as chaves e transfira os fundos para uma carteira nova usando um dispositivo limpo.

  4. Remova os mecanismos de persistência: exclua o LaunchAgent, a unidade systemd ou os arquivos preparados em C:\ProgramData\NodePackages, encerre o processo separado e remova os arquivos marcadores do dropper.

  5. Se possível, reinstale o sistema do zero. Quando um RAT já estabeleceu persistência, reconstruir o ambiente do zero é a opção mais segura.

Para reduzir a exposição a esse tipo de ataque no futuro:

  • Desative os scripts de instalação por padrão com npm config set ignore-scripts true e permita-os apenas quando forem realmente necessários para uma compilação. Isso neutraliza os droppers de postinstall e é uma das práticas recomendadas de segurança para npm da Snyk.

  • Faça commit dos arquivos de lock e use npm ci na CI para garantir compilações reproduzíveis e impedir que uma alteração na tag latest provoque uma nova resolução silenciosa de dependências.

  • Exija proveniência. A Mastra gerava proveniência SLSA nas publicações da CI, mas isso não era obrigatório. Assim, um token comum ainda podia publicar sem atestados. A mesma brecha permitiu o envio de versões maliciosas no comprometimento do pacote Nx; exigir proveniência no consumo eleva o nível de segurança.

  • Fique de olho em dependências fantasma. Um pacote maduro e amplamente utilizado que de repente ganha uma única dependência não utilizada é exatamente o sinal observado aqui. A priorização baseada em risco e a descoberta de ativos em todo o seu ambiente ajudam você a identificar onde um pacote afetado foi instalado e quais instâncias estão acessíveis e têm credenciais, para que você corrija primeiro os hosts expostos, em vez de rastrear todas as instalações do escopo de uma só vez.

Conteúdos relacionados da Snyk

Este é o caso mais recente de uma série de invasões de escopos npm e contas de mantenedores em 2026. O padrão — uma conta de mantenedor comprometida que dispara uma republicação automatizada e rápida — é o mesmo por trás das campanhas Mini Shai-Hulud: 

Mini Shai-Hulud: The Most Sophisticated NPM Supply Chain Attack of 2026

Mini Shai-Hulud: o ataque à cadeia de suprimentos do NPM mais sofisticado de 2026 (um passo a passo de como uma única conta de mantenedor comprometida é usada para inserir cavalos de Troia em centenas de pacotes npm de uma só vez, e como detectar e corrigir a exposição).

Para saber mais sobre essa mesma família de ataques e as estratégias de defesa, confira a cobertura da Snyk sobre o comprometimento do npm Axios, o ataque Mini Shai-Hulud ao AntV e ao TanStack, o worm auto propagável node-gyp e os comprometimentos do tinycolor e do ngx-bootstrap. Para aprender a proteger seu pipeline de instalação, consulte Segurança do NPM: como prevenir ataques à cadeia de suprimentos e a lição da Snyk Learn sobre o comprometimento de um pacote legítimo.

Linha do tempo

  • Do fim de 2024 ao início de 2025: a conta ehindero publica versões alfa legítimas de @mastra/core e, depois, fica inativa. O acesso ao escopo nunca é revogado.

  • 16 de junho de 2026: uma versão limpa de easy-day-js@1.11.21 é publicada como disfarce, imitando o dayjs.

  • 17 de junho de 2026, ~01:01 UTC: a versão maliciosa easy-day-js@1.11.22 é publicada e recebe a tag latest.

  • 17 de junho de 2026, ~01:12 a 02:36 UTC: a maior parte do escopo @mastra/* é republicada com a dependência easy-day-js injetada.

  • 17 de junho de 2026: várias empresas de segurança divulgam o incidente publicamente; easy-day-js é removido do npm e as versões maliciosas são sinalizadas (aviso da Snyk SNYK-JS-EASYDAYJS-17353313).

  • 17 de junho de 2026 (no mesmo dia): a Mastra responde removendo o proprietário não autorizado, abrindo alterações de emergência para publicações limpas (PR #18049), publicando versões atualizadas de todos os 142 pacotes publicáveis (PR #18056) e fixando versões superiores explícitas nos casos em que o invasor publicou acima da latest (PR #18060).

Proteja sua cadeia de suprimentos com a Snyk

87% dos entrevistados foram afetados por problemas de segurança na cadeia de suprimentos. Mantenha a sua protegida com a Snyk.

Leia mais

illustration hero ai
Blog

PHP corrige duas vulnerabilidades críticas de RCE sem autenticação (CVE-2026-109618, CVE-2026-109619): atualize agora

Duas falhas críticas no ciclo de requisições do PHP podem permitir execução remota de código sem autenticação. Atualize para uma versão corrigida ou instale um backport do fornecedor para versões mais antigas.

blog feature ai lilac
Blog

Transforme seu backlog de vulnerabilidades em pull requests com remediação agentiva

O Evo Remediation Agent está em Open Preview e traz a resolução automatizada de dependências para o Evo Agentic AppSec. Agora, as equipes de AppSec podem executar campanhas contínuas de remediação

blog feature ai pink
Blog

O risco de um modelo de IA depende do que ele pode acessar

A pontuação de risco de um modelo é apenas parte da história: seu impacto depende dos dados, das ferramentas e das ações que a aplicação pode acessar. Saiba como as equipes de segurança podem verificar esse alcance e escolher controles direcionados.