Shai-Hulud: Weitverbreiteter Angriff auf die Lieferkette von npm
Detection stack
- AIDR
- Alert
- ETL
- Query
Zusammenfassung
GitLab hat einen weit verbreiteten Lieferketten-Einbruch aufgedeckt, der auf NPM-Ökosysteme abzielt. Die Kampagne verbreitet eine aktualisierte Variante der Shai-Hulud-Malware über bösartige Preinstall-Skripte. Diese Nutzlast sammelt Cloud- und Code-Host-Anmeldeinformationen, leitet Daten an von Angreifern kontrollierte GitHub-Repositories weiter und verbreitet sich weiter, indem trojanisierte Pakete neu veröffentlicht werden. Ein eingebauter Dead-Man’s-Switch kann Benutzerdateien löschen oder beschädigen, wenn die Infrastruktur des Angreifers gestört wird.
Untersuchung
GitLabs Schwachstellenforschungsteam verfolgte die Aktivität bis zu manipulierten NPM-Paketen zurück, deren modifizierte package.json auf einen setup_bun.js-Loader verweist. Dieser Loader installiert die Bun-Laufzeitumgebung und löst eine gebündelte bun_environment.js-Nutzlast aus, die Anmeldeinformationen sammelt, Trufflehog ausführt, um Geheimnisse zu entdecken, und Ergebnisse in ein öffentliches GitHub-Repository hochlädt. Die Malware erstellt auch neue GitHub-Repositories als Ablageboxen und missbraucht gestohlene NPM-Tokens, um kompromittierte Pakete neu zu veröffentlichen. Wenn der Zugriff auf sowohl GitHub als auch NPM unterbrochen wird, löscht oder überschreibt die Nutzlast Benutzerdateien.
Abschwächung
GitLab empfiehlt, dass Organisationen NPM-Abhängigkeiten auf unerwartete Preinstall-Skripte überprüfen und die Integrität veröffentlichter Pakete validieren. Teams sollten nicht autorisierte setup_bun.js-Loader entfernen, offengelegte NPM- und GitHub-Tokens widerrufen und auf verdächtige GitHub-Repositories mit der Markierung ‚Sha1-Hulud: The Second Coming‘ achten. Der Endpunktschutz sollte so konfiguriert sein, dass unvertrauenswürdige Node-Skripte blockiert und die zerstörerischen Befehlszeilen, die im Bericht dokumentiert sind, erkannt werden.
Reaktion
Wenn eine Aktivität erkannt wird, isolieren Sie das betroffene System, widerrufen alle kompromittierten Anmeldeinformationen und entfernen Sie bösartige NPM-Pakete aus internen Registern. Führen Sie eine forensische Überprüfung durch, um Datenexfiltration und Dateivernichtung zu bestätigen oder auszuschließen. Erstellen Sie neue Anmeldeinformationen für Cloud-Plattformen und GitHub und überwachen Sie GitHub kontinuierlich auf neu erstellte Repositories, die dem Marker des Angreifers entsprechen. Verstärken Sie schließlich CI/CD-Pipelines, um willkürliche Preinstall-Skripte zu verbieten.
mermaid graph TB %% Class definitions classDef technique fill:#99ccff classDef file fill:#ffcc99 classDef tool fill:#cccccc classDef malware fill:#ff9999 classDef operator fill:#ff9900 %% Nodes – Attack Techniques tech_supply_chain[„<b>Technik</b> – <b>T1195.001 Supply Chain Kompromiss</b>: Bösartige NPM-Pakete veröffentlichen eine modifizierte package.json, die ein Preinstall-Skript hinzufügt“] class tech_supply_chain technique tech_client_exec[„<b>Technik</b> – <b>T1203 Ausnutzung für Client-Ausführung</b>: NPM führt das Preinstall-Skript während der Paketinstallation aus und führt das bösartige setup_bun.js aus“] class tech_client_exec technique tech_software_ext[„<b>Technik</b> – <b>T1176 Softwareerweiterungen</b>: Das Preinstall-Skript fungiert als bösartige Erweiterung des legitimen Pakets“] class tech_software_ext technique tech_obfuscate[„<b>Technik</b> – <b>T1027 Verschleierte Dateien oder Informationen</b>: Großes verschleiertes Nutzlast bun_environment.js wird heruntergeladen“] class tech_obfuscate technique tech_decode[„<b>Technik</b> – <b>T1140 Entschlüsseln/Decodieren von Dateien oder Informationen</b>: Nutzlast wird vor der Ausführung entschlüsselt“] class tech_decode technique tech_hidden_files[„<b>Technik</b> – <b>T1564.001 Versteckte Dateien und Verzeichnisse</b>: Erstellt .truffler-cache/ und Unterverzeichnisse“] class tech_hidden_files technique tech_path_excl[„<b>Technik</b> – <b>T1564.012 Dateipathausschlüsse</b>: Speichert bösartige Binärdateien in versteckten Pfaden, um Erkennung zu vermeiden“] class tech_path_excl technique tech_cred_in_files[„<b>Technik</b> – <b>T1552.001 Anmeldeinformationen in Dateien</b>: Durchsucht .npmrc, Umgebungsvariablen und Konfigurationsdateien nach Cloud- und Repository-Tokens“] class tech_cred_in_files technique tech_auto_collect[„<b>Technik</b> – <b>T1119 Automatische Sammlung</b>: Führt Trufflehog aus, um Geheimnisse vom Dateisystem zu sammeln“] class tech_auto_collect technique tech_exfil_repo[„<b>Technik</b> – <b>T1567.001 Exfiltration in Code-Repository</b>: Verwendet gestohlene GitHub-Token, um öffentliche Repos zu erstellen und Anmeldeinformationen hochzuladen“] class tech_exfil_repo technique tech_destructive[„<b>Technik</b> – <b>T1565 Datenmanipulation</b>: Führt zerstörerische Befehle (del, cipher, shred) aus, um Benutzerdaten zu löschen und zu überschreiben“] class tech_destructive technique tech_impair[„<b>Technik</b> – <b>T1562 Abwehr beeinträchtigen</b>: Dead-Man’s-Switch verhindert die Wiederherstellung, indem Daten zerstört werden“] class tech_impair technique tech_propagate[„<b>Technik</b> – <b>T1195.001 Supply Chain Verbreitung</b>: Verwendet gestohlene NPM-Token, um bösartige Preinstall-Skripte in Opferpaketen zu injizieren und sie neu zu veröffentlichen“] class tech_propagate technique %% Nodes – Dateien und Werkzeuge file_package_json[„<b>Datei</b>: package.json mit bösartigem Preinstall-Skript“] class file_package_json file file_setup_bun[„<b>Datei</b>: setup_bun.js (Preinstall-Skript)“] class file_setup_bun file file_bun_env[„<b>Datei</b>: bun_environment.js (verschleierte Nutzlast)“] class file_bun_env file file_trufflehog[„<b>Werkzeug</b>: Trufflehog-Binärdatei gespeichert in .truffler‑cache“] class file_trufflehog tool file_hidden_dir[„<b>Datei</b>: .truffler‑cache/ verstecktes Verzeichnis“] class file_hidden_dir file file_github_repo[„<b>Datei</b>: Öffentliches GitHub-Repository, erstellt zur Exfiltration“] class file_github_repo file %% Edges – Angriffsablauf tech_supply_chain u002du002d>|fügt Preinstall-Skript hinzu| file_package_json file_package_json u002du002d>|löst während NPM-Installation aus| tech_client_exec tech_client_exec u002du002d>|führt aus| file_setup_bun file_setup_bun u002du002d>|lädt herunter| file_bun_env file_bun_env u002du002d>|ist| tech_obfuscate tech_obfuscate u002du002d>|erfordert| tech_decode tech_decode u002du002d>|erzeugt ausführbare Nutzlast| tech_software_ext tech_software_ext u002du002d>|erstellt| file_hidden_dir file_hidden_dir u002du002d>|speichert| file_trufflehog file_trufflehog u002du002d>|verwendet für| tech_auto_collect tech_auto_collect u002du002d>|sammelt Anmeldeinformationen| tech_cred_in_files tech_cred_in_files u002du002d>|liefert Tokens an| tech_exfil_repo tech_exfil_repo u002du002d>|lädt Daten in| file_github_repo tech_exfil_repo u002du002d>|wenn Tokens verloren gehen, löst aus| tech_destructive tech_destructive u002du002d>|beeinträchtigt Wiederherstellung via| tech_impair tech_impair u002du002d>|ermöglicht| tech_propagate tech_propagate u002du002d>|injiziert bösartige Preinstall in neue NPM-Pakete| tech_supply_chain %% Styling class tech_supply_chain,tech_client_exec,tech_software_ext,tech_obfuscate,tech_decode,tech_hidden_files,tech_path_excl,tech_cred_in_files,tech_auto_collect,tech_exfil_repo,tech_destructive,tech_impair,tech_propagate technique class file_package_json,file_setup_bun,file_bun_env,file_hidden_dir,file_github_repo file class file_trufflehog tool
Angriffsablauf
Erkennungen
Erkennung von bösartiger Bun-Installation und destruktiver Payload-Ausführung [Linux-Prozesserstellung]
Anzeigen
Erkennen von destruktiven PowerShell- und Eingabeaufforderungsbefehlen [Windows-Prozesserstellung]
Anzeigen
Verdächtige Datei oder Ordner mit Punkt als Präfix des Namens (über file_event)
Anzeigen
Datei mit verdächtiger Erweiterung von Domäne mit ungewöhnlicher TLD heruntergeladen (über Proxy)
Anzeigen
Entfernte Dateifreigabe / Herunterladen über Standardwerkzeuge (über cmdline)
Anzeigen
Simulationsausführung
Voraussetzung: Der Telemetrie- und Grundlinien-Pre‑flight-Check muss bestanden sein.
Angriffserzählung & Befehle
Der Angreifer hat sich auf dem kompromittierten Linux-Host festgesetzt. Um eine persistente Laufzeitumgebung zu etablieren, die in der Lage ist, weitere JavaScript-basierte Nutzlasten auszuführen, laden sie die Bun-Laufzeitumgebung über eine Einzeiler herunter und installieren sie, der den Installer direkt in streamtbash. Unmittelbar nach der Bestätigung, dass die Laufzeitumgebung vorhanden ist, löst der Angreifer einen ‚Dead-Man’s Switch‘ aus (hier simuliert durch ein zeitlich festgelegtes sleep), der eine zerstörerische shred Operation startet, um eine sensible Datei unwiederbringlich zu löschen (/var/log/auth.log).
Die Schritte sind:
- Bun herunterladen & installieren:
curl -fsSL https://bun.sh/install | bash - Kurz warten (Simulation der Switch-Zeit).
- Zerstörerische shred ausführen:
shred -uvz -n 1 /var/log/auth.log
Beide Befehle erzeugen Ereignisse zur Prozesserstellung, die genau den Schlüsselwörtern der Sigma-Regel entsprechen.
Regressionstest-Skript
#!/bin/bash
# -------------------------------------------------
# Simuliere Shai-Hulud “Bun install + shred” Verhalten
# -------------------------------------------------
# 1️⃣ Bun installieren (genauer Befehl erforderlich für Erkennung)
echo "[*] Bun-Laufzeitumgebung wird installiert..."
curl -fsSL https://bun.sh/install | bash
# Kurze Pause, um realistisches Timing zu emulieren
sleep 5
# 2️⃣ Destruktive Datei-Auslöschung durchführen (genauer Befehl erforderlich)
TARGET_FILE="/var/log/auth.log"
if [[ -f "$TARGET_FILE" ]]; then
echo "[*] Shreddering $TARGET_FILE ..."
shred -uvz -n 1 "$TARGET_FILE"
else
echo "[!] Zieldatei nicht gefunden; Dummy-Datei für Demo wird erstellt."
echo "Dummy-Daten" > "$TARGET_FILE"
shred -uvz -n 1 "$TARGET_FILE"
fi
echo "[*] Simulation abgeschlossen."
Bereinigungskommandos
#!/bin/bash
# -------------------------------------------------
# Bereinigen nach der Bun/Shred-Simulation
# -------------------------------------------------
# Entfernen aller verbleibenden Bun-Dateien (falls installiert)
if command -v bun >/dev/null 2>&1; then
echo "[*] Bun-Laufzeitumgebung wird entfernt..."
rm -rf "$HOME/.bun"
rm -f /usr/local/bin/bun
fi
# Wiederherstellen der geschredderten Logdatei (für Systemstabilität)
TARGET_FILE="/var/log/auth.log"
if [[ ! -f "$TARGET_FILE" ]]; then
echo "wiederhergestellter Protokollplatzhalter" | sudo tee "$TARGET_FILE" >/dev/null
sudo chmod 600 "$TARGET_FILE"
fi
echo "[*] Bereinigung abgeschlossen."