
Befehlszeilen-Scanner ohne Abhängigkeiten für npm/PyPI-Lieferkettenkompromittierungen. Erkennt kompromittierte Pakete in Lockfiles und systemweite IOCs von Angriffen wie Mini Shai-Hulud (CVE-2026-45321).
# shai-scan
> Zero-Dependency-CLI-Scanner für npm- und PyPI-Lieferkettenkompromittierungen.
[](https://www.npmjs.com/package/@digi4care/shai-scan)
[](LICENSE)
[](https://nodejs.org/)
## Warum?
Am 11. Mai 2026 kompromittierte ein sich selbst verbreitender Lieferkettenwurm namens **Mini Shai-Hulud** (CVE-2026-45321, GHSA-g7cv-rxg3-hmpx) das npm-Ökosystem. Der Malware wurde **TeamPCP** (auch bekannt als DeadCatx3, PCPcat, ShellForce, CipherForce) zugeschrieben. Er kaperte GitHub Actions OIDC-Tokens, um bösartige Pakete mit gültiger SLSA Build Level 3-Provenienz zu veröffentlichen. Er stahl Anmeldeinformationen aus CI/CD-Pipelines, Cloud-Anbietern und Kryptowährungs-Wallets und installierte Persistenz-Hooks in Claude Code und VS Code. Ein eingebauter Dead-Man-Switch drohte, das Home-Verzeichnis des Benutzers zu löschen, wenn npm-Tokens widerrufen wurden.
Betroffene Pakete umfassten TanStack Router und Start-Pakete, Mistral AI SDKs, OpenSearch-Client, UiPath-Tooling und Dutzende andere. Da Lieferkettenangriffe schnell ablaufen, benötigen Organisationen einen leichten, vertrauenswürdigen Scanner, den sie überall ausführen können, ohne ihrer eigenen Angriffsfläche neue Abhängigkeiten hinzuzufügen.
## Funktionen
- **Lockfile-Scanning** — Erkennt kompromittierte npm- und PyPI-Pakete in `package-lock.json`, `pnpm-lock.yaml`, `yarn.lock`, `bun.lock`, `bun.lockb`, `poetry.lock`, `Pipfile.lock` und `requirements.txt`
- **System-IOC-Prüfungen** — Durchsucht laufende Prozesse, Dateisystem-Artefakte, Netzwerkverbindungen und bekannte Persistenzpfade auf Indikatoren einer Kompromittierung
- **Null Laufzeitabhängigkeiten** — Verwendet nur Node.js/Bun-Built-ins (`fs`, `path`, `child_process`, `os`). Der Scanner erhöht Ihr Lieferkettenrisiko nicht
- **Mehrere Ausgabeformate** — Menschenlesbarer Text, maschinenlesbares JSON und SARIF für GitHub Code Scanning
- **CI/CD-nativ** — Exit-Codes für die Automatisierung ausgelegt (`0` = sauber, `1` = Funde, `2` = Fehler)
- **Pfadagnostisch** — Akzeptiert jedes Verzeichnis; standardmäßig das aktuelle Arbeitsverzeichnis
- **Kampagnenbasierte Datenbank** — Neue Angriffswellen werden als einzelne Kampagnen in `src/db.ts` hinzugefügt; die Datei aktualisieren und erneut ausführen
## Installation
Keine Installation erforderlich. Direkt mit Ihrem bevorzugten Paket-Runner ausführen:
```bash
# npx
npx @digi4care/shai-scan
# bunx
bunx @digi4care/shai-scan
# pnpm dlx
pnpm dlx @digi4care/shai-scan
```
Globale Installation (optional):
```bash
npm install -g @digi4care/shai-scan
# oder
pnpm add -g @digi4care/shai-scan
```
Aus dem Quellcode:
```bash
git clone https://github.com/digi4care/shai-scan.git
cd shai-scan
pnpm install
bun run src/cli.ts --help # Bun (für die Entwicklung empfohlen)
# oder bauen und mit Node.js ausführen:
pnpm run build && node dist/cli.js --help
```
## Verwendung
### Aktuelles Projekt scannen
```bash
npx @digi4care/shai-scan
```
### Bestimmten Pfad scannen
```bash
npx @digi4care/shai-scan ~/projects/my-app
```
### JSON-Ausgabe für die Automatisierung
```bash
npx @digi4care/shai-scan --json .
```
### SARIF-Ausgabe für GitHub Code Scanning
```bash
npx @digi4care/shai-scan --sarif --sarif-file results.sarif .
```
### CI/CD-Exit-Codes
```bash
#!/bin/bash
npx @digi4care/shai-scan --severity high . || {
code=$?
if [ "$code" -eq 1 ]; then
echo "Lieferketten-Funde erkannt"
exit 1
elif [ "$code" -eq 2 ]; then
echo "Scanner-Fehler"
exit 2
fi
}
```
## CI/CD-Integration
### GitHub Actions (Textausgabe)
```yaml
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 .
```
### GitHub Actions (SARIF-Upload)
```yaml
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
```
## Ausgabeformate
| Format | Flag | Beschreibung |
|--------|------|-------------|
| Text | (Standard) | Menschenlesbare Tabelle der Funde mit Schweregrad, Paketname, Version und Kampagnendetails |
| JSON | `--json` | Strukturiertes JSON-Array der Funde, geeignet für die Aufnahme in SIEMs oder benutzerdefinierte Dashboards |
| SARIF | `--sarif` | OASIS SARIF 2.1.0-Format für den Upload zu GitHub Code Scanning, GitLab Secure oder anderen SARIF-Konsumenten |
Beispiel-JSON-Auszug:
```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"
}
]
```
## Exit-Codes
| Code | Bedeutung |
|------|---------|
| 0 | Keine kompromittierten Pakete oder IOCs erkannt |
| 1 | Ein oder mehrere Funde erkannt |
| 2 | Laufzeitfehler (ungültiger Pfad, nicht lesbare Lockfile usw.) |
## Hinzufügen neuer Kampagnen
Wenn ein neuer Lieferkettenangriff entdeckt wird, aktualisieren Sie `src/db.ts`:
1. Fügen Sie ein neues `CompromisedVersion[]`-Array mit den betroffenen Paketen und Versionen hinzu
2. Hängen Sie ein neues `Campaign`-Objekt an das `CAMPAIGNS`-Array an, einschließlich CVE/GHSA-Identifikatoren, Schweregrad, Beschreibung, Referenz-URLs und IOC-Indikatoren
3. Die Funktion `buildLookup()` erstellt die Nachschlagetabelle beim nächsten Lauf automatisch neu
Bei Verwendung von Bun ist kein Neubauschritt erforderlich. Änderungen an `src/db.ts` werden mit `bun run src/cli.ts` sofort wirksam. Für das npm-Paket führen Sie nach der Bearbeitung `pnpm run build` aus.
## Sicherheitshinweise
- **Null Laufzeitabhängigkeiten**: Der Scanner verwendet nur Node.js/Bun-Built-in-Module. Er lädt zur Laufzeit keinen Drittanbieter-Code herunter oder führt ihn aus, wodurch das Risiko eliminiert wird, dass der Scanner selbst zu einem Kompromittierungsvektor wird.
- **pnpm als Paketmanager**: pnpm verwendet strikte Lockfiles, führt standardmäßig keine Lebenszyklus-Skripte aus und unterstützt inhaltsadressierbaren Speicher. Diese Eigenschaften verringern die Angriffsfläche im Vergleich zu anderen Paketmanagern.
- **Empfohlene `.npmrc`-Einstellungen**: Für maximalen Schutz bei der Installation von Paketen fügen Sie Folgendes zu Ihrer Projekt- oder globalen `.npmrc` hinzu:
```ini
ignore-scripts=true
engine-strict=true
```
- **Keine Netzwerkaufrufe**: `shai-scan` telefoniert nicht nach Hause, lädt keine Signaturen herunter und benötigt keinen API-Schlüssel. Alle Kampagnendaten werden mit dem Paket ausgeliefert.
## Betroffene Pakete (Aktuelle Kampagne)
Die folgenden Pakete und Versionen sind bekanntermaßen in **CVE-2026-45321** (Mini Shai-Hulud Wave 4) kompromittiert. Dies ist eine repräsentative Teilmenge; die vollständige Liste wird in `src/db.ts` gepflegt.
| Paket | Ökosystem | Kompromittierte Versionen |
|---------|-----------|---------------------|
| `@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 | 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 |
## Lizenz
MIT. Siehe [LICENSE](https://github.com/digi4care/shai-scan/blob/main/LICENSE) für Details.
## Haftungsausschluss
`shai-scan` ist eine Erkennungshilfe, kein Ersatz für umfassende Sicherheitsaudits, Abhängigkeitsüberprüfungen oder Bedrohungsanalyseplattformen. Es identifiziert bekannte kompromittierte Versionen basierend auf der mitgelieferten Datenbank; neue oder Zero-Day-Lieferkettenangriffe werden möglicherweise erst erkannt, wenn eine Kampagne hinzugefügt wird. Praktizieren Sie stets verteidigungsorientierte Tiefe: Prüfen Sie Abhängigkeiten, fixieren Sie Versionen, verifizieren Sie die Provenienz und überwachen Sie CI/CD-Pipelines.