
Scanner CLI a zero dipendenze per compromissioni della supply chain npm/PyPI. Rileva pacchetti compromessi nei lockfile e IOC a livello di sistema da attacchi come Mini Shai-Hulud (CVE-2026-45321).
Scanner CLI senza dipendenze per compromissioni della supply chain npm e PyPI.
L'11 maggio 2026, un worm della supply chain auto-propagante soprannominato Mini Shai-Hulud (CVE-2026-45321, GHSA-g7cv-rxg3-hmpx) ha compromesso l'ecosistema npm. Attribuito a TeamPCP (alias DeadCatx3, PCPcat, ShellForce, CipherForce), il malware ha dirottato i token OIDC di GitHub Actions per pubblicare pacchetti dannosi con provenienza SLSA Build Level 3 valida. Ha rubato credenziali da pipeline CI/CD, provider cloud e portafogli di criptovalute e ha installato hook di persistenza in Claude Code e VS Code. Un dead-man switch integrato minacciava di cancellare la directory home dell'utente se i token npm venivano revocati.
I pacchetti colpiti includevano i pacchetti router e start di TanStack, gli SDK Mistral AI, il client OpenSearch, gli strumenti UiPath e decine di altri. Poiché gli attacchi alla supply chain si muovono velocemente, le organizzazioni hanno bisogno di uno scanner leggero e affidabile che possano eseguire ovunque senza aggiungere nuove dipendenze alla propria superficie d'attacco.
package-lock.json, pnpm-lock.yaml, yarn.lock, bun.lock, bun.lockb, poetry.lock, Pipfile.lock e requirements.txtfs, path, child_process, os). Lo scanner non aumenta il rischio della tua supply chain0 = pulito, 1 = rilevamenti, 2 = errore)src/db.ts; aggiorna il file ed esegui di nuovoNessuna installazione richiesta. Esegui direttamente con il tuo package runner preferito:
# npx
npx @digi4care/shai-scan
# bunx
bunx @digi4care/shai-scan
# pnpm dlx
pnpm dlx @digi4care/shai-scan
Installazione globale (opzionale):
npm install -g @digi4care/shai-scan
# or
pnpm add -g @digi4care/shai-scan
Dal sorgente:
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 | Flag | Descrizione |
|---|---|---|
| Testo | (predefinito) | Tabella leggibile dei rilevamenti con gravità, nome del pacchetto, versione e dettagli della campagna |
| JSON | --json | Array JSON strutturato dei rilevamenti, adatto all'ingestione in SIEM o dashboard personalizzate |
| SARIF | --sarif | Formato OASIS SARIF 2.1.0 per il caricamento su GitHub Code Scanning, GitLab Secure o altri consumatori SARIF |
Esempio di estratto 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"
}
]
| Codice | Significato |
|---|---|
| 0 | Nessun pacchetto compromesso o IOC rilevato |
| 1 | Uno o più rilevamenti trovati |
| 2 | Errore runtime (percorso non valido, lockfile illeggibile, ecc.) |
Quando viene scoperto un nuovo attacco alla supply chain, aggiorna src/db.ts:
CompromisedVersion[] con i pacchetti e le versioni colpitiCampaign all'array CAMPAIGNS, includendo identificativi CVE/GHSA, gravità, descrizione, URL di riferimento e indicatori IOCbuildLookup() ricostruisce automaticamente la mappa di ricerca alla successiva esecuzioneNon è richiesta alcuna fase di ricompilazione quando si usa Bun. Le modifiche a src/db.ts hanno effetto immediato con bun run src/cli.ts. Per il pacchetto npm, esegui pnpm run build dopo la modifica.
Zero dipendenze runtime: Lo scanner utilizza solo moduli integrati di Node.js/Bun. Non scarica né esegue codice di terze parti in fase di runtime, eliminando il rischio che lo scanner stesso diventi un vettore di compromissione.
pnpm come package manager: pnpm utilizza lockfile rigorosi, non esegue script di ciclo di vita per impostazione predefinita e supporta l'archiviazione content-addressable. Queste proprietà riducono la superficie d'attacco rispetto ad altri package manager.
Impostazioni .npmrc consigliate: Per la massima protezione durante l'installazione dei pacchetti, aggiungi quanto segue al tuo .npmrc di progetto o globale:
ignore-scripts=true
engine-strict=true
Nessuna chiamata di rete: shai-scan non contatta server esterni, non scarica firme e non richiede una chiave API. Tutti i dati delle campagne sono inclusi nel pacchetto.
I seguenti pacchetti e versioni sono noti per essere compromessi in CVE-2026-45321 (Mini Shai-Hulud Wave 4). Questo è un sottoinsieme rappresentativo; l'elenco completo è mantenuto in src/db.ts.
| Pacchetto | Ecosistema | Versioni compromesse |
|---|---|---|
@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. Vedi LICENSE per i dettagli.
shai-scan è uno strumento di rilevamento, non un sostituto di audit di sicurezza completi, revisione delle dipendenze o piattaforme di threat intelligence. Identifica le versioni compromesse note in base al database incluso; gli attacchi alla supply chain nuovi o zero-day potrebbero non essere rilevati finché non viene aggiunta una campagna. Pratica sempre la difesa in profondità: audita le dipendenze, blocca le versioni, verifica la provenienza e monitora le pipeline 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 |