
Scanner CLI sem dependências para comprometimentos da cadeia de suprimentos npm/PyPI. Detecta pacotes comprometidos em lockfiles e IOCs de nível de sistema de ataques como Mini Shai-Hulud (CVE-2026-45321).
Scanner CLI sem dependências para comprometimentos na cadeia de suprimentos do npm e PyPI.
Em 11 de maio de 2026, um worm de cadeia de suprimentos autopropagante apelidado de Mini Shai-Hulud (CVE-2026-45321, GHSA-g7cv-rxg3-hmpx) comprometeu o ecossistema npm. Atribuído ao TeamPCP (também conhecido como DeadCatx3, PCPcat, ShellForce, CipherForce), o malware sequestrava tokens OIDC do GitHub Actions para publicar pacotes maliciosos com proveniência válida do SLSA Build Level 3. Ele roubava credenciais de pipelines de CI/CD, provedores de nuvem e carteiras de criptomoedas, e instalava hooks de persistência no Claude Code e no VS Code. Um dead-man switch embutido ameaçava apagar o diretório inicial do usuário se os tokens do npm fossem revogados.
Os pacotes afetados incluíram os pacotes router e start do TanStack, SDKs da Mistral AI, cliente OpenSearch, ferramentas da UiPath e dezenas de outros. Como os ataques à cadeia de suprimentos se espalham rápido, as organizações precisam de um scanner leve e confiável que possam executar em qualquer lugar sem adicionar novas dependências à sua própria superfície de ataque.
package-lock.json, pnpm-lock.yaml, yarn.lock, bun.lock, bun.lockb, poetry.lock, Pipfile.lock e requirements.txtfs, path, child_process, os). O scanner não aumenta o risco da sua cadeia de suprimentos0 = limpo, 1 = descobertas, 2 = erro)src/db.ts; atualize o arquivo e execute novamenteNenhuma instalação necessária. Execute diretamente com o executor de pacotes de sua preferência:
# npx
npx @digi4care/shai-scan
# bunx
bunx @digi4care/shai-scan
# pnpm dlx
pnpm dlx @digi4care/shai-scan
Instalação global (opcional):
npm install -g @digi4care/shai-scan
# or
pnpm add -g @digi4care/shai-scan
A partir do código-fonte:
git clone https://github.com/digi4care/shai-scan.git
cd shai-scan
pnpm install
bun run src/cli.ts --help # Bun (recommended for development)
# or build and run with Node.js:
pnpm run build && node dist/cli.js --help
npx @digi4care/shai-scan
npx @digi4care/shai-scan ~/projects/my-app
npx @digi4care/shai-scan --json .
npx @digi4care/shai-scan --sarif --sarif-file results.sarif .
#!/bin/bash
npx @digi4care/shai-scan --severity high . || {
code=$?
if [ "$code" -eq 1 ]; then
echo "Supply chain findings detected"
exit 1
elif [ "$code" -eq 2 ]; then
echo "Scanner error"
exit 2
fi
}
name: Supply Chain Scan
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- run: pnpm install --frozen-lockfile
- run: npx @digi4care/shai-scan --severity high .
name: Supply Chain Scan SARIF
on:
push:
branches: [main]
pull_request:
branches: [main]
schedule:
- cron: '0 6 * * 1'
jobs:
scan:
runs-on: ubuntu-latest
permissions:
security-events: write
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- run: pnpm install --frozen-lockfile
- run: npx @digi4care/shai-scan --sarif --sarif-file results.sarif .
- uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: results.sarif
| Formato | Opção | Descrição |
|---|---|---|
| Texto | (padrão) | Tabela legível por humanos com as descobertas, incluindo severidade, nome do pacote, versão e detalhes da campanha |
| JSON | --json | Array JSON estruturado de descobertas, adequado para ingestão em SIEMs ou painéis personalizados |
| SARIF | --sarif | Formato OASIS SARIF 2.1.0 para upload no GitHub Code Scanning, GitLab Secure ou outros consumidores de SARIF |
Exemplo de JSON:
[
{
"package": "@tanstack/react-router",
"version": "1.169.5",
"ecosystem": "npm",
"severity": "critical",
"campaign": "mini-shai-hulud-wave4",
"cve": "CVE-2026-45321",
"reference": "https://github.com/TanStack/router/security/advisories/GHSA-g7cv-rxg3-hmpx"
}
]
| Código | Significado |
|---|---|
| 0 | Nenhum pacote comprometido ou IOC detectado |
| 1 | Uma ou mais descobertas detectadas |
| 2 | Erro em tempo de execução (caminho inválido, lockfile ilegível, etc.) |
Quando um novo ataque à cadeia de suprimentos for descoberto, atualize src/db.ts:
CompromisedVersion[] com os pacotes e versões afetadosCampaign ao array CAMPAIGNS, incluindo identificadores CVE/GHSA, severidade, descrição, URLs de referência e indicadores IOCbuildLookup() reconstrói automaticamente o mapa de consulta na próxima execuçãoNenhuma etapa de rebuild é necessária ao usar Bun. Alterações em src/db.ts entram em vigor imediatamente com bun run src/cli.ts. Para o pacote npm, execute pnpm run build após editar.
Zero dependências em tempo de execução: O scanner usa apenas módulos nativos do Node.js/Bun. Ele não baixa nem executa código de terceiros em tempo de execução, eliminando o risco de o próprio scanner se tornar um vetor de comprometimento.
pnpm como gerenciador de pacotes: o pnpm usa lockfiles estritos, não executa scripts de ciclo de vida por padrão e suporta armazenamento endereçável por conteúdo. Essas propriedades reduzem a superfície de ataque em comparação com outros gerenciadores de pacotes.
Configurações recomendadas do .npmrc: Para proteção máxima ao instalar pacotes, adicione o seguinte ao seu projeto ou ao .npmrc global:
ignore-scripts=true
engine-strict=true
Sem chamadas de rede: shai-scan não faz "phone home", não baixa assinaturas nem exige chave de API. Todos os dados de campanha acompanham o pacote.
Os seguintes pacotes e versões são conhecidos por estar comprometidos na CVE-2026-45321 (Mini Shai-Hulud Wave 4). Esta é uma subamostra representativa; a lista completa é mantida em src/db.ts.