SOC Prime Bias: Kritisch

08 Jun 2026 19:43 UTC

Von Preinstall zu Persistenz: Die Red Hat npm Miasma Kampagne zum Diebstahl von Anmeldedaten

Author Photo
SOC Prime Team linkedin icon Folgen
Von Preinstall zu Persistenz: Die Red Hat npm Miasma Kampagne zum Diebstahl von Anmeldedaten
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Zusammenfassung

Microsoft Defender hat einen Lieferkettenkompromiss identifiziert, der 32 npm-Pakete betrifft, die unter dem @redhat-cloud-services Namensraum veröffentlicht wurden. Die Angreifer fügten einen Pre-Installations-Hook ein, der einen stark verschleierten JavaScript-Loader bereitstellt, der dann die Bun-Laufzeitumgebung und einen zweiten Credential-Stealer abruft. Die Malware sammelt Tokens von GitHub, npm, großen Cloud-Anbietern, HashiCorp Vault und Kubernetes und veröffentlicht dann vergiftete Pakete erneut, um sich weiter zu verbreiten. Die Kampagne umfasst auch eine destruktive Sperre, die das Home-Verzeichnis des Opfers löscht, wenn ein Täuschungstoken erkannt wird.

Untersuchung

Die Untersuchung verfolgte den ursprünglichen Verstoß auf eine kompromittierte CI/CD-Pipeline für zurück RedHatInsights/javascript-clients, wo die Angreifer einen legitimen GitHub Actions OIDC Workflow missbrauchten, um trojanisierte Pakete mit gültigen Herkunftssignaturen zu veröffentlichen. Die Analyse des Droppers deckte mehrere Verschleierungsschichten auf, einschließlich ROT-basierte Codierung, AES-128-GCM-Verschlüsselung und ein benutzerdefiniertem Chiffre, bevor Bun ausgeführt wurde, um die zweite Nutzlast zu starten. Die Bedrohungsakteure kratzen auch Memory von GitHub Actions Runners ab, um Geheimnisse direkt aus aktiven Prozessen zu extrahieren.

Minderung

Microsoft empfiehlt, Abhängigkeitshierarchien für die betroffenen @redhat-cloud-services Pakete zu überprüfen, vertrauenswürdige Versionen zu fixieren und npm-Skriptausführungen mit dem --ignore-scripts Flag, wo möglich, zu deaktivieren. Alle kompromittierten npm-Tokens sollten widerrufen und neu ausgegeben werden, und GitHub-Konten sollten auf unbefugte Repository-Erstellung oder verdächtige Aktivitäten überprüft werden. Weitere Sicherheitsmaßnahmen wurden seitdem in dem @redhat-cloud-services Namensraum implementiert, um unbefugte Veröffentlichungen zu verhindern.

Reaktion

Verteidiger sollten verdächtige npm-Pre-Installationsausführungen und unerwartete Bun-Laufzeit-Starts aus temporären Verzeichnissen erkennen. Auch die Erstellung unbekannter öffentlicher GitHub-Repositories und ungewöhnliche Token-Nutzungsmuster sollten überwacht werden. Netzwerkschutzmaßnahmen sollten Verbindungen zu bekannten Bun-Download-URLs und der api.anthropic.com Domain blockieren oder warnen. Alle potenziell offengelegten Anmeldeinformationen sollten sofort rotiert werden, und CI/CD Runner-Speicher sollte auf Anzeichen von geleakten Geheimnissen untersucht werden.

