Durante muito tempo, uma parte importante da confiança em open source foi construída com sinais históricos.
O pacote é popular. O projeto existe há anos. O mantenedor é conhecido. A versão anterior funcionou. O repositório é legítimo.
Esses sinais ainda ajudam. O problema é tratá-los como prova de segurança.
Ataques recentes à Software Supply Chain mostram um cenário mais difícil: o nome do pacote continua correto, o projeto continua legítimo e a conta de publicação pode até ser a mesma — mas uma nova versão contém código malicioso.
Nesse caso, a pergunta não é:
Esse pacote é conhecido?
É:
Essa versão específica, que está entrando agora no meu ambiente, merece confiança?
O caso Mini Shai-Hulud
Em 5 de agosto de 2026, a Sonatype publicou uma análise sobre uma nova onda da campanha Shai-Hulud no npm.
Na publicação, a Sonatype Research Labs rastreava 2.225 versões de componentes associadas ao incidente sonatype-2026-005579. A própria Sonatype ressalta que esse número representa um retrato naquele momento e pode aumentar à medida que novos componentes sejam identificados.
Segundo a análise, atacantes usaram contas de mantenedores e credenciais de publicação comprometidas para lançar versões maliciosas de pacotes legítimos. Algumas dessas versões continham um hook de preinstall que iniciava a cadeia de execução do malware.
O objetivo incluía procurar e roubar credenciais de npm, GitHub, cloud, Kubernetes, Vault, CI/CD, SSH e outros serviços. Quando encontrava acesso válido de publicação npm, o malware podia usar essa credencial para comprometer outros pacotes controlados pela vítima.
O resultado é um ciclo de propagação:
- 01Conta confiávelmantenedor ou token é comprometido
- 02Versão maliciosapacote legítimo recebe novo release hostil
- 03Instalaçãodesenvolvedor ou pipeline consome a versão
- 04Execuçãoscript ou outro mecanismo ativa o payload
- 05Credenciaisambiente de desenvolvimento é explorado
- 06Propagaçãoacessos roubados comprometem novos pacotes
O ponto mais importante não é decorar o nome da campanha. É entender que a confiança histórica do projeto não valida automaticamente uma nova versão.
Na prática, isso significa que um pipeline que permita a instalação automática de qualquer nova versão de uma dependência pode transformar uma publicação maliciosa em execução dentro do próprio ambiente de build.
Reputação reduz incerteza, mas não elimina comprometimento
Um pacote popular pode ter:
- conta de maintainer comprometida;
- token de publicação roubado;
- workflow de release alterado;
- dependência transitiva maliciosa;
- script de instalação adicionado;
- artefato divergente do código-fonte esperado.
Nenhum desses cenários exige criar um pacote novo com um nome obviamente suspeito.
Por isso, controles baseados somente em “lista de pacotes aprovados” precisam considerar a versão e os sinais do release.
A aprovação de um projeto não deveria significar confiança permanente em qualquer artefato futuro publicado sob o mesmo nome.
Lockfile ajuda — mas não prova segurança
Lockfiles são importantes porque ajudam a tornar a resolução de dependências previsível.
Se um projeto está corretamente fixado em uma versão conhecida e não atualiza automaticamente, isso pode reduzir a exposição imediata a um release malicioso recém-publicado.
Mas o lockfile responde principalmente:
Qual versão devo instalar?
Ele não responde:
Essa versão é segura?
Se a versão maliciosa já entrou no lockfile, o mecanismo fará exatamente o que foi projetado para fazer: reproduzir aquela instalação de maneira consistente.
Por isso, lockfile deve ser tratado como controle de reprodutibilidade e resolução, não como mecanismo isolado de detecção de malware.
CVE também não é o mesmo que malware
Uma vulnerabilidade conhecida e um pacote malicioso são problemas diferentes.
Uma CVE normalmente descreve uma fraqueza explorável em software que possui uma função legítima.
Em um pacote malicioso, o comportamento nocivo pode fazer parte intencionalmente do release.
Uma versão recém-publicada pode ainda não possuir CVE, advisory consolidado ou reputação histórica. Isso cria uma janela em que uma análise baseada somente em vulnerabilidades conhecidas pode não ser suficiente.
Esse ponto complementa o artigo já publicado pela Xmart:
SCA identifica vulnerabilidades. Mas e malware?
O momento de instalação é uma fronteira crítica
Uma dependência pode executar código durante a instalação.
No ecossistema npm, lifecycle scripts historicamente tornaram essa fronteira especialmente importante. O próprio npm mudou seus padrões em 2026: o npm v12 passou a deixar scripts de dependências como preinstall, install e postinstall desabilitados por padrão, salvo aprovação.
Essa mudança reduz exposição, mas não elimina o problema em versões anteriores, ambientes com scripts permitidos, outros mecanismos de execução, outros ecossistemas ou builds que contornam o padrão.
O princípio permanece:
O melhor momento para rejeitar um pacote malicioso é antes de permitir que ele execute no ambiente de desenvolvimento ou build.

