Mudança quebra compatibilidade no npm
O GitHub anunciou mudanças que quebram a compatibilidade (breaking changes) no npm versão 12, previsto para julho de 2026, que desativam a execução automática de scripts de instalação por padrão. A medida visa conter ataques de cadeia de suprimentos de software que abusam do comando “npm install” para executar código malicioso via hooks do ciclo de vida dos pacotes. O npm é o gerenciador de pacotes do ecossistema Node.js, com milhões de desenvolvedores e projetos dependentes. A mudança exige aprovação explícita antes da execução de qualquer script durante a instalação.
Por que os scripts são perigosos
O comando “npm install” instala todas as dependências necessárias para um projeto Node.js e, historicamente, executa scripts de qualquer dependência transitiva na árvore de pacotes. O GitHub classificou esses scripts de tempo de instalação como “a maior superfície de execução de código no ecossistema npm”. Um único pacote comprometido em qualquer nível da árvore de dependências pode executar código arbitrário na máquina do desenvolvedor ou em pipelines de CI/CD.
Os scripts preinstall, install e postinstall são os principais vetores explorados em ataques reais. Adversários publicam pacotes maliciosos que executam cargas durante a instalação — desde roubo de credenciais até instalação de backdoors. Conforme documentado na análise sobre pacote npm que roubava tokens do OpenAI, o vetor é explorado com frequência crescente.
O que muda no npm 12
| Comportamento | Antes (npm 11) | Depois (npm 12) |
|---|---|---|
| Scripts preinstall/install/postinstall | Executam automaticamente | Bloqueados sem aprovação |
| Dependências Git | Resolvidas normalmente | Exigem flag –allow-git |
| Tarballs remotos (https) | Resolvidos normalmente | Exigem flag –allow-remote |
| Builds nativos (node-gyp) | Executam implicitamente | Bloqueados sem aprovação |
| Scripts prepare (git/file/link) | Executam normalmente | Bloqueados sem aprovação |
Como se preparar
O GitHub recomenda que desenvolvedores atualizem para npm 11.16.0 ou mais recente e executem o comando npm approve-scripts –allow-scripts-pending para revisar quais pacotes possuem scripts e aprovar apenas os confiáveis. Os scripts aprovados são registrados no package.json e continuam funcionando após a migração para npm 12 — os não aprovados param automaticamente.
A mudança –allow-git configurada como “none” por padrão fecha um vetor de execução onde a configuração .npmrc de uma dependência Git pode sobrescrever o executável Git, mesmo com a flag –ignore-scripts. A empresa também introduziu anteriormente em 2026 a configuração “min-release-age”, que rejeita pacotes publicados há menos de um número especificado de dias — proteção contra pacotes maliciosos recém-publicados. Como destacado na cobertura de ataques supply chain que infectaram npm, a proteção proativa é essencial diante da sofisticação dessas campanhas.