Aktiver Supply-Chain-Angriff kompromittiert node-ipc-Paket
Detection stack
- AIDR
- Alert
- ETL
- Query
Zusammenfassung
Forscher von Socket haben einen Kompromittierungsangriff auf die Lieferkette aufgedeckt, der 84 npm-Pakete betrifft, die unter dem Namespace @tanstack veröffentlicht wurden. Die bösartigen Updates führten eine stark verschleierte JavaScript-Datei ein, die entwickelt wurde, um secrets im Zusammenhang mit CI von GitHub Actions, AWS, HashiCorp Vault und Kubernetes-Umgebungen zu stehlen und dann diese Anmeldedaten zu verwenden, um sich selbst auf npm erneut zu veröffentlichen. Die Nutzlast pflanzte auch Persistenz-Hooks in den Konfigurationsverzeichnissen von Claude Code und VS Code. Die Forscher verknüpften die Aktivität mit der umfassenderen Mini Shai-Hulud-Malware-Kampagne der Lieferkette.
Untersuchung
Die Untersuchung identifizierte eine neu hinzugefügte Datei, router_init.js, die String-Array-Rotation, eine zusätzliche XOR- und Base64-Decodierungsebene und Daemonisierung verwendete, um ihr Verhalten zu verbergen. Die Malware zielte auf Umgebungsvariablen, Cloud-Metadaten-Dienste und API-Endpunkte, die mit GitHub, AWS, Vault und Kubernetes in Verbindung stehen, um Anmeldeinformationen zu sammeln. Sie verbreitete sich, indem sie die GitHub Actions OIDC-Föderation missbrauchte, um npm-Veröffentlichungs-Tokens zu erhalten, und fügte eine bösartige optionalDependency on @tanstack/setupein. Der Datenabflussverkehr wurde über das dezentrale Messaging-Netzwerk von Session geleitet.
Minderung
Betroffene Organisationen sollten die Hashes aller @tanstack/* Paketinhalte überprüfen, alle CI- und Cloud-Anmeldedaten ändern, offengelegte OIDC-Föderationsgenehmigungen widerrufen und unbefugte Dateien aus den Verzeichnissen .claude and .vscode entfernen. Das Blockieren von ausgehendem Datenverkehr zu filev2.getsession.org und die Durchsetzung von Integritätskontrollen für npm-Pakete können die Exposition weiter verringern. GitHub Actions-Workflows sollten auch gehärtet werden, indem Drittanbieteraktionen festgelegt und id-token Berechtigungen minimiert werden.
Reaktion
Verteidiger sollten nach der Anwesenheit von router_init.js und verwandten Dateinamen suchen, verdächtige erzeugte Prozesse überwachen und bei Zugriff auf identifizierte Cloud-Metadaten-Endpunkte alarmieren. Kompromittierte Pakete sollten in Quarantäne genommen, bösartige Hooks entfernt und alle exponierten Anmeldedaten sofort geändert werden. Sicherheitsteams sollten auch eine vollständige Überprüfung der GitHub Actions-Aktivität auf unbefugte Token-Nutzung durchführen und die Herkunft aller veröffentlichten npm-Pakete validieren.
"graph TB %% Klassendefinitionen classDef technique fill:#e6f7ff classDef operator fill:#ffcc66 %% Knoten, die jede ATT&CK-Technik darstellen a_initial_access["<b>Technik</b> – <b>T1195.001 Lieferkettenschwachstelle</b><br/><b>Beschreibung</b>: Der Gegner kompromittiert eine Software-Lieferkette (z. B. bösartiges npm-Paket), um anfänglichen Zugriff zu erhalten."] class a_initial_access technique b_execution["<b>Technik</b> – <b>T1129 Geteilte Module</b><br/><b>Beschreibung</b>: Bösartiges gemeinsames Modul (router_init.js) wird während der Paketinstallation automatisch ausgeführt."] class b_execution technique c_persistence["<b>Technik</b> – <b>T1176.002 IDE-Erweiterungen</b><br/><b>Beschreibung</b>: Schreibt versteckte Dateien (.claude, .vscode) und Hooks, um Persistenz über kompromittierte IDE-Erweiterungen aufrechtzuerhalten."] class c_persistence technique d_def_evasion["<b>Technik</b> – <b>T1027 Verschleierte Dateien oder Informationen</b><br/><b>Beschreibung</b>: Payload ist verschleiert, um einer Erkennung zu entgehen.<br/><b>Technik</b> – <b>T1140 Dateien oder Informationen entschlüsseln/dekodieren</b><br/><b>Beschreibung</b>: Laufzeitroutine entschlüsselt Code vor der Ausführung."] class d_def_evasion technique e_cred_access["<b>Technik</b> – <b>T1552.005 Ungesicherte Anmeldedaten</b><br/><b>Beschreibung</b>: Liest Cloud-Instanz-Metadaten-API für Anmeldedaten aus.<br/><b>Technik</b> – <b>T1555.006 Verwaltung von Cloud-Geheimnissen</b><br/><b>Beschreibung</b>: Ruft Geheime aus Cloud-Geheimnisspeichern ab."] class e_cred_access technique f_account_disc["<b>Technik</b> – <b>T1087.004 Cloud-Konto</b><br/><b>Beschreibung</b>: Zählt Cloud-Kontoinformationen auf, um Ressourcen und Berechtigungen zu identifizieren."] class f_account_disc technique g_cred_use["<b>Technik</b> – <b>T1078 Gültige Konten</b><br/><b>Beschreibung</b>: Verwendet gesammelten OIDC-Token als gültiges Konto, um weitere bösartige Pakete zu veröffentlichen."] class g_cred_use technique h_propagation["<b>Technik</b> – <b>T1195.001 Lieferkettenschwachstelle</b><br/><b>Beschreibung</b>: Wiederverwendet das bösartige Paket über optionalDependencies und npm prepare hook, um sich auf nachgelagerte Projekte auszubreiten."] class h_propagation technique i_command_exec["<b>Technik</b> – <b>T1059.009 Cloud-API-Aufrufe</b><br/><b>Beschreibung</b>: Führt Befehle aus, indem es GitHub-, AWS- und Vault-APIs direkt aus der kompromittierten Umgebung aufruft."] class i_command_exec technique j_exfiltration["<b>Technik</b> – <b>T1041 Exfiltration über C2-Kanal</b><br/><b>Beschreibung</b>: Exfiltriert Daten über einen Peer-to-Peer-Sitzungskanal, der zwischen kompromittierten Knoten etabliert wurde."] class j_exfiltration technique k_remote_services["<b>Technik</b> – <b>T1021.007 Cloud-Services</b><br/><b>Beschreibung</b>: Nutzt GitHub GraphQL Commits als Remote-Dienst, um die Kontrolle aufrechtzuerhalten."] class k_remote_services technique %% Sequentielle Flussverbindungen a_initial_access –>|leads_to| b_execution b_execution –>|leads_to| c_persistence c_persistence –>|leads_to| d_def_evasion d_def_evasion –>|leads_to| e_cred_access e_cred_access –>|leads_to| f_account_disc f_account_disc –>|leads_to| g_cred_use g_cred_use –>|leads_to| h_propagation h_propagation –>|leads_to| i_command_exec i_command_exec –>|leads_to| j_exfiltration j_exfiltration –>|leads_to| k_remote_services "
Angriffsfluss
Erkennungen
Verdächtiger ausführbarer Download (über Proxy)
Anzeigen
Mögliche VSCode-Automatisierte-Aufgaben-Konfigurationsdatei in ungewöhnlichem Verzeichnis erstellt [MACOS] (über file_event)
Anzeigen
Mögliche VSCode-Automatisierte-Aufgaben-Konfigurationsdatei in ungewöhnlichem Verzeichnis erstellt [LINUX] (über file_event)
Anzeigen
IOCs (HashSha256) zur Erkennung: Aktiver Lieferkettenangriff: node-ipc-Paket kompromittiert
Anzeigen
IOCs (HashSha1) zur Erkennung: Aktiver Lieferkettenangriff: node-ipc-Paket kompromittiert
Anzeigen
IOCs (HashMd5) zur Erkennung: Aktiver Lieferkettenangriff: node-ipc-Paket kompromittiert
Anzeigen
AWS-Anmeldeinformationen-Ernte über IMDSv2 und ECS-Aufgaben-Metadaten-Endpunkt [AWS Cloudtrail]
Anzeigen
Simulationsausführung
Voraussetzung: Der Telemetrie- und Basislinien-Pre-Flight-Check muss bestanden werden.
Begründung: Dieser Abschnitt beschreibt die genaue Ausführung der gegnerischen Technik (TTP), die entwickelt wurde, um die Erkennungsregel auszulösen. Die Befehle und Beschreibungen MÜSSEN die identifizierten TTPs direkt widerspiegeln und darauf abzielen, die genaue Telemetrie zu erzeugen, die von der Erkennungslogik erwartet wird. Abstrakte oder nicht verwandte Beispiele führen zu Fehldiagnosen.
-
Angriffsnarrativ und Befehle:
- Erlange ein IMDSv2-Sitzungstoken – der Angreifer gibt eine
PUTAnfrage an den Token-Endpunkt mit einer TTL von 21600 Sekunden. - Verwende das Token, um den IAM-Rollennamen abzufragen unter
/latest/meta-data/iam/security-credentials/. - Rufe die temporären IAM-Anmeldedaten ab (AccessKeyId, SecretAccessKey, Token) für das Instanzprofil.
- Speichere die Anmeldedaten lokal zur späteren Verwendung (z. B. um AWS-APIs aufzurufen, sich zu schwenken oder Passwort-Spraying-Angriffe durchzuführen).
Diese Schritte erzeugen HTTP-Verkehr zu den genauen URIs, die in der Sigma-Regel aufgeführt sind, welche, wenn sie von VPC Flow Logs erfasst werden, die Erkennungsbedingung erfüllen sollten.
- Erlange ein IMDSv2-Sitzungstoken – der Angreifer gibt eine
-
Regressionstestskript:
#!/usr/bin/env bash # ------------------------------------------------- # Skript: aws_imds_credential_harvest.sh # Zweck: Simulieren der Ernte von Anmeldeinformationen über IMDSv2 / ECS-Metadaten # ------------------------------------------------- set -euo pipefail # 1. Fordere IMDSv2-Token an TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" -s) if [[ -z "$TOKEN" ]]; then echo "[!] Erhalt von IMDSv2-Token fehlgeschlagen" exit 1 fi echo "[*] Erhalten von IMDSv2-Token erfolgreich" # 2. Erhalte den IAM-Rollennamen, der mit der Instanz verknüpft ist ROLE_NAME=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/meta-data/iam/security-credentials/) if [[ -z "$ROLE_NAME" ]]; then echo "[!] Abrufen des IAM-Rollennamens nicht möglich" exit 1 fi echo "[*] IAM-Rolle der Instanz: $ROLE_NAME" # 3. Rufe temporäre Anmeldeinformationen für die Rolle ab CREDS_JSON=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/meta-data/iam/security-credentials/$ROLE_NAME) echo "[*] Abgerufene Anmeldeinformationen:" echo "$CREDS_JSON" | jq . # 4. (Optional) Als Umgebungsvariablen für späteren AWS CLI-Gebrauch exportieren export AWS_ACCESS_KEY_ID=$(echo "$CREDS_JSON" | jq -r .AccessKeyId) export AWS_SECRET_ACCESS_KEY=$(echo "$CREDS_JSON" | jq -r .SecretAccessKey) export AWS_SESSION_TOKEN=$(echo "$CREDS_JSON" | jq -r .Token) echo "[*] Anmeldeinformationen für die Umgebung exportiert (nur zur Demonstration)." # ------------------------------------------------- # Ende des Skripts # ------------------------------------------------- -
Bereinigungskommandos:
# Lösche Umgebungsvariablen, die temporäre Anmeldedaten enthalten unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN # Entferne alle temporären Dateien (keine in diesem Skript erstellt) echo "[*] Bereinigung abgeschlossen."