„graph TB %% Class Definitions classDef action fill:#99ccff classDef tool fill:#cccccc classDef malware fill:#ffcc99 classDef process fill:#ff9966 %% Nodes node_sc_001[„ActionT1195.001 Lieferkettenkompromiss: Kompromittierung von Software-Abhängigkeiten und Entwicklungstools
Angreifer kaperten die RedHatInsights/javascript-clients CI/CD-Pipeline und nutzten GitHub Actions OIDC zur Veröffentlichung trojanisierter @redhat-cloud-services npm-Pakete.“] class node_sc_001 action tool_github_oidc[„WerkzeugName: GitHub Actions OIDC
Beschreibung: OpenID Connect-Integration, die kurzlebige Tokens für CI-Workflows bereitstellt.“] class tool_github_oidc tool malicious_preinstall[„MalwareT1127.003 Vertrauenswürdige Entwickler-Dienstprogramme Proxy-Ausführung: Bösartiger pre-install Hook in package.json, der automatisch während npm install ausgeführt wird und node index.js startet.“] class malicious_preinstall malware installer_trigger[„ActionT1546.016 Ereignisausgelöste Ausführung: Installationspaket-Trigger, der den Dropper ausführt, wenn das Pre-Installationsskript aufgerufen wird.“] class installer_trigger action obfuscated_payload[„MalwareT1027.009 Verschleierte Dateien oder Informationen: Eingebettete Nutzlast (4,29 MB index.js) mit mehrschichtiger ROT, AES-128-GCM, String-Array und benutzerdefinierter PBKDF2-Chiffre zur Verschleierung seines Codes.“] class obfuscated_payload malware dynamic_resolution[„MalwareT1027.007 Verschleierte Dateien oder Informationen: Dynamische API-Auflösung – Laufzeit-Dekodierung löst URLs für die Bun-Laufzeitumgebung und C2-Endpunkte auf.“] class dynamic_resolution malware ingress_transfer[„ActionT1105 Ingress-Werkzeugtransfer: Dropper lädt die Bun JavaScript-Laufzeitumgebung von offiziellen Release-URLs herunter, bevor die zweite Nutzlast ausgeführt wird.“] class ingress_transfer action tool_bun_runtime[„WerkzeugName: Bun JavaScript Laufzeitumgebung
Beschreibung: Hochleistungs-JavaScript-Engine, die als Ausführungsumgebung für die zweite Stufe dient.“] class tool_bun_runtime tool metadata_query[„ActionT1552.005 Ungesicherte Zugangsdaten: Cloud-Instanz-Metadaten-API
Abfragen von AWS/ECS, Azure IMDS und GCP Metadaten-Diensten zum Abrufen von Cloud-Zugangs-Token.“] class metadata_query action file_credential[„ActionT1552.001 Ungesicherte Zugangsdaten: Zugangsdaten in Dateien
Durchsucht lokale Dateien nach SSH-Schlüsseln, CLI-Konfigurationen, Kryptowährungs-Wallet-Dateien und anderem geheimen Material.“] class file_credential action token_harvest[„ActionT1528 Stehlen von Anwendungszugangstoken: Erntet GitHub Actions-Runner-Token, npm OIDC-Token und andere Anbietertokens.“] class token_harvest action browser_discovery[„ActionT1217 Browser-Informationsentdeckung: Sammelt Browser-Stores und Kryptowährungs-Wallet-Dateien von Entwickler-Arbeitsplätzen.“] class browser_discovery action elevation_control[„ActionT1548 Missbrauch von Steuermechanismen zur Erhöhung: Installiert eine passwortlose Sudo-Regel über ein eingebundenes /etc/sudoers.d, um Root-Rechte zu erlangen.“] class elevation_control action exfiltration_git[„ActionT1048 Exfiltration über alternatives Protokoll: Exfiltriert gestohlene Zugangsdaten durch Erstellung von GitHub-Repositories unter dem Konto des Opfers, Commiten von JSON-Dateien und Verwendung eines alternativen HTTPS-Endpunkts.“] class exfiltration_git action destructive_cleanup[„ActionT1070.010 Indikator-Entfernung: Verlegt Malware und führt, falls ein Täuschungstoken verwendet wurde, rm -rf ~/ aus, um das Benutzerverzeichnis zu löschen.“] class destructive_cleanup action node_sc_002[„ActionT1195.002 Lieferkettenkompromiss: Kompromittierung der Software-Lieferkette – neu veröffentlichte vergiftete Pakete mit gefälschter SLSA-Herkunft, die wurmähnliche Verbreitung in nachgelagerte Projekte ermöglichen.“] class node_sc_002 action %% Connections node_sc_001 –>|verwendet| tool_github_oidc tool_github_oidc –>|führt aus| malicious_preinstall malicious_preinstall –>|löst aus| installer_trigger installer_trigger –>|führt aus| obfuscated_payload obfuscated_payload –>|führt durch| dynamic_resolution dynamic_resolution –>|lädt herunter| ingress_transfer ingress_transfer –>|installiert| tool_bun_runtime tool_bun_runtime –>|abfragen| metadata_query metadata_query –>|bricht ab| file_credential file_credential –>|erntet| token_harvest token_harvest –>|sammelt| browser_discovery browser_discovery –>|ermöglicht| elevation_control elevation_control –>|exfiltriert via| exfiltration_git exfiltration_git –>|kann auslösen| destructive_cleanup destructive_cleanup –>|erleichtert| node_sc_002 node_sc_002 –>|verbreitet sich zu| node_sc_001

