Iniezione APC: Asynchronous Procedure Call (T1055.004)
L'iniezione tramite Asynchronous Procedure Call rappresenta una delle varianti più eleganti e insidiose del process injection su Windows. La tecnica sfrutta il meccanismo APC del kernel NT, pensato per l'esecuzione asincrona di funzioni all'interno del contesto di un thread, per veicolare codice arbitrario dentro processi legittimi già in esecuzione.
Catalogata come T1055.004 nel framework MITRE ATT&CK, la tecnica copre due tattiche fondamentali: TA0004 Privilege Escalation, perché consente di ereditare il livello di privilegio del processo target, e TA0005 Defense Evasion, dato che il codice malevolo viene eseguito sotto l'ombrello di un binario firmato e trusted come svchost.exe o explorer.exe.
L'attaccante ottiene un handle al thread vittima tramite OpenThread, quindi accoda una funzione arbitraria con QueueUserAPC o la variante nativa NtQueueApcThread. Quando il thread entra in stato alertable, la funzione viene eseguita — tipicamente un LoadLibraryA che punta a una DLL malevola. Le varianti più raffinate, come Early Bird injection (usata da TURNEDUP) e AtomBombing, anticipano l'esecuzione prima ancora che le protezioni anti-malware installino i propri hook.
I dati MITRE tracciano 11 famiglie malware che implementano questa tecnica e un gruppo APT documentato (FIN8), con presenza rilevante nel panorama del crimeware bancario e del retail malware.
Dal punto di vista offensivo, l'APC injection richiede una comprensione solida delle API Windows di gestione thread e memoria. La catena canonica si articola in cinque chiamate: OpenProcess con PROCESS_VM_OPERATION|PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, VirtualAllocEx per riservare memoria RWX nel target, WriteProcessMemory per copiare shellcode o path DLL, OpenThread con THREAD_SET_CONTEXT su un TID valido, e infine QueueUserAPC passando il puntatore alla funzione da eseguire.
Per un red team lab, il framework Cobalt Strike (a pagamento) implementa APC injection nativamente tramite il comando inject
Per chi vuole studiare la tecnica a basso livello, il progetto Process Injection Techniques di plackyhacker su GitHub (open source) contiene una PoC minimale in C che dimostra il pattern NtQueueApcThread verso un processo notepad.exe target. La compilazione richiede il Windows SDK e link a ntdll.lib.
Una variante interessante da provare in laboratorio è Early Bird: si crea un processo suspended con CreateProcessA passando CREATE_SUSPENDED, si scrive lo shellcode nel processo child, si accoda l'APC sul thread principale ancora sospeso e infine si chiama ResumeThread. L'esecuzione avviene prima che ntdll!LdrInitializeThunk completi l'inizializzazione, bypassando molti userland hook AV/EDR.
Per testare la resilienza dei controlli difensivi, il framework Atomic Red Team (open source) espone il test T1055.004 che replica il pattern con un binario di test. Il comando indicativo è:
Invoke-AtomicTest T1055.004
lanciato dalla PowerShell con il modulo invoke-atomicredteam importato.
Per sviluppare custom loader, il tool Donut (open source) genera shellcode position-independent da assembly .NET, PE o script, adatto a essere iniettato via APC. La sintassi base è:
donut.exe -a 2 -f 1 payload.exe -o shellcode.bin
Infine, per l'analisi dinamica delle proprie PoC, API Monitor v2 (gratuito) di rohitab permette di tracciare in tempo reale le chiamate NtQueueApcThread e ZwAlertResumeThread, verificando che la sequenza sia corretta prima di misurare la detection lato blue team.
Vuoi diventare un Ethical Hacker ma non sai da dove iniziare?
Accedi alle lezioni gratuite e segui il percorso corretto fin dal primo passo