Automatizando Verificações de Segurança de Pacotes npm com npq
O npq audita um pacote npm antes de instalá-lo, enquanto o npm audit só reporta vulnerabilidades depois que o código já foi gravado em node_modules. Essa ordem é o ponto central: quando alguém audita a árvore de dependências, um script postinstall malicioso já pode ter sido executado na sua máquina. O npq move a verificação para antes da instalação — ele inspeciona metadados do pacote, idade, scripts e CVEs conhecidos no momento da solicitação de instalação, e então pergunta se você deseja continuar.
Este guia integra o npq ao seu terminal e a um hook de pré-commit, para que a auditoria ocorra no momento em que você busca dependências — não apenas quando você se lembra de executá-la.
npm install -g npq
Principais Conclusões
- O
npm audité executado contra pacotes já gravados emnode_modules; o npq intercepta a solicitação de instalação antes que qualquer código toque seu disco. - O
npq-heroé o wrapper npm substituto instalado junto com o npq; crie um alias denpmparanpq-hero(não paranpqdiretamente) para preservar o comportamento de repasse de todos os subcomandos do npm. - Por padrão, o npq aguarda 15 segundos e então continua automaticamente a instalação quando apenas avisos estão presentes — defina
NPQ_DISABLE_AUTO_CONTINUE=trueou passe--disable-auto-continuepara substituir a contagem regressiva por um prompt explícito(y/N). Isso é uma revisão interativa, não um controle automatizado de CI. - Executar o
npqpuro (sem o subcomandoinstall) no diretório de um projeto audita todas as dependências nopackage.json— útil antes de abrir um pull request que adiciona ou atualiza dependências. - Os marshalls do npq são sinais heurísticos, não prova de malícia — um pacote publicado ontem com zero downloads aciona as verificações de idade e popularidade do npq, mas todo pacote legítimo novo começa exatamente nessa situação.
A lacuna que o npq preenche
O npq é um auditor de segurança pré-instalação que executa um conjunto de verificações — chamadas de “marshalls” — contra os metadados de um pacote antes que o npm busque e execute qualquer código. Isso é o inverso do npm audit, que lê sua árvore de dependências instaladas e reporta CVEs após o fato. A campanha Shai-Hulud de 2025 explorou scripts de ciclo de vida que são executados durante a instalação, que é exatamente a janela que o npm audit não consegue cobrir e o npq consegue. A ferramenta é open source em lirantal/npq e foi criada por Liran Tal.
Instalar o npq e executar uma auditoria pontual
Discover how at OpenReplay.com.
Instale o npq globalmente, depois use npq install no lugar de npm install para qualquer pacote que você queira verificar primeiro.
npm install -g npq
npq install express
O pacote npq no npm instala dois binários: npq e npq-hero. O primeiro executa uma auditoria explícita; o segundo é um wrapper npm substituto abordado na próxima seção. Quando você executa npq install express, o npq busca os metadados, executa seus marshalls, exibe os resultados e — se algo for sinalizado — solicita sua confirmação antes de delegar ao npm.
Um pacote sinalizado produz uma saída semelhante a esta:
warning Package has install scripts (preinstall, postinstall)
warning Package is older than 22 days? no — published 1 day ago
? Would you like to continue installing package(s)? (Y/n)
O prompt é o ponto de controle. Nada é instalado até que você responda, ou até que o temporizador de 15 segundos de continuação automática para avisos expire.
Criar alias de npm para npq-hero e torná-lo persistente
Para auditar cada instalação automaticamente, crie um alias de npm para npq-hero e registre o alias na configuração do seu shell. O npq-hero é o wrapper projetado para isso — ele repassa todos os subcomandos do npm (run, ci, publish e os demais) sem alterações, interceptando apenas as instalações para executar a auditoria primeiro.
echo "alias npm='npq-hero'" >> ~/.zshrc # ou ~/.bashrc para bash
source ~/.zshrc
Com o alias configurado, npm install fastify passa pelos marshalls do npq antes que o npm busque o tarball. Crie o alias de npm para npq-hero em vez de para npq diretamente — npq é o binário de auditoria, enquanto npq-hero é o wrapper completo compatível com npm documentado no README do npq. Criar alias para o binário npq puro quebra subcomandos que o npq não implementa por conta própria.
O que o npq verifica de fato?
O npq executa um conjunto de verificações de segurança, chamadas de “marshalls”, que estão documentadas no README do npq. Elas se dividem em quatro categorias práticas:
| Categoria | O que é sinalizado |
|---|---|
| Sinais de cadeia de suprimentos | Vulnerabilidades conhecidas (via OSV, ou Snyk quando configurado), verificação de assinatura do registro, atestado de proveniência de build |
| Indicadores de malware | Presença de scripts preinstall/postinstall, pacotes similares a typosquats de pacotes populares, introdução de novos binários/CLI |
| Saúde do pacote | README, LICENSE ou URL do repositório ausentes; sinais de depreciação; contagem de downloads |
| Sinais do mantenedor | Quantidade e dados de contato dos mantenedores, domínios de mantenedores expirados ou inválidos, idade do pacote (detecção de pacote novo) e maturidade da versão |
Agrupá-los dessa forma mapeia como um ataque realmente se manifesta: um typosquat com um script postinstall e zero downloads aciona múltiplos marshalls ao mesmo tempo. Cada verificação é um sinal a ser avaliado, não um veredicto binário — o npq expõe os dados e deixa a decisão com você.
Desativar a continuação automática para revisão explícita
Por padrão, o prompt interativo do npq aguarda 15 segundos e então continua automaticamente a instalação quando apenas avisos estão presentes. Defina NPQ_DISABLE_AUTO_CONTINUE=true ou passe --disable-auto-continue para remover a contagem regressiva e forçar uma resposta explícita (y/N) antes que o npq delegue ao npm. Tanto a flag quanto a variável de ambiente estão documentadas no README do npq.
# Ambas as formas funcionam
NPQ_DISABLE_AUTO_CONTINUE=true npq install
npq install --disable-auto-continue
Isso transforma o npq em uma etapa de revisão deliberada — útil no seu terminal e dentro de um hook de commit do git, onde alguém está presente para responder ao prompt. Não se trata de um modo de falha não-interativo documentado: o prompt ainda espera uma resposta, e o npq não anuncia uma flag que converta cada pacote sinalizado em uma saída automática com código de erro.
Rotear o pnpm pelo npq
O npq delega ao gerenciador de pacotes especificado em NPQ_PKG_MGR, portanto a mesma camada de auditoria cobre o pnpm. Defina a variável por comando para usos pontuais, ou incorpore-a a um alias de shell para uso diário.
# Auditorias pontuais via pnpm
NPQ_PKG_MGR=pnpm npq install fastify
# Fazer o pnpm sempre passar pelo npq
alias pnpm="NPQ_PKG_MGR=pnpm npq-hero"
echo 'alias pnpm="NPQ_PKG_MGR=pnpm npq-hero"' >> ~/.zshrc
A variável NPQ_PKG_MGR, listada no README do npq, indica ao npq-hero qual gerenciador de pacotes invocar após a aprovação na auditoria. A forma com alias oferece a mesma garantia para o pnpm que o alias npm oferece para o npm: nenhuma instalação prossegue até que os marshalls sejam executados.
Adicionar um hook de pré-commit com husky
Capture dependências arriscadas antes que sejam commitadas executando o npq a partir de um hook de pré-commit do husky. Isso audita as dependências declaradas em package.json sempre que você faz um commit, sendo mais valioso em commits que alteram os manifestos de dependências.
Instale o husky e inicialize-o (sintaxe do husky v9):
npm install --save-dev husky
npx husky init
Em seguida, escreva o hook em .husky/pre-commit:
# .husky/pre-commit
if git diff --cached --name-only | grep -qE 'package(-lock)?\.json'; then
npx npq
fi
A verificação com git diff --cached restringe a auditoria aos commits que realmente alteram package.json ou package-lock.json, para que commits não relacionados não paguem o custo da auditoria. O npx npq puro (sem o subcomando install) audita as dependências declaradas em package.json e sai com código de erro quando problemas são encontrados. Como o Husky bloqueia commits quando um hook sai com código de erro, isso transforma o hook em um controle rígido de pré-commit. O comando npx husky init e o formato de script simples em .husky/pre-commit seguem a convenção do husky v9; a v8 usava uma sintaxe diferente com husky add, então confirme a versão instalada antes de copiar trechos mais antigos.
Limitações honestas: heurísticas, não provas
Os marshalls do npq são sinais heurísticos, não provas de malícia. Um pacote publicado ontem com zero downloads é suspeito pelas verificações de idade e popularidade do npq — mas todo pacote legítimo novo começa exatamente nessa situação. O npq reduz o ruído a um conjunto de sinais ponderados e deixa a decisão com você; ele não classifica, e não pode classificar, a intenção. Trate uma instalação sinalizada como um convite para ler o pacote, não como uma ameaça confirmada.
O npq também não substitui o npm audit ou o Socket — ele os complementa. As três ferramentas cobrem janelas diferentes:
| Ferramenta | Quando é executada | O que verifica | Nativa para CI |
|---|---|---|---|
| npq | Antes da instalação | Idade, scripts de instalação, typosquats, CVEs conhecidos via OSV (ou Snyk) | Não — solicita interativamente |
npm audit | Após a instalação | CVEs em pacotes já instalados | Sim (integrado) |
| Socket | Contínua | Análise comportamental do grafo de dependências, monitoramento pós-merge | Sim (app + CLI) |
O npq captura sinais pré-instalação; o npm audit captura CVEs em pacotes já presentes no disco; o Socket adiciona monitoramento comportamental contínuo do seu grafo de dependências após o merge. Combinar o controle de instalação do npq com --ignore-scripts como padrão (e ferramentas como LavaMoat allow-scripts para as dependências que genuinamente precisam de scripts de ciclo de vida) fecha a maior parte da superfície de ataque no momento da instalação.
Conclusão
Criar um alias de npm para npq-hero e controlar commits com um hook do husky coloca a mesma auditoria pré-instalação em todos os lugares onde você busca dependências — terminal local e commit. Comece com a instalação global e o alias de shell, depois configure o hook do husky na próxima vez que tocar nos manifestos de dependências. Os marshalls são heurísticas, então leia o que eles sinalizam — mas ler um aviso é sempre melhor do que descobrir um payload de postinstall depois que ele já foi executado.
Perguntas Frequentes
Não da forma que o projeto documenta. Definir NPQ_DISABLE_AUTO_CONTINUE=true ou passar --disable-auto-continue remove a continuação automática de 15 segundos e força um prompt explícito (y/N), mas o prompt ainda espera uma resposta. Não há uma flag documentada que converta cada pacote sinalizado em uma saída automática com código de erro. Os casos de uso confiáveis do npq são interativos: no seu terminal via alias npq-hero, e no momento do commit via hook do husky, onde você está presente para responder ao prompt.
npq e npq-hero são dois binários separados instalados juntos. npq é o comando de auditoria explícita que você executa no lugar de npm install. npq-hero é o wrapper completo compatível com npm: ele repassa todos os subcomandos do npm, como run, ci e publish, sem alterações, interceptando apenas as instalações para executar a auditoria primeiro. Criar alias de npm para o binário npq puro quebra subcomandos que o npq não implementa, por isso o README recomenda criar alias para npq-hero.
O npq funciona com pnpm através da variável de ambiente NPQ_PKG_MGR. Definir NPQ_PKG_MGR como pnpm indica ao npq-hero qual gerenciador de pacotes invocar após a aprovação na auditoria. Você pode defini-la por comando, como em NPQ_PKG_MGR=pnpm npq install fastify, ou incorporá-la a um alias de shell como alias pnpm='NPQ_PKG_MGR=pnpm npq-hero' para que toda instalação via pnpm passe pelos marshalls do npq primeiro.
Use ambos, pois eles cobrem janelas diferentes. O npq é executado antes da instalação e inspeciona a idade do pacote, scripts de ciclo de vida, typosquatting e dados de vulnerabilidades conhecidas via OSV (ou Snyk quando configurado), impedindo que código malicioso toque o disco. O npm audit é executado após a instalação e reporta CVEs em pacotes já gravados em node_modules. O npq captura a superfície de ataque no momento da instalação que o npm audit não consegue cobrir, enquanto o npm audit permanece útil para o reporte contínuo de CVEs em dependências instaladas.
Understand every bug
Uncover frustrations, understand bugs and fix slowdowns like never before with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.