Em julho de 2025, eu estava prototipando um novo projeto e decidi experimentar o MikroORM. A documentação dizia para executar npx mikro-orm-esm para as migrações. Então eu fiz.
npm ERR! code E404
npm ERR! 404 Não Encontrado - GET https://registry.npmjs.org/mikro-orm-esmO pacote não existe, que estranho! Então me ocorreu: e se alguém tivesse registrado isso? Eu teria visto:
É necessário instalar os seguintes pacotes:
mikro-orm-esm@1.0.0
Continuar? (y)Eu teria simplesmente pressionado y. Todo mundo faz isso. E nada naquele prompt informa se você está prestes a instalar um malware ou uma ferramenta legítima.
A documentação apontava para um pacote inexistente. Quantas outras referências de pacotes Phantom estão circulando? Quantos já foram reivindicados por atacantes? Eu precisava saber.
Então comecei a investigar. Escrevi scripts para escanear o npm em busca de pacotes referenciados em READMEs e scripts, mas nunca realmente publicados. Fiz referências cruzadas de milhares de npx invocações. Encontrei dezenas. Reivindiquei 14 deles antes que qualquer outra pessoa pudesse. Então S1ngularity aconteceu, e a pesquisa foi arquivada.
Seis meses depois, fui lembrado da minha pesquisa graças à comunidade que pesquisava coisas semelhantes. Finalmente verifiquei as contagens de downloads: 121.539 downloads!
As pessoas estavam executando esses comandos inexistentes milhares de vezes por semana. Por meses. Enquanto os pacotes apenas ficavam lá, coletando dados.
Seis Meses de Dados
Os downloads não permaneceram estáveis. Eles cresceram. Começaram lentos no final de julho. O pico recente atingiu 4.236 downloads em um único dia (16 de janeiro de 2026).
- Total: 121.539 downloads em 128 pacotes
- Média semanal: 3.903
- Pico diário: 4.236 downloads (16 de jan de 2026)
Uma observação rápida sobre o ruído: toda vez que você publica uma nova versão de um pacote, ele automaticamente recebe de 60 a 100 downloads de scanners de segurança e mirrors. Esse é o ruído de base por lançamento. Pacotes com múltiplas versões acumulam ruído rapidamente. Qualquer coisa consistentemente acima desse limite é uso real.
Percebe a queda no final de dezembro? Feriados. Até os downloads de pacotes Phantom tiram folga no Natal.
Os Três Grandes
Três pacotes respondem por 79% de todos os downloads:
openapi-generator-cli: 48.356 downloads (pacote real: @openapitools/openapi-generator-cli)cucumber-js: 32.110 downloads (pacote real:@cucumber/cucumber)depcruise: 15.637 downloads (pacote real:dependency-cruiser)
openapi-generator-cli registrou 3.994 downloads apenas nos últimos 7 dias. Isso é quase 4.000 vezes que alguém tentou executar um comando que não existe. Em uma semana.
A Cauda Longa
Os pacotes restantes com downloads significativos:
jsdoc2md: 4.641 downloadsgrpc_tools_node_protoc: 4.518 downloadsvue-demi-switch: 1.166 downloadsstyleguidist: 805 downloadsmikro-orm-esm: 314 downloadspvbase64: 142 downloadscromwell: 106 downloads
Lembra da linha de base de 60-100 downloads por versão? Um pacote com 3 versões poderia ter 180-300 downloads de puro ruído. fathym com 83 downloads no total é provavelmente apenas ruído. Mas mikro-orm-esm com 314? Mesmo considerando múltiplas versões, isso são tentativas reais.
styleguidist com 805 downloads significa centenas de execuções reais. Pode ser o CI/CD acessando-o repetidamente. Pode ser dezenas de desenvolvedores diferentes. De qualquer forma, é o uso real de um pacote que não deveria existir.
Como os Encontramos
Mantemos um mirror completo do registro npm na Aikido. Analisamos cada package.json e README em todo o registro. Extraímos npx comandos. Cruzamos referências com o que está realmente registrado. Também pesquisamos no GitHub's code search para ver a abrangência desses comandos Phantom na prática, em documentações, configurações de CI, scripts, em qualquer lugar onde desenvolvedores possam referenciá-los.
Três pontos de dados para cada pacote:
- Referências no Registro: Quantos pacotes npm mencionam este comando em seus package.json ou README
- Resultados do GitHub: Quantos arquivos de código ou repositórios referenciam este comando no GitHub
- Downloads: Quantas vezes as pessoas realmente tentaram executá-lo
Identificamos 14 em julho de 2025. Quando retomei a pesquisa em janeiro, expandimos nossa análise e encontramos muitos mais. Neste ponto, identificamos 128 pacotes no total.
Alguns padrões dignos de nota:
Principais vetores de ataque (mais de 10 mil downloads): openapi-generator-cli, cucumber-js, e depcruise todos mostram forte correlação entre referências npm, menções no GitHub e downloads reais. Estes seriam devastadores nas mãos de um atacante.
Alta exposição, baixa conversão: styleguidist tem 246 referências npm e 286 resultados no GitHub, mas apenas 805 downloads. git-scripts-pre-push tem 126 referências, mas apenas 93 downloads. Visibilidade nem sempre equivale a execução.
Vetores apenas de documentação: mikro-orm-esm tem zero referências de pacotes npm, mas 80 resultados no GitHub e 314 downloads. Prova de que a documentação por si só pode gerar centenas de instalações, mesmo sem quaisquer referências do ecossistema npm.
Por que isso é perigoso
O ataque é simples.
Um atacante registra o pacote. Adiciona um postinstall script que exfiltra variáveis de ambiente: tokens npm, credenciais de Cloud, chaves de API, o que estiver por perto. Então espera.
No pico, isso representa potencialmente ~4.000 máquinas comprometidas por semana. Estações de trabalho de desenvolvedores. Servidores CI. Ambientes de build. Muitos estão possivelmente rodando com credenciais em variáveis de ambiente. Não é necessário phishing. Nenhuma comprometimento da cadeia de suprimentos de pacotes existentes. Basta reivindicar o nome e esperar que o npx traga as vítimas até você.
Quando alguém executa o comando, vê:
É necessário instalar os seguintes pacotes:
openapi-generator-cli@1.0.0
Prosseguir? (y)O prompt não mostra quem o publicou. Não mostra quando. Não mostra se é o que você está procurando. Você pode ver este prompt regularmente para ferramentas legítimas. A memória muscular assume o controle, porque somos humanos. Você digita y, como todo mundo faz. É isso. Esse é o ataque completo.
Fechamos 128 lacunas em várias rodadas. Pegamos os piores casos. Mas há uma longa cauda de milhares.
Uma Nota sobre as Proteções do npm
O npm possui proteção contra typosquatting. Quando tentamos reivindicar certos nomes, o npm os rejeitou com erros de similaridade. Nomes como rsbuild, vuedoc, napi, t-ci eram todos muito próximos de pacotes existentes. Isso é bom. Significa que o npm está bloqueando ativamente tentativas óbvias de squatting.
Mas esses comandos Phantom não são erros de digitação. São nomes que nunca foram registrados em primeiro lugar. A verificação de similaridade do npm não os detecta porque não há nada para ser "similar a".
O Que Você Deve Fazer
Use npx --no-install
npx --no-install seu-comandoIsso força o npx a usar apenas binários locais. Sem fallback de registro. Se não estiver instalado, falha. É isso que você quer.
Instale ferramentas CLI explicitamente. Não dependa de npx para buscá-los:
{
"devDependencies": {
"@openapitools/openapi-generator-cli": "^2.7.0"
}
}
Verifique antes de executar. A documentação diz para executar npx algo? Verifique se o pacote realmente existe primeiro. Verifique se é o correto. Especialmente em CI/CD.
Reivindique seu namespace. Se você mantém uma ferramenta CLI, registre os aliases óbvios e erros de digitação. É um seguro barato contra alguém fazendo isso maliciosamente.
Como Saber Se Você Foi Afetado
Se você é um usuário Aikido, verifique seu feed central e filtre por problemas de malware. Quaisquer vulnerabilidades de pacotes Phantom aparecerão como um problema crítico 100/100 no feed. O Aikido verifica seus repositórios novamente todas as noites, embora recomendemos também acionar uma nova verificação completa.
Se você ainda não é um usuário Aikido, configure uma conta gratuita e conecte seus repositórios. Nossa cobertura proprietária de malware está incluída no plano gratuito (não é necessário cartão de crédito).
Para proteção futura, considere usar Aikido SafeChain (código aberto), um wrapper seguro para npm, npx, yarn e pnpm. O SafeChain se integra aos seus fluxos de trabalho atuais, interceptando comandos de instalação de pacotes e verificando-os contra o Aikido Intel (nossa Threat Intelligence de código aberto) antes que cheguem à sua máquina. Pare as ameaças na entrada.
Os Números
121.539 downloads em sete meses. 3.903 por semana em média. Pico de 4.236 em um único dia. 128 pacotes reivindicados no total (14 em julho, o restante em janeiro).
O ecossistema npm possui milhões de pacotes. Desenvolvedores executam comandos npx milhares de vezes diariamente. A lacuna entre um "padrão conveniente" e a "execução arbitrária de código" é um nome de pacote não reivindicado.

