Em 14 de janeiro de 2026, reivindiquei um pacote no npm chamado react-codeshift.
Eu não era o autor. Nunca havia escrito uma linha de código para ele. O pacote nunca existiu. Ninguém jamais o havia publicado. E, no entanto, 237 repositórios do GitHub já o estavam referenciando, instruindo agentes de IA a instalá-lo. Alguns deles estavam realmente tentando. Eu estava recebendo downloads para um pacote que acabara de publicar, sem nada dentro.
De onde veio o nome? Um LLM o inventou. Como ele se espalhou para 237 repositórios? Arquivos de habilidades de agentes. Copiados e colados, bifurcados, traduzidos para o japonês, nunca verificados. Eu o encontrei e reivindiquei antes que qualquer outra pessoa pudesse.
A pesquisa
Em julho de 2025, comecei a investigar Problemas de confusão com o npx. Estes são nomes de pacotes npm que aparecem na documentação/código, mas que nunca foram realmente publicados. A ideia era simples: extrair package.json scripts e arquivos README em todo o npm para npx <package> padrões e verificar se esses pacotes realmente existem. Acontece que muitos deles não existem.
Então aconteceu todo o ataque S1ngularity, então eu arquivei a pesquisa. Chegou a época das festas de fim de ano e eu retomei o trabalho. Este post cobre apenas um ramo dessa pesquisa. Mais novidades em breve.
Entra react-codeshift
Retomei a pesquisa em dezembro e decidi estendê-la para também indexar o GitHub, fazendo um scrape de referências a npx comandos. react-codeshift apareceu muito. Mais de 200 repositórios. Quando o reivindiquei, esse número havia crescido para 237+.

A questão é que, react-codeshift não existia. Não até que eu o reivindicasse. Mas o nome soa legítimo. Dois pacotes reais existem:
Um LLM misturou tudo isso e criou o react-codeshift. Um nome plausível para uma ferramenta que não existe. Um clássico.
A história de origem
Eu rastreei até um único commit: 65e5cb0 no wshobson/agents repositório, datado de 17 de outubro de 2025.
Esse commit despejou 47 "Agent Skills" geradas por LLM em 14 plugins. Nenhuma revisão humana aparente. Pelo menos duas dessas skills (react-modernization e dependency-upgrade) continham isso:
npx react-codeshift --transform=react-codeshift/transforms/rename-unsafe-lifecycles.js ./src
npx react-codeshift --transform=react-codeshift/transforms/new-jsx-transform.js ./srcParece legítimo. Soa legítimo. Os caminhos de transformação espelham a estrutura de codemods reais.
Exceto que não existia.
Skills: A nova superfície de ataque
Já vimos typosquatting e pacotes de IA slop. Este é um caso real de slopsquatting na prática, não apenas especulação. E está a ser disseminado através do Skills.
Skills são um novo padrão: Anthropic's Agent Skills Specification, Claude Code plugins, MCP servers. Todos eles usam arquivos de skill para dizer aos agentes de IA o que fazer. Esses arquivos parecem documentação: Markdown, YAML, instruções em texto simples.
Mas são instruções executáveis. Quando um agente de IA carrega um arquivo de skill, ele segue os comandos. Não verifica se npx react-codeshift existe. Ele simplesmente o executa.
Quando o npx não consegue encontrar um pacote localmente, ele solicita:
É necessário instalar os seguintes pacotes:
react-codeshift
Ok para prosseguir? (y)O agente pressiona y. Assim como a maioria das pessoas. Agentes são como nós nesse aspecto. O cego guiando o cego, em escala.
Comprovação de tentativas de execução ativas
Após reivindicar o pacote, observei a telemetria de download:
Os pacotes normais têm entre 60 e 100 downloads no primeiro dia (espelhos de registo, scanners de segurança) e, depois disso, zero. Na verdade, ninguém está a tentar usá-los.
Mas react-codeshift? Aquele fluxo persistente de 1-4 downloads por dia? Esses são reais. São agentes de IA seguindo instruções de habilidades e acionando downloads npx.
As habilidades estão sendo usadas. O pacote alucinado está sendo executado. Se eu não o tivesse reivindicado primeiro, um atacante poderia ter feito isso.
O padrão de disseminação
Todos os 237 repositórios remontam à mesma origem. O padrão é quase inteiramente de forks diretos:
wshobson/agents(origem)- ~100 forks mantendo o caminho exato:
plugins/framework-migration/skills/react-modernization/SKILL.md - Um usuário o copiou para mais de 30 de seus próprios repositórios
- Algumas reorganizações em diferentes estruturas de diretórios
- Até uma tradução para o japonês!
- Um repositório foi alterado
npxparabunx. Mesmo pacote alucinado, runner diferente.
Não é apenas o npx
O mesmo padrão se aplica a todo runner de pacote:
npx react-codeshiftbunx react-codeshiftpnpm dlx react-codeshiftyarn dlx react-codeshift
Todos eles se resolvem para o mesmo registro npm. Todos eles solicitam confirmação antes de instalar. Todos são aprovados sem pensar duas vezes. Se um LLM alucina um nome de pacote em uma forma, ele o alucinará em outras também.
É viral, mas superficial. Sem grandes repositórios. Sem projetos com muitas estrelas. Apenas agentes ensinando agentes a usar um pacote que não existia. Agentes em todos os níveis. Um sistema de autoaperfeiçoamento, de certa forma.
Por que isso importa
Esta não foi uma violação massiva. Ninguém foi comprometido. O pacote agora é um placeholder seguro.
Mas é um estudo de caso útil sobre como essas coisas se espalham:
- LLMs alucinam nomes de pacotes plausíveis. Especialmente para ferramentas específicas de domínio onde as convenções de nomenclatura são previsíveis.
- Habilidades são copiadas e coladas sem revisão. Elas se parecem com documentação, então não recebem o mesmo escrutínio que o código.
- Agentes seguem instruções literalmente. Esse é o trabalho deles.
- npx solicita, humanos aprovam. O atrito é baixo o suficiente para que a maioria das pessoas apenas pressione 'y'.
- Nomes não reivindicados são por ordem de chegada. Qualquer um pode registrá-los.
Eu por acaso encontrei este e o reivindiquei. O padrão vale a pena ser compreendido.
O que você deve fazer?
Se você mantém habilidades de agente ou ferramentas de IA:
- Trate as habilidades como código, não como documentação. Revise-as. Audite-as. Controle a versão delas com o mesmo rigor do código-fonte.
- Verifique se os nomes dos pacotes existem. Antes de fazer commit de qualquer
npx <package>instrução, verifique se o pacote é real e foi publicado por quem você pensa que o publicou. - Pesquise sua base de código. Execute
grep -r "npx react-codeshift"e corrija quaisquer ocorrências. Substitua pelas ferramentas corretas:npx jscodeshiftpara codemods genéricosnpx react-codemodpara transformações específicas do React
Indicadores de Comprometimento
pacote npm: react-codeshift
O panorama geral
As habilidades são o novo código. Não parecem. São Markdown e YAML e instruções amigáveis. Mas são executáveis. Agentes de IA os seguem sem perguntar "does this package actually exist?"
Isso foi uma alucinação. Espalhou-se para 237 repositórios. Gerou tentativas reais de download. A única razão pela qual não se tornou um vetor de ataque é porque cheguei lá primeiro.
A cadeia de abastecimento acaba de ganhar um novo elo, feito dos sonhos da LLM. Esta é apenas uma das conclusões da pesquisa sobre a confusão da npx. Mais novidades em breve.
Proteja seu software agora



.avif)
