Iscriviti al webinar gratuito del 12 Maggio per diventare Forensic Analyst! Scopri di più
Corso Ethical Hacker: accedi alla promozione fino al 30 Aprile! Scopri di più
Un mutex — abbreviazione di mutual exclusion — è un meccanismo di sincronizzazione che consente a un solo thread o processo alla volta di accedere a una risorsa condivisa. Gli avversari sfruttano questa primitiva del sistema operativo in modo creativo: creando un mutex di sistema con un nome univoco, il malware può verificare se la macchina è già compromessa ed evitare di eseguirsi in duplice copia. La tecnica rientra nella tattica Defense Evasion (TA0005), poiché un malware che non lascia istanze ridondanti genera meno rumore, meno anomalie nei processi e meno opportunità di detection per i difensori.
Su Windows la chiamata tipica è CreateMutexW(); su Linux e macOS il meccanismo si traduce in lock file acquisiti tramite flock() o lockf() su percorsi prevedibili come /var/run/ o /tmp/. Il nome del mutex può essere hardcoded — talvolta con valori curiosi o GUID statici — oppure generato dinamicamente a partire da identificativi della macchina, rendendo la correlazione tra campioni più complessa.
Con 15 famiglie software documentate e almeno 1 gruppo APT che la impiega, questa tecnica è trasversale a ransomware, stealer, backdoor e impianti di spionaggio. La mitigazione diretta è sconsigliata (classificata come Do Not Mitigate): tentare di bloccare la creazione di mutex potrebbe interferire con processi legittimi. Il focus difensivo si sposta quindi interamente su detection e risposta.
L'obiettivo di un esercizio red team su questa tecnica è dimostrare come un impianto possa usare un mutex per evitare multi-istanza e ridurre la propria impronta sul sistema. La simulazione è semplice da implementare e offre un ottimo pretesto per validare le capacità di detection del Blue Team.
Su Windows, il modo più diretto è un piccolo eseguibile C o uno script PowerShell che invoca le API native. Con PowerShell puoi sfruttare il tipo .NET System.Threading.Mutex per creare un mutex di sistema con nome arbitrario:
$mutex = New-Object System.Threading.Mutex($true, "Global\LoadUpOnGunsBringYourFriends", [ref]$false)
Se $false viene restituito nel terzo parametro, significa che il mutex esisteva già — il malware in produzione a quel punto terminerebbe. In laboratorio puoi stampare un messaggio e uscire, simulando il comportamento di Embargo, che usa esattamente quel nome hardcoded. Per simulare LockBit 3.0, che deriva il nome del mutex dall'hash del MachineGUID, puoi leggere il valore dal registro e calcolarne l'hash:
$guid = (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Cryptography").MachineGuid $hash = [System.BitConverter]::ToString((New-Object System.Security.Cryptography.SHA256Managed).ComputeHash([System.Text.Encoding]::UTF8.GetBytes($guid))).Replace("-","")
Usa poi $hash come nome del mutex. Questo esercizio dimostra al Blue Team la differenza tra mutex statici (facilmente rilevabili con firma) e dinamici (che richiedono analisi comportamentale).
Su Linux, la simulazione replica il meccanismo di BPFDoor. Crea uno script bash che tenta di acquisire un lock esclusivo su un file:
exec 200>/var/run/initd.lock flock -n 200 || exit 1
Il comando flock (open source, parte del pacchetto util-linux) tenta un lock non bloccante; se fallisce, lo script termina. Esegui due istanze in parallelo per verificare che la seconda esca immediatamente.
Su macOS puoi usare lo stesso approccio con flock oppure scrivere un piccolo programma Swift/C che utilizzi flock() su un file in /tmp/. Per il reporting, lo strumento Handle di Sysinternals (gratuito) su Windows permette di enumerare tutti i mutex aperti da un processo specifico:
handle.exe -a -p <PID>
Filtrando l'output per "Mutant" ottieni la lista dei mutex attivi. In alternativa, Process Explorer (gratuito, Sysinternals) mostra i mutex nella vista "Handles" del lower pane. Su Linux, il comando lslocks (open source, parte di util-linux) elenca tutti i lock attivi sul sistema, facilitando la verifica post-esercizio.
Scarica la guida gratuita e segui il percorso corretto fin dal primo passo