APC Injection: Asynchronous Procedure Call (T1055.004)

L'iniezione tramite Asynchronous Procedure Call è una sottotecnica di Process Injection che consente a un avversario di eseguire codice arbitrario nello spazio di indirizzamento di un processo vittima, sfruttando la coda APC dei thread Windows. Questa tecnica ricade sotto due tattiche distinte: Defense Evasion (TA0005), poiché il codice malevolo si maschera all'interno di un processo legittimo eludendo i controlli di sicurezza, e Privilege Escalation (TA0004), perché l'esecuzione nel contesto di un processo con privilegi superiori può garantire all'attaccante un'escalation implicita.

Il meccanismo è elegante nella sua semplicità: un thread entra in stato alertable — ad esempio durante una chiamata a SleepEx, WaitForSingleObjectEx o SignalObjectAndWait — e a quel punto il sistema operativo esegue le funzioni accodate nella sua APC queue. L'attaccante deve soltanto ottenere un handle al thread bersaglio tramite API native come OpenThread, scrivere il payload in memoria e invocare QueueUserAPC o il suo equivalente a livello kernel NtQueueApcThread.

Esistono varianti notevoli. L'Early Bird injection crea un processo in stato sospeso, inietta il codice e lo esegue via APC prima ancora che il processo raggiunga il suo entry point, scavalcando gli hook degli antimalware. L'AtomBombing sfrutta la global atom table di Windows come canale per depositare shellcode prima di triggerarne l'esecuzione tramite APC. I dati mostrano un ecosistema maturo: 11 famiglie malware documentate, 1 gruppo APT e 1 mitigazione ufficiale confermano che questa tecnica è un pilastro consolidato dell'arsenale offensivo moderno.

Per simulare l'APC injection in laboratorio servono tre ingredienti: un processo bersaglio, un payload e le API native di Windows. Il flusso classico è lineare — allocazione di memoria nel processo remoto, scrittura del payload, accodamento dell'APC — ma le varianti Early Bird e AtomBombing aggiungono complessità interessante.

Flusso classico con QueueUserAPC. Il punto di partenza è creare o individuare un processo il cui thread entri in stato alertable. In C/C++ la sequenza operativa si riassume così: si apre un handle al thread vittima con OpenThread(THREAD_SET_CONTEXT, ...), si alloca memoria nel processo remoto tramite VirtualAllocEx con permessi PAGE_EXECUTE_READWRITE, si scrive il payload con WriteProcessMemory, e infine si accoda la funzione con QueueUserAPC puntando all'indirizzo allocato. In un red team engagement questo flusso si replica con diversi tool.

Con Cobalt Strike (a pagamento), il comando shinject permette di iniettare shellcode in un processo specificandone il PID. L'operatore può anche usare il modulo inject per migrare un beacon in un altro processo sfruttando internamente meccanismi APC-compatibili. Per un approccio più granulare e open source, SysWhispers (open source) genera stub assembly per le syscall native (NtQueueApcThread, NtAllocateVirtualMemory, NtWriteVirtualMemory), permettendo di bypassare gli hook userland degli EDR sulle API ntdll.dll.

Early Bird injection. La variante più insidiosa prevede la creazione di un processo sospeso tramite CreateProcess con il flag CREATE_SUSPENDED. A quel punto si scrive il payload nello spazio di memoria del processo appena nato e si accoda l'APC al thread primario con QueueUserAPC. Quando il thread viene ripreso con ResumeThread, il codice iniettato viene eseguito prima dell'entry point dell'applicazione. Questa tecnica è particolarmente efficace perché molti hook di sicurezza vengono installati durante l'inizializzazione del processo, e l'Early Bird li precede cronologicamente.

Per la fase di test, Process Hacker (open source) e API Monitor (gratuito) sono indispensabili per osservare le chiamate API in tempo reale e verificare che l'iniezione sia avvenuta correttamente. Sul fronte framework, Atomic Red Team (open source) include il test T1055.004 che automatizza la simulazione con comandi PowerShell pronti all'uso:

Invoke-AtomicTest T1055.004

Questo esegue uno scenario di APC injection predefinito, generando la telemetria necessaria per validare le detection. Per chi preferisce lavorare in C#, SharpSploit (open source) espone metodi per la process injection che possono essere adattati per sfruttare le APC queue.

Un punto critico: in laboratorio è fondamentale monitorare con Sysmon (gratuito) — EventCode 8 (CreateRemoteThread) e EventCode 10 (ProcessAccess) — per correlare l'iniezione con ciò che il SOC vedrebbe in produzione.

Vuoi diventare un Ethical Hacker ma non sai da dove iniziare?

Scarica la guida gratuita e segui il percorso corretto fin dal primo passo