閱讀linux的源碼時础嫡,看到在task_struct
中使用了randomized_struct_fields_start
這個宏,也就是使用了結構混淆這一特性。原文可見郵件列表戚炫。
大意就是阿逃,一個struct的內部數(shù)據(jù)存儲是按照聲明順序的瓦胎,因此黑客程序可以很容易得計算出一個關鍵值根蟹,比如跳轉函數(shù)地址在內核一些結構體中的偏移嘁扼。修改該偏移的值以后,就可以輕松控制內核執(zhí)行自己的代碼(內核態(tài))馋袜。
所以我們可以使用gcc的一個plugin所提供的特性(插件來自于Grsecurity)男旗,進行結構體的混淆。在編譯的時候欣鳖,結構體的數(shù)據(jù)存放不會按照聲明順序察皇,而是根據(jù)函數(shù)名以及隨機種子,打亂存儲順序观堂。
假設:
struct critical_struct {
int id;
void (* fn) (void *data);
void *data;
...
};
有這么一段內核源碼让网,如果駭客程序獲得了對應數(shù)據(jù)段的寫權限,那么他可以($STRUCT_OFFSET + 0x04)师痕,也就是fn
的函數(shù)地址修改為自己的代碼地址,進而獲得內核態(tài)的執(zhí)行權限而账。如果混淆以后胰坟,就為這種侵入過程制造了難度。