TL;DR
NPM-Supply-Chain-Angriffe stiegen allein im Jahr 2024 auf über 3.000 bösartige Pakete an, und die Axios-Kompromittierung im März 2026 bewies, dass selbst Top-10-Pakete nicht sicher sind. Dieser Leitfaden behandelt jede Verteidigungsschicht, die API-Entwickler benötigen: Lockfile-Durchsetzung, Blockierung von Postinstall-Skripten, Provenienzverifizierung, Tools zur Verhaltensanalyse und architektonische Entscheidungen, die Ihre Angriffsfläche verkleinern.
Einleitung
Der Axios-Supply-Chain-Angriff vom 31. März 2026 war nicht die erste npm-Kompromittierung. Und es wird nicht die letzte sein. Aber mit 83 Millionen wöchentlichen Downloads und einem plattformübergreifenden RAT, das über ein einziges gekapertes Maintainer-Konto bereitgestellt wurde, war es der lauteste Weckruf, den das JavaScript-Ökosystem erhalten hat.
Was diesen Fall vom üblichen Ratschlag „Aktualisieren Sie Ihre Abhängigkeiten“ unterscheidet: Der Axios-Angriff umging jede traditionelle Verteidigung. Der bösartige Code befand sich nicht in Axios selbst. Er wurde über eine Phantom-Abhängigkeit eingeschleust, die einen Postinstall-Hook auslöste. Lockfiles halfen nicht, wenn Sie npm install während des Angriffsfensters ausführten. Versions-Pinning half nicht, wenn Sie noch nicht gepinnt hatten.
API-Entwickler sind besonders gefährdet. Ihre Testskripte, CI/CD-Pipelines, Mock-Server und HTTP-Clients beziehen alle Pakete von npm. Ein einziges kompromittiertes Paket in Ihrer Toolchain kann API-Schlüssel, Datenbank-Anmeldeinformationen und Cloud-Token von Ihrem Entwicklungsrechner preisgeben.
💡 Tipp:
Apidog eliminiert einen wichtigen Angriffsvektor, indem es einen integrierten HTTP-Client für API-Tests bereitstellt, sodass Sie Axios, node-fetch oder got nicht in Ihrem Test-Stack benötigen. Laden Sie Apidog kostenlos herunter, um Ihre npm-Abhängigkeitsoberfläche zu reduzieren und gleichzeitig die unten stehenden Verteidigungsstrategien zu befolgen.
Dieser Leitfaden behandelt sieben Schutzschichten, von der grundlegenden Lockfile-Hygiene bis zur fortgeschrittenen Verhaltensanalyse.
Schicht 1: Lockfile-Durchsetzung
Warum Lockfiles wichtig sind
Eine Lockfile zeichnet die exakte Version jedes Pakets und jeder transitiven Abhängigkeit zum Installationszeitpunkt auf. Ohne Lockfile löst npm install die jeweils neueste Version im Semver-Bereich auf. Beispiel: Ihre package.json enthält "axios": "^1.14.0" und eine bösartige Version 1.14.1 existiert – Sie erhalten die bösartige Version.
Die Regeln
1. Committen Sie Ihre Lockfile immer.
Egal ob package-lock.json (npm), yarn.lock (Yarn), pnpm-lock.yaml (pnpm) oder bun.lock (Bun): Gehört in die Versionskontrolle.
2. Verwenden Sie eingefrorene Installationen in CI/CD.
Führen Sie niemals npm install in automatisierten Umgebungen aus. Nutzen Sie:
# npm
npm ci
# yarn
yarn install --frozen-lockfile
# pnpm
pnpm install --frozen-lockfile
# bun
bun install --frozen-lockfile
npm ci löscht node_modules und installiert exakt nach Lockfile. Ein Mismatch mit package.json bricht den Build ab.
3. Überprüfen Sie Lockfile-Diffs in Pull Requests.
Jede Änderung an der Lockfile im PR muss geprüft werden: Neue Abhängigkeiten, Versionssprünge, Registry-URL-Änderungen. Tools wie Socket.dev markieren verdächtige Lockfile-Änderungen automatisch.
Die Lockfile-Lücke
Lockfiles schützen vor unerwarteter Versionsauflösung, aber nicht vor der Erstinstallation. Initialisieren Sie ein neues Projekt oder fügen Sie während eines Angriffsfensters eine Abhängigkeit hinzu, wird die bösartige Version festgeschrieben. Lockfiles sind Schicht 1, nicht die einzige Schicht.
Schicht 2: Postinstall-Skripte deaktivieren
Der primäre Angriffsvektor
Der Axios-Angriff, ua-parser-js, event-stream und viele andere nutzten denselben Mechanismus: Ein postinstall-Skript, das während npm install beliebigen Code ausführt – noch bevor Ihr Anwendungscode läuft.
Skripte global blockieren
Fügen Sie Ihrer .npmrc hinzu:
ignore-scripts=true
Oder per CLI:
npm config set ignore-scripts true
Das blockiert alle Lebenszyklus-Skripte (preinstall, install, postinstall, prepare) während der Installation.
Pakete handhaben, die Skripte benötigen
Einige Pakete (z.B. bcrypt, sharp, sqlite3) benötigen Postinstall-Skripte. Sie haben drei Optionen:
Option 1: Skripte selektiv nach der Installation ausführen
npm ci --ignore-scripts
npm rebuild bcrypt sharp
Option 2: Allowlist mit npm 10+
Legen Sie .scriptsrc.json an:
{
"allowScripts": {
"bcrypt": true,
"sharp": true
}
}
Option 3: Vorkompilierte Binärdateien nutzen
Viele Pakete (z.B. sharp) liefern vorkompilierte Binärdateien, wodurch Postinstall überflüssig wird.
Der PackageGate-Vorbehalt
Im Januar 2026 wurden sechs Zero-Day-Schwachstellen ("PackageGate") aufgedeckt: Git-basierte Abhängigkeiten können trotz deaktivierter Lebenszyklus-Skripte Code ausführen. Pinnen Sie Git-Abhängigkeiten auf feste Commit-Hashes und prüfen Sie den Repository-Inhalt.
Schicht 3: Exakte Versionen pinnen
Verwenden Sie keine Semver-Bereiche mehr
Standardmäßig wird ein Paket mit Caret-Präfix gespeichert:
{
"axios": "^1.14.0"
}
Das ^ löst auf die jeweils neueste 1.x.x auf. Während eines Angriffs riskant!
Besser: Exakte Versionen pinnen:
{
"axios": "1.14.0"
}
Konfigurieren Sie npm:
# .npmrc
save-exact=true
save-prefix=''
Overrides für transitive Abhängigkeiten verwenden
Steuern Sie auch die Auflösung transitiver Abhängigkeiten:
npm:
{
"overrides": {
"axios": "1.14.0",
"plain-crypto-js": "npm:empty-npm-package@1.0.0"
}
}
Yarn:
{
"resolutions": {
"axios": "1.14.0"
}
}
pnpm:
{
"pnpm": {
"overrides": {
"axios": "1.14.0"
}
}
}
Der Kompromiss
Exaktes Pinnen bedeutet: Keine automatischen Patch-Updates. Sie müssen manuell aktualisieren – aber behalten so die Kontrolle. Für sicherheitskritische Projekte ist das sinnvoll.
Schicht 4: Paketprovenienz überprüfen
Was Provenienz bedeutet
Die npm-Provenienzattestierung verknüpft ein veröffentlichtes Paket mit Quellcode & Build-Umgebung über Sigstore-Signaturen im öffentlichen Transparenz-Ledger:
- Welches Quell-Repository?
- Welches CI/CD-System?
- Welcher Commit?
Provenienz prüfen
npm audit signatures
Damit sehen Sie, ob installierte Pakete gültige Provenienzattestierungen enthalten. Fehlt die OIDC-Provenienzbindung (wie bei den bösartigen Axios-Versionen): Warnsignal!
Provenienz für eigene Pakete aktivieren
Für eigene npm-Pakete in CI/CD:
# GitHub Actions Beispiel
- uses: actions/setup-node@v4
with:
node-version: 20
registry-url: https://registry.npmjs.org
- run: npm publish --provenance
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
In .npmrc:
provenance=true
Einschränkungen
Provenienz ist Opt-in. Die meisten Pakete haben sie noch nicht. Provenienz beweist nur, wo ein Paket gebaut wurde – nicht, dass der Quellcode sicher ist!
Schicht 5: Tools zur Verhaltensanalyse verwenden
Jenseits des Schwachstellen-Scannings
Tools wie npm audit und Snyk prüfen gegen bekannte CVEs, aber nicht gegen Zero-Day-Angriffe. Tools zur Verhaltensanalyse schauen, was Pakete tatsächlich tun.
Socket.dev
Socket analysiert Paketverhalten bei Installation/Laufzeit:
- Netzwerkanfragen während Installation
- Dateisystemzugriffe außerhalb des Paketverzeichnisses
- Ausführen von Shell-Befehlen
- Erfassen von Umgebungsvariablen
- Verschleierter Code
Integration: Socket kommentiert PRs bei verdächtigen neuen Abhängigkeiten.
Nutzung:
# Socket CLI installieren
npm install -g @socketsecurity/cli
# Projekt scannen
socket scan
Snyk
Snyk liefert Schwachstellenmanagement, Exploit-Reifegrad-Daten und Fix-Anleitungen. Gut bei bekannten Schwachstellen, weniger bei unbekannten.
# Snyk CLI installieren
npm install -g snyk
# Projekt testen
snyk test
Geschichteter Ansatz
Beides nutzen!
Socket für Verhaltensanomalien, Snyk für bekannte Schwachstellen, npm audit als Basis:
# Basislinie
npm audit
# Verhaltensanalyse
socket scan
# Schwachstellenmanagement
snyk test
Alle drei Checks in CI/CD als Gates einbauen. Kritische Funde blockieren den Build.
Schicht 6: Minimieren Sie Ihre Abhängigkeitsoberfläche
Die tiefere Frage
Jede Abhängigkeit in node_modules ist eine Vertrauensentscheidung. Der Axios-Angriff zeigte: Selbst Top-Pakete sind nicht immun. Reduzieren Sie die Gesamtzahl Ihrer Pakete – jede Reduktion verringert die Angriffsfläche.
Abhängigkeitsbaum prüfen
# Abhängigkeiten zählen
npm ls --all | wc -l
# Doppelte Pakete ermitteln
npm ls --all | sort | uniq -c | sort -rn | head -20
Checkliste für jede Abhängigkeit:
- Gibt es eine native Alternative in Node.js?
- Zieht das Paket viele (transitive) Abhängigkeiten nach sich?
- Kann ich den Code stattdessen direkt ins Projekt kopieren (vendoring)?
Native Alternativen für gängige Pakete
| Paket | Native Alternative | Verfügbar seit |
|---|---|---|
| axios, node-fetch, got |
fetch (global) |
Node.js 18 |
| uuid | crypto.randomUUID() |
Node.js 19 |
| dotenv |
--env-file Flag |
Node.js 20.6 |
| chalk | util.styleText() |
Node.js 21.7 |
| glob | fs.glob() |
Node.js 22 |
| path-to-regexp | Native URL-Pattern API | Node.js 23 |
Speziell für API-Tests
API-Test-Workflows nutzen oft HTTP-Clients, Assertions-Bibliotheken, Test-Runner und Mock-Server – jede Abhängigkeit ein Angriffsvektor.
Apidog ersetzt diesen Stack durch eine einzige Plattform:
- HTTP-Client: Integriert, keine npm-Abhängigkeit
- Assertions: Visueller Test-Builder
- Test-Runner: Automatisierte Szenarien mit CI/CD-Integration via Apidog CLI
- Mock-Server: Smarte Mocks, keine Express- oder Drittanbieter-Bibliotheken
- Dokumentation: Automatisch generiert
Verschieben Sie Ihren API-Test-Workflow in Apidog und eliminieren Sie Dutzende npm-Abhängigkeiten.
Testen Sie Apidog kostenlos, um Ihren API-Test-Stack zu konsolidieren.
Schicht 7: Netzwerk- und Laufzeitüberwachung
Bekannte schädliche Domains blockieren
Blockieren Sie nach Supply-Chain-Vorfällen die C2-Infrastruktur auf Netzwerkebene:
# In /etc/hosts eintragen
echo "0.0.0.0 sfrclak.com" | sudo tee -a /etc/hosts
Beschränken Sie in CI/CD den ausgehenden Netzwerkzugriff auf notwendige Domains (npm-Registry, Git, Deploy-Ziele). Alles andere blockieren.
StepSecurity Harden-Runner für CI/CD nutzen
StepSecuritys Harden-Runner überwacht GitHub Actions-Workflows in Echtzeit und erkennt z.B. C2-Verbindungen direkt nach npm install:
- Überwachung ausgehender Netzwerke
- Prozessverfolgung
- Dateintegrität
- Automatische Warnungen
# GitHub Actions
- uses: step-security/harden-runner@v2
with:
egress-policy: audit # oder 'block' für strikten Modus
Laufzeit-Prozessüberwachung
Für Dev-Rechner empfiehlt sich EDR (Endpoint Detection & Response), das Node.js-Kindprozesse überwacht. Der Axios-RAT startete Prozesse wie osascript, cscript, python3 – diese Muster sind erkennbar.
Empfohlene .npmrc-Konfiguration
Eine sicherheitsgehärtete .npmrc-Datei:
# Exakte Versionen pinnen
save-exact=true
save-prefix=
# Lebenszyklus-Skripte deaktivieren
ignore-scripts=true
# Provenienz für Veröffentlichungen aktivieren
provenance=true
# Offizielle Registry erzwingen
registry=https://registry.npmjs.org/
# 2FA für Veröffentlichungen verlangen
auth-type=web
# Audit-Level-Schwelle
audit-level=moderate
Committen Sie diese Datei ins Repository.
Beispiel für eine CI/CD-Sicherheitspipeline
GitHub Actions-Workflow, der alle sieben Schichten abdeckt:
name: Secure Build
on: [push, pull_request]
jobs:
security-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: step-security/harden-runner@v2
with:
egress-policy: audit # oder 'block' für strikten Modus
- uses: actions/setup-node@v4
with:
node-version: 22
# Schicht 1+2: Eingefrorene Lockfile, keine Skripte
- run: npm ci --ignore-scripts
# Schicht 3: Überprüfen Sie auf unerwartete Versionen
- run: npm ls --all > deps.txt
# Schicht 4: Provenienz prüfen
- run: npm audit signatures
# Schicht 5: Verhaltensanalyse
- run: npx socket scan
# Schicht 5: Schwachstellenscan
- run: npx snyk test
# Schicht 1: Basislinienprüfung
- run: npm audit --audit-level=moderate
# Nur zugelassene native Abhängigkeiten neu bauen
- run: npm rebuild sharp bcrypt
Was kommt als Nächstes für die npm-Sicherheit
Obligatorische Provenienz für beliebte Pakete
npm diskutiert verpflichtende Provenienzattestierung ab einer bestimmten Download-Schwelle – verhindert manuelle, Token-basierte Veröffentlichungen wie beim Axios-Angriff.
Zwei-Personen-Freigabeprinzip
Pakete mit hoher Downloadzahl könnten eine doppelte Autorisierung für Releases erfordern – ein kompromittiertes Konto reicht nicht mehr.
Laufzeit-Berechtigungsumfang
Deno beschränkt schon heute Netzwerk-, Dateisystem- und Env-Zugriffe von Skripten. Node.js experimentiert mit ähnlichen Modellen. Postinstall-Skripte müssten explizit berechtigt werden.
Konvergenz der Paketmanager
pnpms Isolationsmodell verhindert viele Dependency-Confusion-Angriffe. Nimmt npm ähnliche Strenge an, schrumpft die Angriffsfläche weiter.
FAQ
Was ist ein Supply-Chain-Angriff in npm?
Ein Supply-Chain-Angriff zielt auf die Abhängigkeitskette: Angreifer kompromittieren Maintainer-Konten, injizieren bösartigen Code in populäre Pakete oder veröffentlichen Typosquat-Pakete. Beim Installieren/Aktualisieren wird der Code auf Ihren Systemen ausgeführt und kann Daten stehlen oder Backdoors platzieren.
Ist npm audit ausreichend, um vor Supply-Chain-Angriffen zu schützen?
Nein. npm audit prüft gegen bekannte CVEs. Zero-Day-Angriffe wie Axios erscheinen erst später. Sie benötigen Tools wie Socket.dev, die das tatsächliche Verhalten der Pakete analysieren.
Sollte ich npm komplett aufhören zu verwenden?
Nein. npm bleibt das größte Ökosystem, die meisten Pakete sind sicher. Ziel: Gefährdung durch exaktes Pinnen, Lockfile-Durchsetzung, Skript-Blockierung und Abhängigkeitsminimierung reduzieren. Prüfen Sie jede Abhängigkeit und nutzen Sie native Alternativen, wo möglich.
Wie hilft Apidog, das npm-Supply-Chain-Risiko zu reduzieren?
Apidog bietet integrierten HTTP-Client, Test-Runner, Mock-Server und Doku-Generator für APIs. Keine npm-Abhängigkeit für Axios, node-fetch, Jest, Express etc. Weniger npm-Abhängigkeiten = weniger Angriffsvektoren.
Was ist Paketprovenienz in npm?
Paketprovenienz verknüpft ein veröffentlichtes Paket kryptographisch mit Quell-Repository und CI/CD-Umgebung (Sigstore). Nachprüfbar mit npm audit signatures. Fehlt die Provenienz, ist Vorsicht geboten.
Wie viele npm-Pakete sind bösartig?
Snyk fand 2024 über 3.000 bösartige npm-Pakete. Im Q4/2025 blockierte Sonatype über 120.000 Malware-Attacken über npm, PyPI und andere. Die Zahl steigt. Die meisten bösartigen Pakete sind Typosquats, aber Kompromittierungen wie Axios zeigen: Auch populäre Pakete sind gefährdet.
Was ist die PackageGate-Schwachstelle?
PackageGate = 6 Zero-Day-Schwachstellen (offenbart Jan 2026; npm, pnpm, vlt, Bun). Git-basierte Abhängigkeiten können trotz deaktivierter Lebenszyklus-Skripte Code ausführen. Pinnen Sie Git-Abhängigkeiten auf Commit-Hashes.
Wichtige Erkenntnisse
- Lockfiles sind das Fundament, schützen aber nicht bei Erstinstallation während eines Angriffsfensters
- Postinstall-Skripte global deaktivieren (
ignore-scripts=truein.npmrc) - Exakte Versionen pinnen (
save-exact=true), um Semver-Fallen zu vermeiden - Paketprovenienz mit
npm audit signaturesprüfen - Socket.dev (Verhaltensanalyse) + Snyk (bekannte Schwachstellen) +
npm audit(Basis) - Abhängigkeitsanzahl durch native Node.js-APIs und Plattformen wie Apidog reduzieren
- CI/CD-Netzwerk-Egress mit StepSecurity Harden-Runner überwachen
Jede Abhängigkeit ist eine Vertrauensentscheidung. Je weniger Abhängigkeiten, desto kleiner die Angriffsfläche. Je mehr Verifizierungsschichten, desto schwieriger für Angreifer. Verteidigung in der Tiefe – nicht isoliert.



Top comments (0)