李曉麗,李小紅(.南通大學現代教育技術中心,南通 6000;.武漢大學計算機學院,武漢 43007)
基于Hook機制的Linux文件訪問日志模塊研究
李曉麗1,李小紅2
(1.南通大學現代教育技術中心,南通226000;2.武漢大學計算機學院,武漢 430072)
Linux是一款免費的操作系統(tǒng),用戶可以通過網絡或其他途徑免費獲得,并可以任意修改其源代碼。因為它符合IEEE POSIX.1標準[1],移植性好,目前已被廣泛使用,很多大中型企業(yè)的應用服務都是構筑在其之上,例如Web服務、數據庫服務、集群服務等。但是,相比于Windows操作系統(tǒng),它的安全問題一直沒有得到很好的解決,基于此,本文在深入研究可加載內核模塊(Loadable Kernel Modules,LKM)基礎上,使用Hook技術,構建了一個文件訪問日志記錄模塊,如果入侵者通過某用戶賬戶進入服務器系統(tǒng)并嘗試修改文件,則會在相應文件目錄下生成一個含有相關信息的日志記錄,這樣系統(tǒng)就可以在第一時間定位該用戶。
在此基礎上,我們又設計了一個短信報警平臺,當系統(tǒng)文件被非法修改時,系統(tǒng)會通過移動網關向管理員發(fā)送短信告警信息,這樣管理員就可以盡早恢復文件,減少相應損失。
Linux是單內核的操作系統(tǒng)[2],即整個系統(tǒng)內核都運行于一個單獨的保護域中。相比于微內核的操作系統(tǒng),單內核由于把所有的系統(tǒng)功能模塊都集中到一起,系統(tǒng)的性能和速度都非常好,但是可擴展性和維護性就相對較差。為了彌補單內核的這個缺點,Linux操作系統(tǒng)使用可裝載內核模塊LKM機制[3],可以在運行時動態(tài)地更改Linux。
可動態(tài)更改是指允許內核在運行時動態(tài)地向其中插入或從中刪除代碼。這些代碼包括相關的子例程、數據、函數入口和函數出口被一并組合在一個單獨的二進制鏡像中,即所謂的可裝載內核模塊中,或被簡稱為模塊。這是一種區(qū)別于一般應用程序的系統(tǒng)級程序,它主要用于擴展Linux的內核功能。LKM的優(yōu)點是基本內核鏡像可以盡可能的小,可以最小化內核的內存占用,只加載需要的元素,可選的功能和驅動程序可以利用模塊形式再提供[9]。模塊允許我們方便的刪除和重新載入內核代碼,也方便了調試工作,無須重新編譯內核。而且當熱插拔新設備時,可通過命令載入新的驅動程序。
操作系統(tǒng)中的狀態(tài)分為內核態(tài)和用戶態(tài)。操作系統(tǒng)的主要功能是為管理硬件資源和為應用程序開發(fā)人員提供良好的環(huán)境來使應用程序具有更好的兼容性,為了達到這個目的,內核提供一系列具備預定功能的多內核函數,通過一組稱為系統(tǒng)調用(system call)的接口呈現給用戶。一般用戶程序只在用戶態(tài)下運行,有時需要訪問系統(tǒng)核心功能,這時通過系統(tǒng)調用接口進行系統(tǒng)調用[4]。系統(tǒng)調用把應用程序的請求傳給內核,調用相應的內核函數完成所需的處理,將處理結果返回給應用程序[5]。
換言之,系統(tǒng)調用即為用戶空間訪問內核的一種方式,其具體執(zhí)行過程如圖1所示[6]:
①在應用程序中調用用戶空間的庫函數;
②庫函數在執(zhí)行一系列預處理后,取得系統(tǒng)調用號,傳遞相應的參數并執(zhí)行軟中斷指令INT產生中斷;
③Linux系統(tǒng)進行地址空間的轉換和堆棧的切換,執(zhí)行SAVE_ALL宏定義,從而保存任務現場;
④根據系統(tǒng)調用號從系統(tǒng)調用表找到對應系統(tǒng)調用處理程序的入口地址;
⑤執(zhí)行系統(tǒng)調用對應的處理程序;
⑥執(zhí)行RESTORE_ALL宏定義,恢復系統(tǒng)調用前的任務現場并返回用戶模式。
圖1 系統(tǒng)調用過程示意圖
Hook(鉤子)是一種特殊的消息處理機制,鉤子可以監(jiān)視系統(tǒng)或進程中的各種事件消息,截獲發(fā)往目標窗口的消息并進行處理。這樣,我們就可以在系統(tǒng)中安裝自定義的鉤子,監(jiān)視系統(tǒng)中特定事件的發(fā)生,完成特定的功能,例如截獲鍵盤、鼠標的輸入,屏幕取詞,日志監(jiān)視等。
Hooking(掛鉤)實際上是一個處理消息的程序段,通過系統(tǒng)調用,把它掛入系統(tǒng)。每當特定的消息發(fā)出,在沒有到達目的窗口前,Hook函數就先捕獲該消息,亦即Hook函數先得到控制權。這時Hook函數即可以加工處理(改變)該消息,也可以不作處理而繼續(xù)傳遞該消息,還可以強制結束消息的傳遞。
圖2 內核Hooking原理示意圖
從圖2可以看出,Hook可用來擴展(或削弱)一個子程序的功能,它也可用來修改系統(tǒng)應用程序編程接口 (Application Programming Interface,API)的運行效果。
本文中我們利用 0x80中斷劫持 system_call-> sys_call_table進行系統(tǒng)調用進行Hook。
我們知道,要對系統(tǒng)調用(sys_call_table)進行替換,必須要獲取該地址后才可以進行替換。但是Linux 2.6版的內核出于安全的考慮沒有將系統(tǒng)調用列表基地址的符號sys_call_table導出,考慮到系統(tǒng)調用都是通過0x80中斷來進行的[10-11],故我們可以通過查找0x80中斷的處理程序來獲得sys_call_table的地址?;静襟E如下。
①獲取中斷描述符表 (Interrupt Descriptor Table,IDT)的地址;
②從中查找0x80中斷(系統(tǒng)調用中斷)的服務例程(8*0x80偏移);
③搜索該例程的內存空間;
④從其中獲取sys_call_table(保存所有系統(tǒng)調用例程的入口地址)的地址。
在Linux系統(tǒng)中一般存在多個用戶,為了保障系統(tǒng)安全,我們要監(jiān)視系統(tǒng)中的所有非法活動并將其記錄到系統(tǒng)日志中。基于Linux下“一切皆文件”的思想[7],任何入侵者進入系統(tǒng)后的所有動作都是針對文件的操作。因此,當入侵者通過某個用戶賬戶進入系統(tǒng)并嘗試修改文件時 (本文暫不考慮新增文件和刪除文件的情形),為了能夠在第一時間定位該用戶,我們在深入研究0x80中斷機制的基礎上,通過在Linux系統(tǒng)內核調用中增加文件訪問/修改記錄日志模塊的方法來實現上述功能[8]。
模塊分三個階段進行設計,其工作流程圖如圖3所示。
圖3 模塊工作流程圖
(1)安裝階段
在模塊安裝階段,我們首先對環(huán)境變量進行初始化,然后查找系統(tǒng)調用列表sys_call_table[]的基地址并記錄系統(tǒng)調用服務例程(如 sys_open,sys_close,sys_read,sys_write等)的入口地址,接著將sys_open函數的入口指針替換成我們自己的函數指針(my_sys_open)。
(2)操作階段
初始化完成后,這時會執(zhí)行我們自己的函數my_sys_open。我們知道,文件被打開的方式一般有以下三種模式:O_RDONLY/O_WRONLY/O_RDWR,根據這三種打開方式,my_sys_open函數會決定將生成的文件訪問日志記錄添加到read_log.txt中還是write_log.txt中。
當文件以O_WRONLY或O_RDWR方式被打開時,系統(tǒng)首先會對該文件進行拷貝以生成備份文件(名稱格式為BAK_文件名_系統(tǒng)時間,用于后期文件的恢復),然后會在write_log.txt日志文件中添加一條包含有用戶ID、當前系統(tǒng)時間以及原始文件名信息的記錄。例如原始文件名為“abc.txt”,當前系統(tǒng)時間為2014 年8月8日23點56分22秒,用戶的ID為001200,則生成的備份文件名為BAK_abc_20140808235622.txt,并在writelog.txt日志文件中生成以下記錄:001200#20140808235622#abc.txt。
當文件以O_RDONLY方式被打開時,則會在read_log.txt文件中添加如下記錄:001200#201408 08235622#abc.txt。
(3)模塊卸載階段
在移除文件訪問日志模塊時,需要將my_sys_open的地址和sys_open現在的地址進行對比,如果相同,則復位舊系統(tǒng)調用 (使用sys_open的原始地址來替代現在的sys_open地址)。如果兩個地址不同,則表明系統(tǒng)調用列表的完整性已遭到破壞,內核處于不穩(wěn)定狀態(tài),此時會給用戶發(fā)出相關信息告警。
(1)模塊的初始化函數init_module()
//查找sys_call_table[]的基地址
(2)監(jiān)控函數my_sys_open()
//如果文件以只讀或可讀寫方式被打開
當非法用戶進入系統(tǒng)并嘗試修改文件時,必須在第一時間通知到管理員,因此,我們又設計了一個短信報警平臺,當writelog.txt文件發(fā)生變化時,系統(tǒng)會通過中國移動MAS發(fā)送告警短信給管理員的手機,管理員及時對文件進行恢復,盡可能減少損失。
短信報警平臺主要包括三個模塊:狀態(tài)采集模塊、分析模塊以及短信發(fā)送模塊。狀態(tài)采集模塊定時讀取writelog.txt文件狀態(tài)信息,分析模塊將當前文件狀態(tài)跟前一時間節(jié)點的文件狀態(tài)進行對比分析,如發(fā)生改變則觸發(fā)短信發(fā)送模塊。
//以下是函數聲明
//該函數的第一個參數是短信服務器部署的 IP地址,第二個參數是端口號
//該函數中phone:手機號碼的數組,n:手機號碼的數量,msg:要發(fā)送的消息
//下面是關鍵代碼
短信報警平臺的發(fā)送界面設計如圖4所示。
圖4 短信發(fā)送界面
可以給多人(分組)發(fā)送報警短信,可以定時發(fā)送信息,也可以當觸發(fā)條件滿足時立即發(fā)送短信。
我們的測試環(huán)境如下:
●軟件平臺:
操作系統(tǒng):RedHat 4.1.2-44
Linux內核版本:2.6.18-128.el5PAE
●硬件平臺:
CPU:16 Intel Xeon CPU E7430@2.13GHz
內存:32G
硬盤:600G
所測試的文件大小為2M,路徑深度為2。
主要測試對服務請求 (如open、close、read、write、create、link等)的系統(tǒng)處理時間,通過對系統(tǒng)加載模塊前后同一種操作請求處理的響應時間值進行比較,得到的測試結果如下:
表1 幾種典型系統(tǒng)調用的處理時間對比
由測試結果可知,加載模塊后不同系統(tǒng)調用的系統(tǒng)響應時間均稍有增加,但小于20%,屬于可容忍范圍。
Linux是服務器操作系統(tǒng)中最常用的操作系統(tǒng),因為其擁有高性能、高擴展性、高安全性,受到了越來越多人的追捧。但是針對Linux服務器操作系統(tǒng)的安全事件也非常多。本文在深入研究LKM和Hook技術的基礎上,設計了一個能夠在非法用戶訪問或修改文件時自動生成日志記錄信息模塊,該模塊適用于監(jiān)管長期穩(wěn)定運行、配置較少需要改動的Linux服務器系統(tǒng),在上述工作的基礎上又設計了一個短信報警平臺,當write_log.txt日志文件發(fā)生改變時,可以通過移動網關第一時間發(fā)送報警信息到管理人員的移動終端上。后期我們將繼續(xù)改進我們的模塊,增加對新增文件和刪除文件的監(jiān)控功能,此外,會進一步優(yōu)化我們的設計,以提高系統(tǒng)的性能。
[1]Bovet D P,Cesati M.Understanding the Linux kernel[M].O'Reilly Media,Inc.,2005.
[2]Hildebrand D.An Architectural overview of QNX[C].USENIX Workshop on Microkernels and Other Kernel Architectures.1992:113-126.
[3]Degoyeneche J M,Desousa E A F.Loadable Kernel Modules[J].IEEE Software,1998,15(1):65-71.
[4]羅宇,鄒鵬,鄧勝蘭.操作系統(tǒng)[M].電子工業(yè)出版社,2011.
[5]張麗芬,劉美華.操作系統(tǒng)原理教程[M].電子工業(yè)出版社,2013.
[6]吳國偉,李瑩,姚琳.Linux內核分析與高級教程[M].清華大學出版社,2012.
[7]Parker S.Shell Scripting:Expert Recipes for Linux,Bash and more[M].John Wiley&Sons,2011.
[8]Pratik A.Linux Kernel Module for Security Enhancement[M].ProQuest,2007.
[9]Corbet J,Rubini A,Kroah-Hartman G.Linux device drivers[M].O'Reilly Media,Inc.,2005.
[10]Rajagopalan M,Hiltunen M,Jim T,et al.System call monitoring using authenticated system calls[J].Dependable and Secure Computing,IEEE Transactions on,2006,3(3):216-229.
[11]Matthew N,Stones R.Beginning linux programming[M].John Wiley&Sons,2011.
Hook Function;Security Module;System Call;SMS Alarm
Research on Log Module of Linux File Access Based on Hook Mechanism
LI Xiao-li1,LI Xiao-hong2
(1.Modern Education Technology Center,Nantong University,Nantong 226000;2.College of Computer Science,Wuhan University,Wuhan 430072)
國家自然科學基金資助項目(No.61373169)、南通大學自然科學基金資助項目(No.12Z057、No.12Z042)
1007-1423(2015)30-0059-06
10.3969/j.issn.1007-1423.2015.30.017
2015-09-15
2015-09-30
針對目前Linux系統(tǒng)安全審計方面的不足,設計一個文件訪問日志記錄模塊,當入侵者通過某用戶賬戶進入Linux服務器系統(tǒng)并嘗試修改文件時,系統(tǒng)會自動生成包含用戶信息的日志記錄文件,通過該日志文件,可以定位該用戶。實驗測試結果表明我們的模塊是可行的,可以用于系統(tǒng)文件訪問的安全審計。在此基礎上進一步設計一個短信報警平臺,當日志記錄文件發(fā)生變化時,可以第一時間給管理員發(fā)送短信以挽回損失。
鉤子函數;安全模塊;系統(tǒng)調用;短信報警
李曉麗,碩士,高級實驗師,研究方向為信息安全
李小紅,博士,副教授,主要研究方向為算法與設計
In view of the current problems of Linux system security audit,designs a file access logging module.When an intruder enters the Linux server system through a user account and tries to modify the file,the system will generate a log file containing the user's information automatically.Through the log file,we can locate the user.Experimental results show that our module is feasible.It can be used for security audit of system file access.On this basis,designs a SMS alarm platform.When the log file is changed,the system will send a message to the administrator and recover the loss in the first time.