O que um controle antes da instalação deveria considerar
Não existe um único sinal suficiente. Uma decisão pode combinar:
Malware conhecido
Comparar pacote e versão com intelligence atualizada.
Idade do release
Versões recém-publicadas possuem menos tempo de observação. Uma política de cooldown pode reduzir exposição a ataques descobertos logo após a publicação, mas não prova segurança e precisa de exceção para atualizações urgentes.
Alteração anômala
Exemplos:
- novo maintainer;
- script de instalação inesperado;
- aumento incomum de tamanho;
- nova dependência;
- artefato sem correspondência clara com o repositório;
- release após longo período de inatividade.
Origem
O pacote veio do registry esperado? A namespace é a correta? O pipeline consegue acessar a internet diretamente e contornar o repositório corporativo?
Integridade e proveniência
Checksums, assinaturas e proveniência ajudam a verificar origem e consistência, mas precisam ser interpretados corretamente.
Um release malicioso publicado pelo fluxo legítimo de uma conta comprometida pode possuir sinais de proveniência válidos para aquele processo comprometido. Proveniência melhora a rastreabilidade; não substitui análise de comportamento e confiança.
Dependency firewall é uma decisão antes do risco executar
Em julho de 2026, a OpenSSF publicou em seu blog um guest post sobre dependency firewalls.
O conceito é simples: colocar um ponto de decisão antes da instalação, avaliando pacotes e metadados para permitir, bloquear, quarentenar ou exigir revisão.
- 01Solicitaçãodependência direta ou transitiva
- 02Identidadenome, namespace, versão e origem
- 03Intelligencevulnerabilidade e malware conhecido
- 04Sinaisidade, comportamento, maintainer e anomalias
- 05Políticaregras corporativas e exceções
- 06Decisãopermitir, bloquear, quarentenar ou revisar
- 07Instalaçãosó ocorre depois da decisão
Esse controle não substitui SCA, SBOM, EDR, lockfiles ou secure build. Ele cobre uma janela específica: antes de uma dependência potencialmente hostil executar no ambiente.
CI/CD amplia o impacto de uma instalação maliciosa
O pipeline frequentemente possui mais privilégios do que uma estação de desenvolvimento.
Pode acessar repositórios privados, registries, cofres de secrets, cloud, chaves de assinatura, ambientes de deploy e tokens de automação.
Por isso, além de filtrar dependências, o ambiente de build deveria aplicar:
- menor privilégio;
- identidades específicas por workload;
- tokens de curta duração;
- limitação de rede;
- runners efêmeros quando aplicável;
- segregação de funções;
- logs;
- detecção de comportamento anômalo.
Se um pacote malicioso executar, o objetivo é reduzir o que ele consegue alcançar.
Um teste simples para o seu ambiente
Escolha uma dependência usada por dezenas de aplicações e faça um exercício:
- Quem pode atualizar a versão?
- O update pode ocorrer automaticamente?
- A nova versão passa por algum ponto de decisão antes da instalação?
- O ambiente consulta malware conhecido?
- Existe política para versões recém-publicadas?
- Scripts de instalação estão liberados?
- O build possui acesso direto à internet?
- Quais secrets existem no runner?
- Se uma versão for identificada como maliciosa amanhã, quais aplicações conseguem ser localizadas?
- É possível bloquear rapidamente a versão para todos os consumidores?
Se a resposta depende de cada equipe agir individualmente, existe uma lacuna de governança.
Confiança precisa ser renovada a cada release
O ponto não é desconfiar de todo open source.
É abandonar a ideia de que confiança é uma propriedade permanente do nome do pacote.
Na Software Supply Chain, uma decisão madura considera projeto, versão, origem, integridade, comportamento, contexto e política.
Um pacote pode ter sido legítimo ontem. O pipeline precisa decidir se a versão que chegou hoje continua merecendo confiança.
Fontes e referências
- Sonatype Research — Mini Shai-Hulud npm Attack: More Than 2,200 Components Impacted
- GitHub — Disrupting supply chain attacks on npm and GitHub Actions
- GitHub Changelog — npm install-time security defaults
- npm Docs — install / allowScripts
- OpenSSF — What Is a Dependency Firewall?
- Xmart — SCA identifica vulnerabilidades. Mas e malware?
- Xmart — Quando seu repositório de artefatos vira infraestrutura crítica
Seu pipeline decide se um pacote pode entrar antes de executá-lo?
A Xmart apoia arquitetura, governança de dependências, repositórios e controles de Software Supply Chain para reduzir exposição antes do build.