Dall’Installazione alla Persistenza: All’interno della Campagna di Furto di Credenziali npm Miasma di Red Hat
Detection stack
- AIDR
- Alert
- ETL
- Query
Sommario
Microsoft Defender ha identificato un compromesso della supply chain che colpisce 32 pacchetti npm pubblicati sotto lo @redhat-cloud-services namespace. Gli attaccanti hanno inserito un hook pre-installazione che distribuisce un caricatore JavaScript pesantemente offuscato, che poi recupera l’ambiente di runtime Bun e un ladro di credenziali di seconda fase. Il malware raccoglie token da GitHub, npm, principali fornitori di cloud, HashiCorp Vault e Kubernetes, quindi ripubblica pacchetti avvelenati per continuare a diffondersi. La campagna include anche una misura di salvaguardia distruttiva che cancella la directory home della vittima se viene rilevato un token esca.
Indagine
L’indagine ha rintracciato la violazione iniziale a una pipeline CI/CD compromessa per RedHatInsights/javascript-clients, dove gli attaccanti hanno abusato di un workflow OIDC di GitHub Actions legittimo per pubblicare pacchetti trojanizzati con firme di provenienza valide. L’analisi del dropper ha esposto diversi livelli di offuscamento, inclusi codifica basata su ROT, crittografia AES-128-GCM e un cifrario personalizzato, prima che Bun fosse eseguito per lanciare il payload di seconda fase. Gli attori della minaccia hanno anche raschiato la memoria dai runner di GitHub Actions per estrarre segreti direttamente da processi attivi.
Mitigazione
Microsoft raccomanda di rivedere gli alberi delle dipendenze per i @redhat-cloud-services pacchetti colpiti, fissando versioni attendibili e disabilitando l’esecuzione degli script npm con il --ignore-scripts flag dove possibile. Tutti i token npm compromessi dovrebbero essere revocati e riemessi, e gli account GitHub dovrebbero essere controllati per la creazione di repository non autorizzati o attività sospette. Ulteriori misure di salvaguardia sono state implementate all’interno del @redhat-cloud-services namespace per prevenire la pubblicazione non autorizzata.
Risposta
I difensori dovrebbero rilevare esecuzioni sospette di pre-installazione npm e lanci imprevisti dell’ambiente di runtime Bun da directory temporanee. Il monitoraggio dovrebbe anche coprire la creazione di repository pubblici GitHub sconosciuti e schemi insoliti di utilizzo dei token. Le difese della rete dovrebbero bloccare o allertare su connessioni a URL di download noti di Bun e il dominio api.anthropic.com. Qualsiasi credenziale potenzialmente esposta dovrebbe essere ruotata immediatamente, e la memoria del runner CI/CD dovrebbe essere esaminata per segni di segreti trapelati. domain. Any potentially exposed credentials should be rotated immediately, and CI/CD runner memory should be investigated for signs of leaked secrets.
"graph TB %% Class Definitions classDef action fill:#99ccff classDef tool fill:#cccccc classDef malware fill:#ffcc99 classDef process fill:#ff9966 %% Nodes node_sc_001["<b>Action</b> – <b>T1195.001 Supply Chain Compromise</b>: Compromise Software Dependencies and Development Tools<br/>Attacker hijacked the RedHatInsights/javascript-clients CI/CD pipeline and used GitHub Actions OIDC to publish trojanized @redhat-cloud-services npm packages."] class node_sc_001 action tool_github_oidc["<b>Tool</b> – <b>Name</b>: GitHub Actions OIDC<br/><b>Description</b>: OpenID Connect integration that provides shortu2011lived tokens to CI workflows."] class tool_github_oidc tool malicious_preinstall["<b>Malware</b> – <b>T1127.003 Trusted Developer Utilities Proxy Execution</b>: Malicious preu2011install hook in package.json executed automatically during <code>npm install</code>, spawning <code>node index.js</code>."] class malicious_preinstall malware installer_trigger["<b>Action</b> – <b>T1546.016 Event Triggered Execution</b>: Installeru2011package trigger that runs the dropper when the preu2011install script is invoked."] class installer_trigger action obfuscated_payload["<b>Malware</b> – <b>T1027.009 Obfuscated Files or Information</b>: Embedded payload (4.29u202fMB index.js) using multiu2011layer ROT, AESu2011128u2011GCM, stringu2011array and custom PBKDF2 cipher to hide its code."] class obfuscated_payload malware dynamic_resolution["<b>Malware</b> – <b>T1027.007 Obfuscated Files or Information</b>: Dynamic API resolution u2013 runtime deobfuscation resolves URLs for the Bun runtime and C2 endpoints."] class dynamic_resolution malware ingress_transfer["<b>Action</b> – <b>T1105 Ingress Tool Transfer</b>: Dropper downloads the Bun JavaScript runtime from official release URLs before executing the secondu2011stage payload."] class ingress_transfer action tool_bun_runtime["<b>Tool</b> – <b>Name</b>: Bun JavaScript Runtime<br/><b>Description</b>: Highu2011performance JavaScript engine used as the execution environment for the second stage."] class tool_bun_runtime tool metadata_query["<b>Action</b> – <b>T1552.005 Unsecured Credentials</b>: Cloud Instance Metadata API<br/>Queries AWS/ECS, Azure IMDS and GCP metadata services to obtain cloud access tokens."] class metadata_query action file_credential["<b>Action</b> – <b>T1552.001 Unsecured Credentials</b>: Credentials In Files<br/>Scrapes local files for SSH keys, CLI configs, cryptocurrency wallet files and other secret material."] class file_credential action token_harvest["<b>Action</b> – <b>T1528 Steal Application Access Token</b>: Harvests GitHub Actions runner tokens, npm OIDC tokens and other provider tokens."] class token_harvest action browser_discovery["<b>Action</b> – <b>T1217 Browser Information Discovery</b>: Collects browser stores and cryptocurrency wallet files from developer workstations."] class browser_discovery action elevation_control["<b>Action</b> – <b>T1548 Abuse Elevation Control Mechanism</b>: Installs a passwordu2011less sudo rule via a bindu2011mounted <code>/etc/sudoers.d</code> to gain root privileges."] class elevation_control action exfiltration_git["<b>Action</b> – <b>T1048 Exfiltration Over Alternative Protocol</b>: Exfiltrates stolen credentials by creating GitHub repositories under the victimu2019s account, committing JSON files, and also uses an alternate HTTPS endpoint."] class exfiltration_git action destructive_cleanup["<b>Action</b> – <b>T1070.010 Indicator Removal</b>: Relocates malware and, if a decoy token was used, executes <code>rm -rf ~/</code> to wipe the useru2019s home directory."] class destructive_cleanup action node_sc_002["<b>Action</b> – <b>T1195.002 Supply Chain Compromise</b>: Compromise Software Supply Chain u2013 republished poisoned packages with forged SLSA provenance, enabling wormu2011like propagation to downstream projects."] class node_sc_002 action %% Connections node_sc_001 –>|uses| tool_github_oidc tool_github_oidc –>|executes| malicious_preinstall malicious_preinstall –>|triggers| installer_trigger installer_trigger –>|executes| obfuscated_payload obfuscated_payload –>|performs| dynamic_resolution dynamic_resolution –>|downloads| ingress_transfer ingress_transfer –>|installs| tool_bun_runtime tool_bun_runtime –>|queries| metadata_query metadata_query –>|scrapes| file_credential file_credential –>|harvests| token_harvest token_harvest –>|collects| browser_discovery browser_discovery –>|enables| elevation_control elevation_control –>|exfiltrates via| exfiltration_git exfiltration_git –>|may trigger| destructive_cleanup destructive_cleanup –>|facilitates| node_sc_002 node_sc_002 –>|propagates to| node_sc_001 "
Flusso di attacco
Rilevamenti
Caricamento/Scaricamento Remoto di File tramite Strumenti Standard (tramite riga di comando)
Visualizza
IOC (HashSha256) per rilevare: Preinstallazione a persistenza: All’interno della campagna Red Hat npm Miasma di furto credenziali
Visualizza
Comportamento Sospetto del Processo Node.js con Esecuzione di Bun Runtime [Creazione di Process Windows]
Visualizza
Esecuzione di Bun Runtime e Rilevamento della Regola Sudo Senza Password [Creazione di Process Linux]
Visualizza
Harvesting del Token del Service Account GCP dalla Campagna Miasma [Google Cloud Platform]
Visualizza
Rilevamento di Accesso Non Autorizzato ai Token OAuth2 Azure IMDS [Log delle Attività Azure]
Visualizza
Accesso a Credenziali tramite Recupero di Token OAuth2 IMDS e Accesso a Secrets Manager [AWS Cloudtrail]
Visualizza
Esecuzione della Simulazione
Prerequisito: Il Controllo Preliminare di Telemetria & Baseline deve essere passato.
Motivazione: Questa sezione descrive l’esecuzione precisa della tecnica dell’avversario (TTP) progettata per attivare la regola di rilevamento. I comandi e la narrazione DEVONO riflettere direttamente i TTP identificati e mirano a generare la telemetria esatta prevista dalla logica di rilevamento.
-
Narrativa dell’Attacco & Comandi:
Un avversario che ha già compromesso una VM GCE utilizza un approccio living-off-the-land per raccogliere il token del service account predefinito della VM. I passaggi sono:- Sonda il server dei metadati per verificare che sia raggiungibile.
- Emetti una richiesta di token to
http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/tokencon l’intestazione richiestaMetadata-Flavor: Google. - Salva il JSON restituito (contiene
access_token,expires_in,token_type). - Usa il token per chiamare un’API GCP privilegiata (es., elenca tutti i bucket) per dimostrare credenziali azionabili.
Questa sequenza esatta genera l’evento di audit
GCPServiceAccountTokenAccess, che corrisponde alla regola Sigmaselezione. -
Script di Test di Regressione:
#!/usr/bin/env bash set -euo pipefail # 1. Verificare la raggiungibilità del server dei metadati echo "[*] Sondaggio del server dei metadati..." curl -s -H "Metadata-Flavor: Google" "http://metadata.google.internal/computeMetadata/v1/instance/id" >/dev/null # 2. Raccogliere il token del service account predefinito echo "[*] Richiesta del token del service account..." TOKEN_RESPONSE=$(curl -s -H "Metadata-Flavor: Google" "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token") echo "[+] Risposta del token ricevuta:" echo "${TOKEN_RESPONSE}" | jq . # 3. Estrarre il token di accesso ACCESS_TOKEN=$(echo "${TOKEN_RESPONSE}" | jq -r '.access_token') # 4. Usa il token per elencare i bucket GCS (dimostra l'utilità del token) echo "[*] Utilizzando il token per elencare i bucket GCS..." curl -s -H "Authorization: Bearer ${ACCESS_TOKEN}" "https://storage.googleapis.com/storage/v1/b" | jq . echo "[+] Simulazione completa. Le azioni sopra dovrebbero aver prodotto un evento di audit GCPServiceAccountTokenAccess." -
Comandi di Pulizia:
# Non sono state effettuate modifiche persistenti; solo la rimozione delle variabili temporanee. unset TOKEN_RESPONSE ACCESS_TOKEN echo "[*] Pulizia completa."