2015-01-17 8 views
11

Un modo popolare di nascondere i processi dall'utente è quello di dirottare la funzione iterate per la directory/proc. Questo può essere fatto nel modo seguente:Modulo kernel Linux: re-hijacking della funzione iterate del filesystem virtuale

struct file *filep = filp_open("/proc", O_RDONLY, 0)); 
filep->f_op->iterate = p // We swap the pointer with our hacked iterate 

Sto lavorando su un metodo di rilevazione, in cui vorrei ripristinare l'algoritmo iterativo originale (ammesso che è già stato dirottato). C'è un modo per trovare la funzione di iterazione originale che viene utilizzata per la directory/proc?

+1

È possibile utilizzare direttamente [proc_map_files_readdir] (http://lxr.free-electrons.com/source/fs/proc/base.c#L1841). Ovviamente, se l'autore dell'attacco ha accesso in scrittura al kernel, può anche cambiarlo. – zch

+0

@zch Potresti dirmi come posso accedere a questa funzione? Non è presente nel sysmap. – AlexSee

+0

Esatto, è una funzione statica, quindi non sono sicuro che questo simbolo sia presente nel kernel risultante. Puoi provare a montare il secondo 'procfs' e forse lì puoi rilevare alcuni semplici attacchi di questo tipo. – zch

risposta

1

È possibile provare un approccio euristico. L'indirizzo della funzione originale sarà nella stessa area generale delle altre funzioni proc, mentre l'indirizzo della funzione hijacker sarà notevolmente diverso. Quindi si analizza il codice macchina della funzione hijacker. La funzione del dirottatore dovrà diramarsi alla funzione originale prima che ritorni, in modo da esaminare tutte le istruzioni del ramo e controllare quale si adatta agli altri indirizzi originali.

0

Suppongo tu sappia quale versione del kernel stai usando?

Basta copiare quella versione della funzione nel modulo e sovrascrivere il puntatore iterare con l'indirizzo della copia.

Questo dovrebbe essere funzionalmente equivalente, anche se non si può dire quali altri mali potrebbero aver scatenato il modulo rouge.

+0

Ho paura che non sia così facile, quando copi la funzione testualmente ci sono ancora molte altre cose di cui questa funzione ha bisogno e che non può trovare in lo spazio degli indirizzi del modulo. Forse è in qualche modo possibile ma non sono riuscito a compilarlo. – AlexSee