
Analyseur CLI sans dépendances pour les compromissions de chaîne d'approvisionnement npm/PyPI. Détecte les paquets compromis dans les lockfiles et les IOC au niveau système provenant d'attaques comme Mini Shai-Hulud (CVE-2026-45321).
Scanner CLI sans dépendances pour les compromissions de la chaîne d'approvisionnement npm et PyPI.
Le 11 mai 2026, un ver auto-propagateur de la chaîne d'approvisionnement surnommé Mini Shai-Hulud (CVE-2026-45321, GHSA-g7cv-rxg3-hmpx) a compromis l'écosystème npm. Attribué à TeamPCP (aka DeadCatx3, PCPcat, ShellForce, CipherForce), le malware a détourné les jetons OIDC de GitHub Actions pour publier des paquets malveillants avec une provenance SLSA Build Level 3 valide. Il a dérobé des identifiants depuis les pipelines CI/CD, les fournisseurs cloud et les portefeuilles de cryptomonnaies, et installé des crochets de persistance dans Claude Code et VS Code. Un interrupteur de sécurité intégré menaçait d'effacer le répertoire personnel de l'utilisateur si les jetons npm étaient révoqués.
Les paquets affectés comprenaient TanStack router et start packages, les SDK Mistral AI, le client OpenSearch, les outils UiPath et des dizaines d'autres. Les attaques de la chaîne d'approvisionnement évoluant rapidement, les organisations ont besoin d'un scanner léger et fiable qu'elles peuvent exécuter n'importe où sans ajouter de nouvelles dépendances à leur propre surface d'attaque.
package-lock.json, pnpm-lock.yaml, yarn.lock, bun.lock, bun.lockb, poetry.lock, Pipfile.lock et requirements.txtfs, path, child_process, os). Le scanner n'augmente pas votre risque de chaîne d'approvisionnement0 = propre, 1 = résultats trouvés, 2 = erreur)src/db.ts ; mettez à jour le fichier et relancezAucune installation requise. Exécutez directement avec votre gestionnaire de paquets de votre choix :
# npx
npx @digi4care/shai-scan
# bunx
bunx @digi4care/shai-scan
# pnpm dlx
pnpm dlx @digi4care/shai-scan
Installation globale (optionnelle) :
npm install -g @digi4care/shai-scan
# or
pnpm add -g @digi4care/shai-scan
Depuis les sources :
git clone https://github.com/digi4care/shai-scan.git
cd shai-scan
pnpm install
bun run src/cli.ts --help # Bun (recommandé pour le développement)
# 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
| Format | Flag | Description |
|---|---|---|
| Texte | (par défaut) | Tableau lisible des résultats avec sévérité, nom du paquet, version et détails de la campagne |
| JSON | --json | Tableau JSON structuré des résultats, adapté à l'ingestion dans des SIEM ou des tableaux de bord personnalisés |
| SARIF | --sarif | Format OASIS SARIF 2.1.0 pour téléchargement sur GitHub Code Scanning, GitLab Secure ou autres consommateurs SARIF |
Exemple d'extrait 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"
}
]
| Code | Signification |
|---|---|
| 0 | Aucun paquet compromis ou IOC détecté |
| 1 | Un ou plusieurs résultats détectés |
| 2 | Erreur d'exécution (chemin invalide, lockfile illisible, etc.) |
Lorsqu'une nouvelle attaque de la chaîne d'approvisionnement est découverte, mettez à jour src/db.ts :
CompromisedVersion[] avec les paquets et versions affectésCampaign au tableau CAMPAIGNS, incluant les identifiants CVE/GHSA, la sévérité, la description, les URL de référence et les indicateurs IOCbuildLookup() reconstruit automatiquement la table de correspondance lors de la prochaine exécutionAucune étape de reconstruction n'est nécessaire lors de l'utilisation de Bun. Les modifications apportées à src/db.ts prennent effet immédiatement avec bun run src/cli.ts. Pour le paquet npm, exécutez pnpm run build après l'édition.
Zéro dépendance d'exécution : Le scanner utilise uniquement les modules natifs de Node.js/Bun. Il ne télécharge ni n'exécute de code tiers au moment de l'exécution, éliminant ainsi le risque que le scanner lui-même devienne un vecteur de compromission.
pnpm comme gestionnaire de paquets : pnpm utilise des lockfiles stricts, n'exécute pas les scripts de cycle de vie par défaut et prend en charge le stockage à adressage de contenu. Ces propriétés réduisent la surface d'attaque par rapport à d'autres gestionnaires de paquets.
Paramètres recommandés pour .npmrc : Pour une protection maximale lors de l'installation des paquets, ajoutez ce qui suit à votre .npmrc de projet ou global :
ignore-scripts=true
engine-strict=true
Aucun appel réseau : shai-scan ne téléphone pas à la maison, ne télécharge pas de signatures et ne nécessite pas de clé API. Toutes les données de campagne sont fournies avec le paquet.
Les paquets et versions suivants sont connus pour être compromis dans CVE-2026-45321 (Mini Shai-Hulud Wave 4). Il s'agit d'un sous-ensemble représentatif ; la liste complète est maintenue dans src/db.ts.
| Paquet | Écosystème | Versions compromises |
|---|---|---|
@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. Voir LICENSE pour plus de détails.
shai-scan est un outil d'aide à la détection, et non un substitut à des audits de sécurité complets, à une revue des dépendances ou à des plateformes de renseignement sur les menaces. Il identifie les versions compromises connues sur la base de la base de données fournie ; les attaques nouvelles ou zero-day de la chaîne d'approvisionnement peuvent ne pas être détectées tant qu'une campagne n'a pas été ajoutée. Adoptez toujours une défense en profondeur : auditez les dépendances, figez les versions, vérifiez la provenance et surveillez les pipelines 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 |