李曉麗
(南通大學(xué),江蘇 南通 226000)
基于LKM機制的Linux安全模塊的研究
李曉麗
(南通大學(xué),江蘇 南通 226000)
近年來,Linux系統(tǒng)由于其出色的穩(wěn)定性、靈活性和可擴展性,以及較低廉的成本,受到計算機工業(yè)界的廣泛關(guān)注和應(yīng)用。但在安全性方面,Linux內(nèi)核只提供了自主訪問控制以及部分安全機制,這對于Linux系統(tǒng)的安全性是不夠的,影響了Linux系統(tǒng)的進一步發(fā)展和更廣泛的應(yīng)用。文中在深入研究LKM和HOOK技術(shù)的基礎(chǔ)上,針對目前Linux系統(tǒng)安全審計方面的不足,設(shè)計了一個Linux安全日志模塊。當(dāng)入侵者通過某用戶賬戶進入Linux服務(wù)器系統(tǒng)并嘗試修改文件時,系統(tǒng)會自動生成包含用戶信息的日志記錄文件。該模塊適用于監(jiān)管長期穩(wěn)定運行、配置較少需要改動的Linux服務(wù)器系統(tǒng)。經(jīng)系統(tǒng)實測,該安全日志模塊能及時有效地記錄惡意用戶對系統(tǒng)文件的訪問或篡改,為系統(tǒng)的安全審計工作提供有用信息。
可裝載內(nèi)核模塊;鉤子函數(shù);安全模塊;系統(tǒng)調(diào)用;短信報警
Linux是一款免費的操作系統(tǒng),用戶可以通過網(wǎng)絡(luò)或其他途徑免費獲得,并可以任意修改其源代碼。因為它符合IEEE POSIX.1標(biāo)準(zhǔn)[1],移植性好,目前已被廣泛使用,很多大中型企業(yè)的應(yīng)用服務(wù)都是構(gòu)筑在其之上,例如Web服務(wù)、數(shù)據(jù)庫服務(wù)、集群服務(wù)等等。但是,相比于Windows操作系統(tǒng),它的安全問題一直沒有得到很好的解決?;诖?,文中在深入研究可加載內(nèi)核模塊(Loadable Kernel Modules,LKM)的基礎(chǔ)上,使用HOOK技術(shù),構(gòu)建了一個文件訪問日志記錄模塊[2-3]。如果入侵者通過某用戶賬戶進入服務(wù)器系統(tǒng)并嘗試修改文件,則會在相應(yīng)文件目錄下生成一個含有相關(guān)信息的日志記錄,這樣系統(tǒng)就可以在第一時間定位該用戶。
Linux是單內(nèi)核的操作系統(tǒng)[4],即整個系統(tǒng)內(nèi)核都運行于一個單獨的保護域中。相比于微內(nèi)核的操作系統(tǒng),單內(nèi)核由于把所有的系統(tǒng)功能模塊都集中到一起,系統(tǒng)的性能和速度都非常好,但是可擴展性和維護性就相對較差。為了彌補單內(nèi)核的這個缺點,Linux操作系統(tǒng)使用LKM機制[5-6],可以在運行時動態(tài)地更改Linux。
可動態(tài)更改是指允許內(nèi)核在運行時動態(tài)地向其中插入或從中刪除代碼。這些代碼包括相關(guān)的子例程、數(shù)據(jù)、函數(shù)入口和函數(shù)出口,被一并組合在一個單獨的二進制鏡像中,即所謂的可裝載內(nèi)核模塊中,或被簡稱為模塊。這是一種區(qū)別于一般應(yīng)用程序的系統(tǒng)級程序,它主要用于擴展Linux的內(nèi)核功能。LKM的優(yōu)點是基本內(nèi)核鏡像可以盡可能小,可以最小化內(nèi)核的內(nèi)存占用,只加載需要的元素,可選的功能和驅(qū)動程序可以利用模塊形式再提供[7]。模塊允許用戶方便地刪除和重新載入內(nèi)核代碼,也方便了調(diào)試工作,無須重新編譯內(nèi)核。而且當(dāng)熱插拔新設(shè)備時,可通過命令載入新的驅(qū)動程序。
2.1 系統(tǒng)調(diào)用
操作系統(tǒng)中的狀態(tài)分為內(nèi)核態(tài)和用戶態(tài)。操作系統(tǒng)的主要功能是為管理硬件資源和為應(yīng)用程序開發(fā)人員提供良好的環(huán)境來使應(yīng)用程序具有更好的兼容性。為了達到這個目的,內(nèi)核提供一系列具備預(yù)定功能的多內(nèi)核函數(shù),通過一組稱為系統(tǒng)調(diào)用(system call)的接口呈現(xiàn)給用戶。一般用戶程序只在用戶態(tài)下運行,有時需要訪問系統(tǒng)核心功能,這時通過系統(tǒng)調(diào)用接口進行系統(tǒng)調(diào)用[8-9]。系統(tǒng)調(diào)用把應(yīng)用程序的請求傳給內(nèi)核,調(diào)用相應(yīng)的內(nèi)核函數(shù)完成所需的處理,將處理結(jié)果返回給應(yīng)用程序[10]。
換言之,系統(tǒng)調(diào)用即為用戶空間訪問內(nèi)核的一種方式,其具體執(zhí)行過程如圖1所示[11]。
圖1 系統(tǒng)調(diào)用過程示意圖
(1)在應(yīng)用程序中調(diào)用用戶空間的庫函數(shù);
(2)庫函數(shù)在執(zhí)行一系列預(yù)處理后,取得系統(tǒng)調(diào)用號,傳遞相應(yīng)的參數(shù)并執(zhí)行軟中斷指令I(lǐng)NT產(chǎn)生中斷;
(3)Linux系統(tǒng)進行地址空間的轉(zhuǎn)換和堆棧的切換,執(zhí)行SAVE_ALL宏定義,從而保存任務(wù)現(xiàn)場;
(4)根據(jù)系統(tǒng)調(diào)用號,從系統(tǒng)調(diào)用表找到對應(yīng)系統(tǒng)調(diào)用處理程序的入口地址;
(5)執(zhí)行系統(tǒng)調(diào)用對應(yīng)的處理程序;
(6)執(zhí)行RESTORE_ALL宏定義,恢復(fù)系統(tǒng)調(diào)用前的任務(wù)現(xiàn)場并返回用戶模式。
2.2 HOOK
HOOK(鉤子)是一種特殊的消息處理機制。鉤子可以監(jiān)視系統(tǒng)或進程中的各種事件消息,截獲發(fā)往目標(biāo)窗口的消息并進行處理。這樣,用戶就可以在系統(tǒng)中安裝自定義的鉤子,監(jiān)視系統(tǒng)中特定事件的發(fā)生,完成特定的功能,比如截獲鍵盤、鼠標(biāo)的輸入,屏幕取詞,日志監(jiān)視,等等。
HOOKING(掛鉤)實際上是一個處理消息的程序段,通過系統(tǒng)調(diào)用,把它掛入系統(tǒng)。每當(dāng)特定的消息發(fā)出,在沒有到達目的窗口前,HOOK函數(shù)就先捕獲該消息,亦即HOOK函數(shù)先得到控制權(quán)。這時HOOK函數(shù)既可以加工處理(改變)該消息,也可以不作處理而繼續(xù)傳遞該消息,還可以強制結(jié)束消息的傳遞。
內(nèi)核HOOKING原理如圖2所示。
圖2 內(nèi)核HOOKING原理示意圖
從圖2可以看出,HOOK可用來擴展(或削弱)一個子程序的功能,也可用來修改系統(tǒng)應(yīng)用程序編程接口(Application Programming Interface,API)的運行效果。
2.3 Linux系統(tǒng)調(diào)用HOOK相關(guān)技術(shù)
Linux系統(tǒng)調(diào)用所使用的HOOK技術(shù)主要有如下幾種:
1)Kernel Inline Hook。
目前流行和成熟的Kernel Inline Hook技術(shù)就是修改內(nèi)核函數(shù)的opcode,通過寫入jmp或push ret等指令跳轉(zhuǎn)到新的內(nèi)核函數(shù)中,從而達到修改或過濾的功能。具體過程參見圖3。
圖3 Kernel Inline Hook流程圖
2)利用0x80中斷劫持。
要對系統(tǒng)調(diào)用(sys_call_table)進行替換,必須要獲取該地址后才可以進行替換。但是Linux 2.6版的內(nèi)核出于安全的考慮,沒有將系統(tǒng)調(diào)用列表基地址的符號sys_call_table導(dǎo)出??紤]到系統(tǒng)調(diào)用都是通過0x80中斷來進行的[12-13],故通過查找0x80中斷的處理程序來獲得sys_call_table的地址。其基本步驟如下:
(1)獲取中斷描述符表(Interrupt Descriptor Table,IDT)的地址;
(2)從中查找0x80中斷(系統(tǒng)調(diào)用中斷)的服務(wù)例程(8*0x80偏移);
(3)搜索該例程的內(nèi)存空間;
(4)從中獲取sys_call_table(保存所有系統(tǒng)調(diào)用例程的入口地址)的地址。
3)利用kprobe機制。
kprobe是一個動態(tài)地收集調(diào)試和性能信息的工具。它從Dprobe項目派生而來,幾乎可以跟蹤任何函數(shù)或被執(zhí)行的指令以及一些異步事件。
4)LSM Security鉤子技術(shù)。
Linux安全模塊(Linux Security Module,LSM)是Linux內(nèi)核的一個輕量級通用訪問控制框架。它使得各種不同的安全訪問控制模型能夠以Linux可加載內(nèi)核模塊的形式實現(xiàn)出來。用戶可以根據(jù)其需求選擇適合的安全模塊加載到Linux內(nèi)核中,從而大大提高了Linux安全訪問控制機制的靈活性和易用性。
目前已有很多著名的增強訪問控制系統(tǒng)移植到LSM上實現(xiàn),包括:POSIX.1e capabilities,安全增強Linux(SELinux),域和類型增強(the Domain and Type Enhancement,DTE),Linux入侵檢測系統(tǒng)(Linux Intrusion Detection System,LIDS)。
在Linux系統(tǒng)中,一般存在多個用戶。為了保障系統(tǒng)安全,要監(jiān)視系統(tǒng)中的所有非法活動并將其記錄到系統(tǒng)日志中。基于Linux下“一切皆文件”的思想[14],任何入侵者進入系統(tǒng)后的所有動作都是針對文件的操作。因此,當(dāng)入侵者通過某個用戶賬戶進入系統(tǒng)并嘗試修改文件時(文中暫不考慮新增文件和刪除文件的情形),為了能夠在第一時間定位該用戶,在深入研究0x80中斷機制的基礎(chǔ)上,通過在Linux系統(tǒng)內(nèi)核調(diào)用中增加文件訪問/修改記錄日志模塊的方法來實現(xiàn)上述功能[15]。
模塊分三個階段進行設(shè)計,其工作流程圖如圖4所示。
(1)安裝階段。
在模塊安裝階段,首先對環(huán)境變量進行初始化,然后查找系統(tǒng)調(diào)用列表sys_call_table[]的基地址并記錄系統(tǒng)調(diào)用服務(wù)例程(如sys_open,sys_close,sys_read,sys_write等)的入口地址,接著將sys_open函數(shù)的入口指針替換成函數(shù)指針(my_sys_open)。
(2)操作階段。
初始化完成后,這時會執(zhí)行函數(shù)my_sys_open。通常,文件被打開的方式一般有以下三種模式:O_RDONLY/O_WRONLY/O_RDWR。根據(jù)這三種打開方式,my_sys_open函數(shù)會決定將生成的文件訪問日志記錄添加到read_log.txt中還是write_log.txt中。
當(dāng)文件以O(shè)_WRONLY或O_RDWR方式打開時,系統(tǒng)首先會對該文件進行拷貝以生成備份文件(名稱格式為BAK_文件名_系統(tǒng)時間,用于后期文件的恢復(fù)),然后會在write_log.txt日志文件中添加一條包含有用戶ID、當(dāng)前系統(tǒng)時間以及原始文件名信息的記錄。例如,原始文件名為“abc.txt”,當(dāng)前系統(tǒng)時間為2014年8月8日23點56分22秒,用戶的ID為001200,則生成的備份文件名為BAK_abc_20140808235622.txt,并在writelog.txt日志文件中生成以下記錄:001200#20140808235622# abc.txt。
當(dāng)文件以O(shè)_RDONLY方式打開時,則會在read_log.txt文件中添加如下記錄:001200# 20140808235622# abc.txt。
(3)模塊卸載階段。
在移除文件訪問日志模塊時,需要將my_sys_open的地址和sys_open現(xiàn)在的地址進行對比。如果相同,則復(fù)位舊系統(tǒng)調(diào)用(使用sys_open的原始地址來替代現(xiàn)在的sys_open地址);如果兩個地址不同,則表明系統(tǒng)調(diào)用列表的完整性已遭到破壞,內(nèi)核處于不穩(wěn)定狀態(tài),此時會給用戶發(fā)出相關(guān)信息告警。
(1)模塊的初始化函數(shù)init_module()。
// 查找sys_call_table[]的基地址
find_sys_call_table();
//記錄系統(tǒng)調(diào)用服務(wù)例程的原始地址
original_open=(void*)sys_call_table[_NR_open];
original_write=(void*)sys_call_table[_NR_write];
original_close=(void*)sys_call_table[_NR_close];
original_read=(void*)sys_call_table[_NR_read];
//用系統(tǒng)調(diào)用函數(shù)my_sys_open替代sys_open
sys_call_table[_NR_open]=(void*)my_sys_open;
(2)監(jiān)控函數(shù)my_sys_open()。
// 如果文件以只讀或可讀寫方式打開
if(flags==(O_WRONLY | O_RDWR))
{
backup_file(filename, flags, mode); //生成備份文件
print_id(USER_ID);
strcpy(timelog, USER_ID);
print_time(USER_TIME);
strcat(timelog, USER_TIME);
strcat(timelog, filelog);
//將用戶ID、系統(tǒng)時間、文件名記錄到write_log.txt中
Write_file( “write_log.txt”, timelog);
}
//如果文件以只讀方式打開
else
{
print_id(USER_ID);
strcpy(timelog, USER_ID);
print_time(USER_TIME);
strcat(timelog, USER_TIME);
strcat(timelog, filelog);
// 將用戶ID、系統(tǒng)時間、文件名記錄到read_log.txt中
write_file(“read_log.txt”, timelog);
}
returnoriginal_open(filename, flags, mode);
(3)模塊的卸載函數(shù)cleanup_module()。
if(sys_call_table[_NR_open]!=(void*)my_sys_open)
{
printk(KERN_ALERT “The system is in an unstable state! ”);
}
else
{
sys_call_table[_NR_open]=(void*)original_open;
}
Linux是服務(wù)器操作系統(tǒng)中最常用的,因為其擁有高性能、高擴展性、高安全性,受到了越來越多人的追捧;但是針對Linux服務(wù)器操作系統(tǒng)的安全事件也非常多。文中在深入研究LKM和HOOK技術(shù)的基礎(chǔ)上,設(shè)計了一個能夠在非法用戶訪問或修改文件時自動生成日志記錄的信息模塊。該模塊適用于監(jiān)管長期穩(wěn)定運行、配置較少需要改動的Linux服務(wù)器系統(tǒng)。經(jīng)系統(tǒng)實測,該安全日志模塊能及時有效地記錄惡意用戶對系統(tǒng)文件的訪問或篡改,為系統(tǒng)的安全審計工作提供有用信息。
接下來的工作是在上述研究基礎(chǔ)上,再設(shè)計一個短信報警模塊。當(dāng)write_log.txt日志文件發(fā)生改變時,可以通過移動網(wǎng)關(guān)第一時間發(fā)送報警信息到管理人員的移動終端上。另外還需繼續(xù)改進模塊,增加對新增文件和刪除文件的監(jiān)控功能,并進一步優(yōu)化設(shè)計,提高系統(tǒng)性能。
[1] Bovet D P,Cesati M.Understanding the Linux kernel[M].[s.l.]:O’Reilly Media,Inc., 2005.
[2] 吳 嫻,錢培德.基于LSM框架構(gòu)建Linux安全模塊[J].計算機工程與設(shè)計,2008,29(24):6281-6284.
[3] 張 浩,劉乃琦.Linux安全模塊框架的研究和安全日志的實現(xiàn)[J].計算機應(yīng)用研究,2006,23(6):135-137.
[4] Hildebrand D.An architectural overview of QNX[C]//Proc of USENIX workshop on microkernels and other kernel architectures.[s.l.]:USENIX,1992:113-126.
[5] Degoyeneche J M,Desousa E A F.Loadable kernel modules[J].IEEE Software,1998,15(1):65-71.
[6] 徐 敏,熊盛武.Linux 2.6內(nèi)核下LKM安全性研究[J].電子設(shè)計工程,2011,19(12):21-24.
[7] Corbet J,Rubini A,Kroah-Hartman G.Linux device drivers[M].[s.l.]:O’Reilly Media,Inc.,2005.
[8] 羅 宇,鄒 鵬,鄧勝蘭.操作系統(tǒng)[M].北京:電子工業(yè)出版社,2011.
[9] 李云雪,蘇智睿,王曉斌.基于Linux安全模塊的通用框架研究與實現(xiàn)[J].計算機工程,2005,31(3):105-107.
[10] 張麗芬,劉美華.操作系統(tǒng)原理教程[M].北京:電子工業(yè)出版社,2013.
[11] 吳國偉,李 瑩,姚 琳.Linux內(nèi)核分析與高級教程[M].北京:清華大學(xué)出版社,2012.
[12] Rajagopalan M,Hiltunen M,Jim T,et al.System call monitoring using authenticated system calls[J].IEEE Transactions on Dependable and Secure Computing,2006,3(3):216-229.
[13] Matthew N,Stones R.Beginning Linux programming[M].[s.l.]:John Wiley & Sons,2011.
[14] Parker S.Shell scripting:expert recipes for Linux,Bash and more[M].[s.l.]:John Wiley & Sons,2011.
[15] Pratik A.Linux kernel module for security enhancement[M].[s.l.]:ProQuest,2007.
Research on Linux Security Module Based on LKM Mechanism
LI Xiao-li
(Nantong University,Nantong 226000,China)
In recent years,the Linux system has been widely concerned and applied in the computer industry because of its excellent stability,flexibility and scalability,and low cost.But in terms of security,the Linux kernel only provides access control as well as some security mechanisms.This is not enough for the security of the Linux system,which affects the further development of the Linux system and its wider application.In view of the current problems on security auditing of Linux system,a Linux security log module is designed in this paper on the basis of the research of LKM and HOOK technology.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.The module is suitable for monitoring the long-term stable operation of the Linux server system,whose configuration is less need to change.By the actual measurement,the security log module can record the user’s access or tampering with the system file in time and effectively,and provide useful information for the security auditing of the system.
LKM;hook function;security module;system call;SMS alarm
2015-08-08
2015-11-12
時間:2016-05-05
國家自然科學(xué)基金資助項目(61373169);南通大學(xué)自然科學(xué)基金資助項目(12Z057,13Z040)
李曉麗(1977-),女,碩士研究生,高級實驗師,CCF會員,研究方向為信息安全。
http://www.cnki.net/kcms/detail/61.1450.TP.20160505.0828.068.html
TP309
A
1673-629X(2016)06-0097-04
10.3969/j.issn.1673-629X.2016.06.021