
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.
| Pacote | Ecossistema | Versões Comprometidas |
|---|---|---|
@tanstack/react-router | npm | 1.169.5, 1.169.8 |
@tanstack/vue-router | npm | 1.169.5, 1.169.8 |
@tanstack/solid-router | npm | 1.169.5, 1.169.8 |
@tanstack/router-core | npm | 1.169.5, 1.169.8 |
@tanstack/react-start | npm | 1.167.68, 1.167.71 |
@mistralai/mistralai | npm | 2.2.2, 2.2.3, 2.2.4 |
@mistralai/mistralai-azure | npm | 1.7.2, 1.7.3 |
mistralai | pypi | 2.4.6 |
@opensearch-project/opensearch | npm | 3.5.3, 3.6.2, 3.7.0, 3.8.0 |
@uipath/robot | npm | 1.3.4 |
@squawk/airways | npm | 0.4.2, 0.4.3, 0.4.5 |
@draftauth/core | npm | 0.13.1, 0.13.2 |
@tallyui/core | npm | 0.2.1, 0.2.2, 0.2.3 |
safe-action | npm | 0.8.3, 0.8.4 |
cmux-agent-mcp | npm | 0.1.3 - 0.1.8 |
nextmove-mcp | npm | 0.1.3, 0.1.4, 0.1.5, 0.1.7 |
ts-dna | npm | 3.0.1, 3.0.2, 3.0.4 |
cross-stitch | npm | 1.1.3, 1.1.4, 1.1.6 |
git-git-git | npm | 1.0.8 - 1.0.12 |
git-branch-selector | npm | 1.3.3 - 1.3.7 |
agentwork-cli | npm | 0.1.4, 0.1.5 |
wot-api | npm |
MIT. Consulte LICENSE para obter detalhes.
shai-scan é um auxílio de detecção, não um substituto para auditorias de segurança abrangentes, revisão de dependências ou plataformas de inteligência de ameaças. Ele identifica versões comprometidas conhecidas com base no banco de dados fornecido; ataques à cadeia de suprimentos novos ou zero-day podem não ser detectados até que uma campanha seja adicionada. Sempre pratique defesa em profundidade: audite dependências, fixe versões, verifique a proveniência e monitore pipelines de CI/CD.
| 0.8.1, 0.8.2, 0.8.4 |
ml-toolkit-ts | npm | 1.0.4, 1.0.5 |
@beproduct/nestjs-auth | npm | 0.1.2 - 0.1.19 |
@dirigible-ai/sdk | npm | 0.6.2, 0.6.3 |
@taskflow-corp/cli | npm | 0.1.24 - 0.1.29 |
@tolka/cli | npm | 1.0.2, 1.0.3, 1.0.4, 1.0.6 |
@supersurkhet/cli | npm | 0.0.2 - 0.0.7 |
guardrails-ai | pypi | 0.10.1 |