Evasione del Debugger: Debugger Evasion (T1622)
La tecnica T1622 – Debugger Evasion raccoglie l'insieme di stratagemmi con cui un malware verifica la presenza di un debugger attivo e modifica il proprio comportamento per sfuggire all'analisi dinamica. È mappata su due tattiche MITRE ATT&CK: TA0005 (Defense Evasion), perché consente al codice di occultare le funzioni core quando è sotto osservazione, e TA0007 (Discovery), dato che le stesse verifiche fungono da ricognizione ambientale per adattare i payload successivi.
Sul piano tecnico, le implementazioni più diffuse su Windows sfruttano API native come IsDebuggerPresent(), CheckRemoteDebuggerPresent() e NtQueryInformationProcess() con la classe ProcessDebugPort, oppure la lettura diretta del flag BeingDebugged nel Process Environment Block. Su Linux la verifica passa dal campo TracerPID di /proc/self/status, mentre su macOS si ricorre a sysctl con controllo su P_TRACED e all'invocazione di ptrace con la flag PTRACE_DENY_ATTACH.
L'impatto operativo è significativo: nei dati MITRE la tecnica è associata a 21 famiglie di malware e a gruppi APT come Mustang Panda, oltre a comparire nella campagna Operation Dream Job attribuita a Lazarus Group. Nell'ecosistema criminale la troviamo tanto in loader commodity (Bumblebee, DarkGate, AsyncRAT) quanto in ransomware di alto profilo come Black Basta e LockBit 3.0, a conferma che è diventata uno standard difensivo del malware moderno.
Per un red teamer, simulare T1622 in laboratorio significa costruire loader di test che replichino le stesse verifiche viste in campo, senza mai eseguirle su asset di produzione. L'ambiente minimo prevede una VM Windows con Visual Studio, WinDbg (gratuito, incluso nel Windows SDK) e x64dbg (open source) per validare gli inneschi.
Il controllo più elementare è la chiamata a IsDebuggerPresent(), che legge il flag BeingDebugged del PEB. Un'implementazione equivalente e più stealth accede direttamente al PEB senza passare dall'API: in x86 tramite il segmento FS:[0x30], in x64 tramite GS:[0x60], leggendo poi il byte all'offset 2. Questa variante evita gli hook classici che i sandbox pongono sull'API documentata. Un livello ulteriore usa NtQueryInformationProcess con ProcessDebugPort (classe 7) o ProcessDebugObjectHandle (classe 30), tecnica adottata da XLoader secondo i dati MITRE.
Su Linux la simulazione più didattica è la lettura di /proc/self/status alla ricerca di TracerPID: se il valore è diverso da zero, il processo è sotto strace o gdb. Un'implementazione robusta chiama ptrace(PTRACE_TRACEME, 0, 0, 0): se un debugger è già attaccato, la syscall fallisce con EPERM. Su macOS la controparte è ThiefQuest, che invoca sysctl con KERN_PROC/KERN_PROC_PID e controlla il bit P_TRACED nella struttura kinfo_proc, oltre a chiamare ptrace(PT_DENY_ATTACH).
Per la catena d'attacco realistica conviene concatenare più tecniche: prima un timing check basato su rdtsc per rilevare rallentamenti (un debugger single-step introduce latenze misurabili), poi enumerazione degli hardware breakpoint leggendo i registri DR0-DR3 via GetThreadContext con CONTEXT_DEBUG_REGISTERS, infine un handler SEH che lancia deliberatamente un'eccezione INT 3 (opcode 0xCC): se il debugger la assorbe, il flusso non raggiunge l'handler e il malware sa di essere osservato.
Come tool di studio, il repository al-khaser (open source) implementa decine di controlli anti-debug catalogati; PafishMacro (open source) copre lo scenario Office. Per la parte offensiva-difensiva, ScyllaHide (open source) è il plugin di riferimento per x64dbg che neutralizza queste verifiche, utile per validare che la propria detection resista quando l'analista aggira le trappole. Documentare ogni catena in un report con hash SHA-256 dei binari di test è essenziale per il tracciamento in engagement.
Vuoi diventare un Ethical Hacker ma non sai da dove iniziare?
Accedi alle lezioni gratuite e segui il percorso corretto fin dal primo passo