Angriffsablauf

Simulation Ausführung

Voraussetzung: Der Telemetrie- & Grundlatenz Vorflugstest muss bestanden haben.

Begründung: Dieser Abschnitt enthält die genaue Ausführung der gegnerischen Technik (TTP), die darauf ausgelegt ist, die Erkennungsregel auszulösen. Die Befehle und die Erzählung MÜSSEN direkt die identifizierten TTPs widerspiegeln und sollen die genaue Telemetrie erzeugen, die von der Erkennungslogik erwartet wird.

  • Angriffserzählung & Befehle:
    Ein Angreifer, der bereits eine GCE-VM kompromittiert hat, verwendet einen living-off-the-land Ansatz, um das Standarddienstkonten-Token der VM zu ernten. Die Schritte sind:

    1. Den Metadaten-Server sondieren um zu überprüfen, ob er erreichbar ist.
    2. Eine Token-Anfrage senden to http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token mit dem erforderlichen Header "Metadata-Flavor: Google". Das erhaltene JSON speichern
    3. (enthält Verwenden Sie das Token Verwenden Sie das Token, Verwenden Sie das Token, Verwenden Sie das Token).
    4. um eine privilegierte GCP-API aufzurufen (z.B. alle Buckets auflisten), um nachvollziehbare Zugangsdaten zu demonstrieren. to call a privileged GCP API (e.g., list all buckets) to demonstrate actionable credentials.

    Diese genaue Sequenz generiert das Auditereignis GCPServiceAccountTokenAccess, das der Sigma-Regel Auswahl.

  • Regression Test Script:

    #!/usr/bin/env bash
    set -euo pipefail
    
    # 1. Erreichbarkeit des Metadaten-Servers überprüfen
    echo "[*] Metadaten-Server werden sondiert..."
    curl -s -H "Metadata-Flavor: Google" 
      "http://metadata.google.internal/computeMetadata/v1/instance/id" >/dev/null
    
    # 2. Standarddienstkonten-Token ernten
    echo "[*] Dienstkonten-Token wird angefordert..."
    TOKEN_RESPONSE=$(curl -s -H "Metadata-Flavor: Google" 
      "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token")
    
    echo "[+] Token-Antwort erhalten:"
    echo "${TOKEN_RESPONSE}" | jq .
    
    # 3. Das Zugriffstoken extrahieren
    ACCESS_TOKEN=$(echo "${TOKEN_RESPONSE}" | jq -r '.access_token')
    
    # 4. Mit dem Token GCS-Buckets auflisten (demonstriert die Nutzenfähigkeit des Tokens)
    echo "[*] Token wird verwendet, um GCS-Buckets aufzulisten..."
    curl -s -H "Authorization: Bearer ${ACCESS_TOKEN}" 
      "https://storage.googleapis.com/storage/v1/b" | jq .
    
    echo "[+] Simulation abgeschlossen. Die obigen Aktionen sollten ein GCPServiceAccountTokenAccess-Auditereignis erzeugt haben."
  • Bereinigungskommandos:

    # Es wurden keine dauerhaften Änderungen vorgenommen; nur temporäre Variablen werden entfernt.
    unset TOKEN_RESPONSE ACCESS_TOKEN
    echo "[*] Bereinigung abgeschlossen."