Aikido

Confusão com npx: Pacotes que Esqueceram de Reivindicar Seus Próprios Nomes

Escrito por
Charlie Eriksen

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

O 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).

121.539 Downloads em 7 Meses
128 pacotes npx Phantom, Julho de 2025 a Janeiro de 2026
121,539
Total de Downloads
3,903
Média Semanal
4,236
Dia de Pico (16 de Jan)
4K 3K 2K 1K 🎄 Queda no feriado Pico: 4.236 Jul Ago Set Out Nov Dez Jan
O volume de downloads semanais cresceu constantemente de julho de 2025 a 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)
Os Três Grandes: 79% de Todo o Tráfego
Três pacotes Phantom respondem por 96.103 dos 121.539 downloads totais
openapi-generator-cli → real: @openapitools/openapi-generator-cli
48,356
23 referências npm650 resultados GitHub3.994 nos últimos 7 dias
cucumber-js → real: @cucumber/cucumber
32,110
28 referências npm856 resultados GitHub
depcruise → atual: dependency-cruiser
15,637
27 refs npm836 resultados do GitHub

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 downloads
  • grpc_tools_node_protoc: 4.518 downloads
  • vue-demi-switch: 1.166 downloads
  • styleguidist: 805 downloads
  • mikro-orm-esm: 314 downloads
  • pvbase64: 142 downloads
  • cromwell: 106 downloads
A Cauda Longa
Pacotes restantes com contagens de downloads notáveis (excluindo os Três Grandes)
jsdoc2md
4,641
grpc_tools_node_protoc
4,518
vue-demi-switch
1,166
styleguidist
805
mikro-orm-esm
314
pvbase64
142
cromwell
106
📊 Limite de ruído: Cada lançamento de versão gera 60-100 downloads de scanner. Pacotes com menos de ~100 no total (mostrados em cinza) são provavelmente todo ruído. Tudo acima disso representa máquinas reais, ambientes reais, credenciais reais.
1K+ downloads100-1K downloadsNo limite de ruído

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.

Detalhamento Completo dos Pacotes
Referências npm, resultados da pesquisa de código do GitHub e downloads para todos os pacotes identificados
Referências npmResultados do GitHubDownloads
🔴 Vetores de Ataque Principais (mais de 10 mil downloads)
Pacote Referências GitHub Downloads
openapi-generator-cli 23 650 48,356
cucumber-js 28 856 32,110
depcruise 27 836 15,637
🟡 Vetores de Ataque Significativos (1 mil a 10 mil downloads)
Pacote Referências GitHub Downloads
jsdoc2md 92 155 4,641
grpc_tools_node_protoc 83 226 4,518
vue-demi-switch 70 80 1,166
Risco Moderado + Limite de Ruído
Pacote Referências GitHub Downloads
styleguidist ALTA EXPOSIÇÃO 246 286 805
mikro-orm-esm SOMENTE DOCUMENTAÇÃO 0 80 314
pvbase64 18 70 142
cromwell 31 23 106
git-scripts-pre-push BAIXA CONVERSÃO 126 133 93
fathym BAIXA CONVERSÃO 119 9 83
aofl, flatjs-forge 42, 30 30, 2 99, 91
Principal insight: Altas referências npm nem sempre equivalem a muitos downloads. styleguidist tem 246 referências, mas 805 downloads, enquanto mikro-orm-esm tem 0 referências, mas 314 downloads apenas da documentação.

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

Isso 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.

Compartilhar:

https://www.aikido.dev/blog/npx-confusion-unclaimed-package-names

Assine para receber notícias sobre ameaças.

Comece hoje, gratuitamente.

Comece Gratuitamente
Não é necessário cc
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.