黃 杰 翟高壽
(北京交通大學(xué)計(jì)算機(jī)與信息技術(shù)學(xué)院 北京 100044)
針對(duì)內(nèi)核非控制數(shù)據(jù)攻擊的在線檢測(cè)方法研究
黃 杰 翟高壽
(北京交通大學(xué)計(jì)算機(jī)與信息技術(shù)學(xué)院 北京 100044)
操作系統(tǒng)安全是計(jì)算機(jī)系統(tǒng)安全的基礎(chǔ)保障和前提條件,而操作系統(tǒng)安全則主要依賴于系統(tǒng)內(nèi)核的安全。針對(duì)內(nèi)核的非控制數(shù)據(jù)攻擊是指通過篡改內(nèi)核中的某些關(guān)鍵數(shù)據(jù)結(jié)構(gòu),誘發(fā)內(nèi)核出現(xiàn)漏洞和產(chǎn)生一系列穩(wěn)定性問題,從而嚴(yán)重影響操作系統(tǒng)乃至整個(gè)計(jì)算機(jī)系統(tǒng)的安全。提出一種基于Kprobes內(nèi)核調(diào)試機(jī)制和監(jiān)視器內(nèi)核線程的在線檢測(cè)方法,前者用于監(jiān)控內(nèi)核關(guān)鍵函數(shù)的執(zhí)行和檢查相關(guān)動(dòng)態(tài)性數(shù)據(jù)結(jié)構(gòu)的一致性,后者通過設(shè)立專門的內(nèi)核線程實(shí)現(xiàn)靜態(tài)性內(nèi)核數(shù)據(jù)結(jié)構(gòu)的持續(xù)監(jiān)測(cè)和不變性驗(yàn)證。然后在Linux平臺(tái)上運(yùn)用C語言設(shè)計(jì)實(shí)現(xiàn)了相應(yīng)的內(nèi)核非控制數(shù)據(jù)攻擊在線檢測(cè)器KNCDefender,進(jìn)行了一系列驗(yàn)證實(shí)驗(yàn)和性能測(cè)試實(shí)驗(yàn)。實(shí)驗(yàn)結(jié)果表明,該方法是完全輕量級(jí)的,并能夠及時(shí)檢測(cè)出針對(duì)內(nèi)核的各種非控制數(shù)據(jù)攻擊。
操作系統(tǒng)安全 內(nèi)核安全 內(nèi)核非控制數(shù)據(jù)攻擊 Kprobes調(diào)試機(jī)制
隨著計(jì)算機(jī)在人們生活中的越來越廣泛的應(yīng)用,木馬、惡意程序、蠕蟲和各類計(jì)算機(jī)病毒對(duì)計(jì)算機(jī)系統(tǒng)攻擊花樣的不斷翻新,計(jì)算機(jī)系統(tǒng)安全正面臨前所未有的嚴(yán)重威脅,并受到人們的日益重視。計(jì)算機(jī)系統(tǒng)安全的前提基礎(chǔ)是操作系統(tǒng)的安全,沒有操作系統(tǒng)的安全,那么一切安全都是空談。而對(duì)于操作系統(tǒng)來說,內(nèi)核的安全是重中之重,只有在穩(wěn)定、健壯、安全的內(nèi)核基礎(chǔ)之上,我們的應(yīng)用程序、驅(qū)動(dòng)程序等其它依賴內(nèi)核的功能模塊才能可靠運(yùn)行。
近期的研究表明,內(nèi)核遭受的各類惡意攻擊越來越多,其中最主要的是Rootkit類攻擊,包括內(nèi)核控制數(shù)據(jù)攻擊和內(nèi)核非控制數(shù)據(jù)攻擊。長(zhǎng)期以來,安全人員主要側(cè)重于內(nèi)核控制數(shù)據(jù)攻擊,這類攻擊一般通過修改系統(tǒng)調(diào)用表、跳轉(zhuǎn)表、函數(shù)指針等使系統(tǒng)轉(zhuǎn)向執(zhí)行攻擊者精心設(shè)計(jì)的惡意代碼。當(dāng)前,針對(duì)內(nèi)核控制數(shù)據(jù)攻擊的有效防御方法包括采用CPU保護(hù)機(jī)制的SMAP[1]和SMEP[2],虛擬機(jī)監(jiān)控器機(jī)制的SecVisor[3]和NICKLE[4-5],以及采用純軟件方式的PaX[6]和GCC插件加固內(nèi)核[7]等。因此,內(nèi)核控制數(shù)據(jù)攻擊受到明顯遏制,相關(guān)威脅得到一定程度的緩解。對(duì)于面向內(nèi)核的非控制數(shù)據(jù)攻擊而言,已有的針對(duì)控制數(shù)據(jù)攻擊的檢測(cè)方法往往都無法奏效。加之長(zhǎng)期以來安全人員對(duì)于非控制數(shù)據(jù)攻擊的重視程度的嚴(yán)重欠缺,使得其產(chǎn)生的威脅越來越嚴(yán)重。Chen等[8]在2005年首次詳細(xì)分析了用戶層的非控制數(shù)據(jù)引發(fā)的安全問題及威脅,討論了包括FTP、SSH、TELNET、HTTP服務(wù)器所遭受到的非控制數(shù)據(jù)攻擊,被攻擊對(duì)象具體如認(rèn)證數(shù)據(jù)、配置數(shù)據(jù)、用戶輸入、決策數(shù)據(jù)等關(guān)系到各類服務(wù)器安全的非控制數(shù)據(jù)。已有的運(yùn)行時(shí)Rootkit檢測(cè)工具如Livewire[9]、CoPilot[10]和其他一些商用Rootkit工具[11-12]主要針對(duì)內(nèi)核控制數(shù)據(jù)攻擊,它們周期性掃描并驗(yàn)證內(nèi)核代碼和控制數(shù)據(jù)(如跳轉(zhuǎn)表和系統(tǒng)調(diào)用表),通過比較可疑內(nèi)存數(shù)據(jù)區(qū)的加密哈希值和之前預(yù)先規(guī)定的值,從而達(dá)到判斷是否存在惡意修改的目的。需要指出的是,它們所分析驗(yàn)證的相關(guān)數(shù)據(jù)不包括非控制數(shù)據(jù),所以目前并不具備關(guān)于內(nèi)核非控制數(shù)據(jù)遭受篡改的檢測(cè)功能。SBCFI[13]同樣用于檢測(cè)內(nèi)核數(shù)據(jù)的不變性,其通過周期性掃描內(nèi)核中的函數(shù)指針來確保它們準(zhǔn)確無誤地指向特定的函數(shù),但是其對(duì)于非控制數(shù)據(jù)亦無能為力。Petroni等[14]提出了基于語義規(guī)范的內(nèi)核非控制數(shù)據(jù)檢測(cè)方法。具體而言,根據(jù)內(nèi)核源代碼的數(shù)據(jù)結(jié)構(gòu)關(guān)系,手工編寫語義規(guī)范,然后將語義規(guī)范翻譯成底層的檢查判斷,進(jìn)而利用底層監(jiān)控來檢測(cè)內(nèi)存可能出現(xiàn)的非控制數(shù)據(jù)攻擊,從而給安全人員提供了一種可供參考的基于語義的完整性規(guī)范模型。Hofmann[15]的方法類似于Petroni[14],他提出了基于特殊規(guī)范的系統(tǒng)性驗(yàn)證內(nèi)核對(duì)象狀態(tài)的框架OSck,并同時(shí)給出了運(yùn)行時(shí)內(nèi)存狀態(tài)不一致性驗(yàn)證的解決方案,這對(duì)于運(yùn)行狀態(tài)下內(nèi)核數(shù)據(jù)的全面檢測(cè)驗(yàn)證是一大進(jìn)步。截止到目前,相關(guān)方法或多或少存在這樣那樣的局限性,如Livewire、CoPilot和SBCFI尚不能用于檢測(cè)內(nèi)核非控制數(shù)據(jù)攻擊。Petroni的基于語義規(guī)范的檢測(cè)方法雖然從模型和思路上可行,但是需要專業(yè)的內(nèi)核開發(fā)人員才可以編寫語義完備的規(guī)范,實(shí)現(xiàn)較為困難。而Hofmann的OSck對(duì)于檢測(cè)新近出現(xiàn)的內(nèi)核非控制數(shù)據(jù)攻擊則存在較大的局限性,且沒有提出一個(gè)很好的可擴(kuò)展的框架,所以對(duì)于如SELinux卸載攻擊、文件隱藏等新近出現(xiàn)的安全攻擊無所適從或較難改造適應(yīng)。
為此,本文的主要工作和貢獻(xiàn)是,提出一種輕量級(jí)的基于Kprobes內(nèi)核調(diào)試機(jī)制和監(jiān)視器內(nèi)核線程的在線檢測(cè)方法。一方面,基于Kprobes內(nèi)核調(diào)試機(jī)制,在內(nèi)核關(guān)鍵函數(shù)或系統(tǒng)調(diào)用的入口、出口甚至中間某些特定位置設(shè)定探測(cè)點(diǎn),插入關(guān)于相關(guān)內(nèi)核數(shù)據(jù)結(jié)構(gòu)的記錄操作和一致性驗(yàn)證的代碼段。另一方面,創(chuàng)建系統(tǒng)啟動(dòng)初始化數(shù)據(jù)的備份,設(shè)立監(jiān)視器內(nèi)核線程kverifyd,周期性檢查內(nèi)核中具有不變性的靜態(tài)數(shù)據(jù)是否發(fā)生過修改,如果發(fā)生變化,則及時(shí)恢復(fù)。驗(yàn)證實(shí)驗(yàn)表明,該方法能夠及時(shí)并有效地發(fā)現(xiàn)可疑的非控制數(shù)據(jù)攻擊,同時(shí)給安全人員提供了一種可以借鑒和可擴(kuò)展性的檢測(cè)模型。
內(nèi)核非控制數(shù)據(jù)攻擊通過修改內(nèi)核中的一些關(guān)鍵數(shù)據(jù)來達(dá)到隱藏攻擊痕跡和誘發(fā)內(nèi)核紊亂的目的。當(dāng)前的操作系統(tǒng)內(nèi)核管理著成千上萬的非控制數(shù)據(jù)結(jié)構(gòu),亦即那些不影響程序執(zhí)行流程的數(shù)據(jù),且其中很多數(shù)據(jù)結(jié)構(gòu)(如鏈表、哈希表、指針變量等)的取值或狀態(tài)正確與否直接關(guān)系到內(nèi)核的安全與穩(wěn)定。內(nèi)核非控制數(shù)據(jù)攻擊主要修改的就是這些非控制類關(guān)鍵數(shù)據(jù)。Riley[16]在其文中明確指出,非控制數(shù)據(jù)攻擊無需攻擊者注入惡意代碼,只需要攻擊者巧妙地修改相關(guān)數(shù)據(jù)以達(dá)到隱匿蹤跡、留下后門、紊亂內(nèi)核的目的。
常見的內(nèi)核非控制數(shù)據(jù)攻擊流程(如圖1所示)一般如下:攻擊者通過掃描內(nèi)核符號(hào)表/proc/kallsyms獲取欲攻擊數(shù)據(jù)結(jié)構(gòu)的入口參照地址(對(duì)于文件隱藏而言,指磁盤高速緩存數(shù)組bh_lrus;對(duì)于進(jìn)程隱藏而言,指進(jìn)程的pid哈希表;對(duì)于SELinux失效攻擊而言,指安全操作指針security_ops和default_security_ops)。此處的欲攻擊數(shù)據(jù)結(jié)構(gòu)的入口參照地址是一個(gè)虛擬地址,通過自編地址轉(zhuǎn)換函數(shù)將其轉(zhuǎn)換成對(duì)應(yīng)的內(nèi)存物理地址。非控制數(shù)據(jù)結(jié)構(gòu)的具體篡改一般基于內(nèi)存映像文件/dev/mem來進(jìn)行,后者是文件系統(tǒng)中用于訪問內(nèi)存的接口文件,把文件指針調(diào)整為欲修改數(shù)據(jù)結(jié)構(gòu)所對(duì)應(yīng)的物理地址,就可修改對(duì)應(yīng)數(shù)據(jù)取值和實(shí)現(xiàn)攻擊目的。
圖1 攻擊過程流程圖
本文主要討論進(jìn)程隱藏、文件隱藏、SELinux失效和資源消耗型等四類內(nèi)核非控制數(shù)據(jù)攻擊[16,17]的在線檢測(cè)。就進(jìn)程隱藏類非控制數(shù)據(jù)攻擊而言,其一般通過修改進(jìn)程哈希表,從中刪除對(duì)應(yīng)進(jìn)程表項(xiàng),從而隱藏特定用戶進(jìn)程;但由于在運(yùn)行隊(duì)列中仍然保留有該用戶進(jìn)程,所以被隱藏的用戶進(jìn)程依然被調(diào)度執(zhí)行。就文件隱藏類非控制數(shù)據(jù)攻擊而言,攻擊者通過修改被隱藏文件所在目錄的磁盤高速緩存中目錄項(xiàng)記錄長(zhǎng)度,將被隱藏文件之前一目錄項(xiàng)記錄長(zhǎng)度覆蓋被隱藏文件目錄項(xiàng),這樣在用戶空間使用文件查看命令的時(shí)候無法從高速緩存獲取被隱藏文件信息即可達(dá)到隱藏的目的。就SELinux失效型非控制數(shù)據(jù)攻擊而言,攻擊者在SELinux安全模塊已加載的情況下,將安全操作指針security_ops指向default_security_ops,使得其中與安全策略相關(guān)的函數(shù)指針全部為空,導(dǎo)致SELinux無法正常工作。就資源消耗型非控制數(shù)據(jù)攻擊而言,攻擊者通過修改DMA、HIGHMEM、NORMAL等三類物理內(nèi)存區(qū)域的低限閾值和制造內(nèi)存緊張假象。鑒于內(nèi)存管理器在發(fā)現(xiàn)空閑物理頁面數(shù)量低于一定水平的時(shí)候,會(huì)啟動(dòng)頁交換內(nèi)核線程kswapd,強(qiáng)制通過內(nèi)存與外存之間不斷的頁面置換來緩解內(nèi)存頁緊張狀況。然而實(shí)際上,物理內(nèi)存可用空間充足,并沒有出現(xiàn)空閑物理空間不足的情況。
相關(guān)研究表明,在內(nèi)核安全防護(hù)中,必須加強(qiáng)防范非控制數(shù)據(jù)攻擊,以防止攻擊者修改非控制數(shù)據(jù)和擾亂系統(tǒng)內(nèi)核。
自Linux操作系統(tǒng)面世以來,Linux內(nèi)核的代碼量和復(fù)雜程度不斷增加,其內(nèi)核數(shù)據(jù)結(jié)構(gòu)的分析亦日漸困難。相對(duì)于內(nèi)核控制數(shù)據(jù)而言,內(nèi)核非控制數(shù)據(jù)本身的變化規(guī)律更難把握,且無法用分析控制數(shù)據(jù)的方法來分析非控制數(shù)據(jù)。為降低內(nèi)核非控制數(shù)據(jù)分析的難度和提高其在線檢測(cè)分析的可行性,本文試圖構(gòu)建根據(jù)數(shù)據(jù)動(dòng)/靜態(tài)特性采取不同分析檢測(cè)機(jī)制的解決方案,也就是基于Kprobes內(nèi)核調(diào)試機(jī)制和監(jiān)視器內(nèi)核線程的在線檢測(cè)方法(如圖2所示)。前者用于監(jiān)控內(nèi)核關(guān)鍵函數(shù)的執(zhí)行和檢查相關(guān)動(dòng)態(tài)數(shù)據(jù)的一致性,后者則通過設(shè)立專門的內(nèi)核線程來實(shí)現(xiàn)靜態(tài)內(nèi)核數(shù)據(jù)的持續(xù)檢測(cè)和不變性驗(yàn)證。
圖2 非控制數(shù)據(jù)攻擊在線檢測(cè)總體框架
本文實(shí)驗(yàn)原型KNCDefender是基于Ubuntu10.04LTS Linux 2.6.32.27內(nèi)核版本、gcc 4.4.3及C語言開發(fā)完成的。
加載啟用在線檢測(cè)模塊KNCDefender之后,其首先初始化檢測(cè)用基礎(chǔ)數(shù)據(jù)(包括內(nèi)核非控制動(dòng)態(tài)數(shù)據(jù)和內(nèi)核非控制靜態(tài)數(shù)據(jù))。接下來,便進(jìn)入內(nèi)核非控制數(shù)據(jù)的在線分析及攻擊檢測(cè)循環(huán)。對(duì)于動(dòng)態(tài)變化性質(zhì)的數(shù)據(jù)結(jié)構(gòu),利用注冊(cè)Kprobes鉤子函數(shù)的方式來監(jiān)控內(nèi)核關(guān)鍵函數(shù)的執(zhí)行,檢查相關(guān)聯(lián)數(shù)據(jù)結(jié)構(gòu)之間的一致性。對(duì)于靜態(tài)不變性質(zhì)的內(nèi)核非控制數(shù)據(jù)(如各物理內(nèi)存區(qū)的頁面數(shù)閾值pages_low,pages_min,pages_high等),設(shè)立監(jiān)視器內(nèi)核線程監(jiān)控它們的變化情況,一旦發(fā)現(xiàn)異常變化,則及時(shí)計(jì)算和恢復(fù)到正確狀態(tài)。相關(guān)監(jiān)視及檢測(cè)分析結(jié)果應(yīng)實(shí)時(shí)同步輸出到用戶層,即寫入klogd日志系統(tǒng)中。同時(shí),在原型實(shí)現(xiàn)時(shí),把相關(guān)操作函數(shù)執(zhí)行不頻繁的某些動(dòng)態(tài)數(shù)據(jù)的一致性檢查功能也放到了監(jiān)視器內(nèi)核線程中。
2.1 內(nèi)核數(shù)據(jù)分析基本思路
(1) 動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)的一致性分析
內(nèi)核中的動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)數(shù)量龐大,但就類型來說,主要包括鏈表、哈希表、內(nèi)核先進(jìn)先出隊(duì)列、映射、紅黑樹等。在內(nèi)核的運(yùn)行過程中,一些數(shù)據(jù)結(jié)構(gòu)取值或其所含分量取值伴隨有關(guān)操作經(jīng)常會(huì)發(fā)生變化。分析相關(guān)動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)之間所維持的一致性,就是利用Kprobes內(nèi)核調(diào)試機(jī)制在引發(fā)數(shù)據(jù)變化的操作函數(shù)的特定位置設(shè)置探測(cè)點(diǎn),使更新對(duì)應(yīng)檢測(cè)用基礎(chǔ)數(shù)據(jù)之后,接著比較相關(guān)聯(lián)的所有數(shù)據(jù)結(jié)構(gòu)的內(nèi)容,若出現(xiàn)不一致的情況,則可判斷為可疑攻擊或潛在威脅。
(2) 靜態(tài)數(shù)據(jù)結(jié)構(gòu)的不變性分析
對(duì)于內(nèi)核中的靜態(tài)數(shù)據(jù)結(jié)構(gòu),主要是一些自內(nèi)核啟動(dòng)以后保持不變的簡(jiǎn)單變量。要想對(duì)它們重新賦值和并使之生效,往往需要重啟系統(tǒng)內(nèi)核。一般情況下,這些變量的取值在內(nèi)核運(yùn)行過程中應(yīng)保持不變,且它們對(duì)內(nèi)核具有較大的影響作用。譬如前面提到的關(guān)于各物理內(nèi)存區(qū)的頁面數(shù)閾值的三個(gè)變量便是典型的靜態(tài)性內(nèi)核非控制數(shù)據(jù)變量。對(duì)于此類變量需在攻擊檢測(cè)模塊啟動(dòng)初始化時(shí)就設(shè)法收集它們的初始取值,并在監(jiān)視器內(nèi)核線程中定期比較相關(guān)變量的當(dāng)前取值與初始取值。若有不同,便可判斷為可疑攻擊或潛在威脅。
2.2 Kprobes內(nèi)核調(diào)試機(jī)制
Kprobes內(nèi)核調(diào)試機(jī)制在Linux 2.6內(nèi)核以后引入,用于動(dòng)態(tài)調(diào)試內(nèi)核和收集內(nèi)核信息。其由Dprobe項(xiàng)目派生而來,是一種輕量級(jí)的非破壞性工具,可用來監(jiān)控內(nèi)核中的任何函數(shù)、被執(zhí)行指令以及一些異步事件。
Kprobes內(nèi)核調(diào)試機(jī)制實(shí)現(xiàn)了三種類型的探測(cè)點(diǎn)(即kprobe、jprobe、kretprobe)。kprobe探測(cè)點(diǎn)可以設(shè)置在任何指令位置,對(duì)應(yīng)注冊(cè)方法為register_kprobe(struct kprobe *kp)。jprobe探測(cè)點(diǎn)一般設(shè)置在函數(shù)的入口處,以方便訪問函數(shù)的參數(shù),對(duì)應(yīng)注冊(cè)方法是register_jprobe(struct jprobe *jp)。kretprobe又稱返回式kprobe,顧名思義,就是在函數(shù)返回處設(shè)置探測(cè)點(diǎn),從而在函數(shù)返回之前進(jìn)行探測(cè)處理,對(duì)應(yīng)注冊(cè)方法是register_kretprobe(struct kretprobe *rp)。其中jprobe和kretprobe均是對(duì)kprobe的封裝和特殊化處理,對(duì)應(yīng)使用方法和工作原理都與kprobe類似。
作為Kprobes內(nèi)核調(diào)試機(jī)制的核心和基礎(chǔ),kprobe所涉關(guān)鍵數(shù)據(jù)結(jié)構(gòu)定義如下:
struct kprobe {
struct list_head list;
/* 用于連接多個(gè)kprobe的鏈表*/
kprobe_opcode_t *addr;
/* 探測(cè)點(diǎn)地址*/
const char *symbol_name;
/*用戶指定的探測(cè)點(diǎn)符號(hào)*/
kprobe_pre_handler_t pre_handler;
/*探測(cè)點(diǎn)之前調(diào)用的處理函數(shù)*/
kprobe_post_handler_t post_handler;
/* 探測(cè)點(diǎn)之后調(diào)用的處理函數(shù)*/
kprobe_fault_handler_t fault_handler;
/*出錯(cuò)處理函數(shù) */
struct arch_specific_insn ainsn;
/*原指令的拷貝*/
……
/*其它*/
};
就kprobe探測(cè)(其工作機(jī)理如圖3所示)而言,首先應(yīng)選定被監(jiān)視或跟蹤的函數(shù)的特定位置設(shè)置探測(cè)點(diǎn),備份探測(cè)點(diǎn)處原指令、注冊(cè)kprobe結(jié)構(gòu),進(jìn)而利用系統(tǒng)內(nèi)核的異步工作方式在相應(yīng)中斷的notifier_call_chain中注冊(cè)對(duì)應(yīng)處理函數(shù),并用int 3中斷指令來替代探測(cè)點(diǎn)處原指令。在系統(tǒng)內(nèi)核運(yùn)行過程中,當(dāng)CPU執(zhí)行到探測(cè)點(diǎn)時(shí),引發(fā)int 3中斷。在保存CPU寄存器內(nèi)容及現(xiàn)場(chǎng)信息之后,執(zhí)行3#中斷處理函數(shù)及其notifier_call_chain中注冊(cè)的所有notifier函數(shù)(即pre_handler函數(shù)指針?biāo)赶虻暮瘮?shù))。然后單步執(zhí)行先前備份的探測(cè)點(diǎn)處原指令,執(zhí)行結(jié)束后并引發(fā)調(diào)試異常和int 1中斷,執(zhí)行對(duì)應(yīng)中斷處理操作及post_handler函數(shù)指針?biāo)赶虻暮瘮?shù)。其整個(gè)過程都是禁止搶占和關(guān)中斷的,最終返回探測(cè)點(diǎn)處并從對(duì)應(yīng)下一條指令起繼續(xù)執(zhí)行。
圖3 kprobe工作原理
Kprobes內(nèi)核調(diào)試機(jī)制是本文內(nèi)核非控制數(shù)據(jù)攻擊在線檢測(cè)框架的核心所在。通過在動(dòng)態(tài)數(shù)據(jù)操作函數(shù)特定位置設(shè)置和注冊(cè)探測(cè)點(diǎn),使內(nèi)核執(zhí)行到相關(guān)探測(cè)點(diǎn)時(shí),順次調(diào)用精心設(shè)計(jì)的內(nèi)核數(shù)據(jù)分析處理函數(shù),從而實(shí)現(xiàn)相關(guān)聯(lián)內(nèi)核數(shù)據(jù)結(jié)構(gòu)間一致性的檢查驗(yàn)證。
2.3 監(jiān)視器內(nèi)核線程
線程是現(xiàn)代操作系統(tǒng)為了降低調(diào)度開銷和提高多處理器運(yùn)行效率而建立的新概念。對(duì)于Linux操作系統(tǒng)來說,線程與進(jìn)程并沒有太大的區(qū)別,線程被看作是共享進(jìn)程地址空間的進(jìn)程,內(nèi)核同樣為它們分配進(jìn)程控制塊(struct task_struct),只不過其內(nèi)存地址指針(mm)為NULL。在Linux內(nèi)核中,有時(shí)需要執(zhí)行一些后臺(tái)操作,且這種任務(wù)通常使用只存在于內(nèi)核空間和獨(dú)立運(yùn)行于內(nèi)核空間的進(jìn)程,即內(nèi)核線程來完成。內(nèi)核線程具有輕量型特點(diǎn),同普通進(jìn)程一樣參與調(diào)度和搶占處理。常見的內(nèi)核線程有頁交換線程Kswapd、中斷線程Ksoftirqd等。需要指出的是,內(nèi)核線程只可以由其它內(nèi)核線程創(chuàng)建,且所有內(nèi)核線程都源自于系統(tǒng)的kthreadd內(nèi)核進(jìn)程。
就本文內(nèi)核非控制數(shù)據(jù)攻擊在線檢測(cè)方法而言,通過創(chuàng)建內(nèi)核線程kverifyd來擔(dān)當(dāng)內(nèi)核數(shù)據(jù)不變性分析的監(jiān)視器,周期性進(jìn)行相應(yīng)數(shù)據(jù)結(jié)構(gòu)內(nèi)容或取值的比較,同時(shí)與Kprobes內(nèi)核調(diào)試機(jī)制協(xié)同工作,從而最終實(shí)現(xiàn)內(nèi)核非控制數(shù)據(jù)攻擊所引發(fā)的不一致性或異常變化的檢測(cè)。監(jiān)視器內(nèi)核線程實(shí)現(xiàn)偽代碼如下所示:
verify_thread(void)
{
allow_signal(SIGKILL);
//允許本線程響應(yīng)SIGKILL信號(hào)
allow_signal(SIGTERM);
//允許本線程響應(yīng)SIGTERM信號(hào)
do {
check_zone()
//進(jìn)行各物理內(nèi)存區(qū)檢查
check_selinux_valid_status()
//檢查SELinux的有效狀態(tài)
…
set_current_state(TASK_INTERRUPTIBLE);
//設(shè)置線程狀態(tài)
schedule_timeout(10 * HZ);
//設(shè)置調(diào)度周期
} while (!signal_pending(current));
//線程退出狀態(tài)檢查
}
為檢驗(yàn)上述在線檢測(cè)方法及KNCDefender原型的有效性,本文針對(duì)Linux2.6.32.27內(nèi)核進(jìn)行了包括進(jìn)程隱藏、文件隱藏、SELinux失效攻擊、資源消耗型等內(nèi)核非控制數(shù)據(jù)攻擊在內(nèi)的一系列在線檢測(cè)驗(yàn)證實(shí)驗(yàn)。
3.1 進(jìn)程隱藏檢測(cè)
就Linux內(nèi)核進(jìn)程管理而言,進(jìn)程哈希表用于快速查找指定進(jìn)程,而進(jìn)程鏈表則是由0號(hào)進(jìn)程開始的所有存活進(jìn)程連接在一起形成的鏈表。對(duì)于Linux進(jìn)程調(diào)度來說,首先基于CFS公平調(diào)度算法從進(jìn)程鏈表中選取合適的進(jìn)程,構(gòu)建起用紅黑樹來組織的可運(yùn)行進(jìn)程隊(duì)列,然后再從其中挑選出合適的進(jìn)程分配處理器和加以執(zhí)行。進(jìn)程隱藏攻擊原理是將惡意進(jìn)程從進(jìn)程哈希表中移除,但由于其依然保留在進(jìn)程鏈表中,所以,盡管利用進(jìn)程查看操作無法顯示被隱藏的惡意進(jìn)程,但當(dāng)CFS調(diào)度時(shí),惡意進(jìn)程仍然能夠被調(diào)度和執(zhí)行。
關(guān)于進(jìn)程隱藏的在線檢測(cè),我們利用Kprobes內(nèi)核調(diào)試機(jī)制監(jiān)視進(jìn)程的創(chuàng)建、消亡及相關(guān)數(shù)據(jù)結(jié)構(gòu),同時(shí)在監(jiān)視器內(nèi)核線程kverifyd中分析進(jìn)程哈希表和進(jìn)程鏈表的一致性。具體而言,分別利用kretprobe、kprobe來監(jiān)視進(jìn)程創(chuàng)建時(shí)拷貝函數(shù)copy_process和進(jìn)程退出函數(shù)do_exit的執(zhí)行,并且同步更新進(jìn)程檢測(cè)用數(shù)據(jù)結(jié)構(gòu)LIST_HEAD(cur_list)鏈表(其用于記錄當(dāng)前內(nèi)核所管理的所有進(jìn)程)。不言而喻,其間主要設(shè)置了兩個(gè)探測(cè)點(diǎn),相關(guān)結(jié)構(gòu)體變量定義如下:
struct kretprobe do_fork_kretp = {
.handler = fork_handler,
//處理函數(shù)
.maxactive = 20,
//被探測(cè)函數(shù)可以被同時(shí)探測(cè)的實(shí)例數(shù)
.kp.symbol_name = ″copy_process″,
//被監(jiān)視函數(shù)
};
struct kprobe do_exit_kp = {
.pre_handler = exit_handler_pre,
//預(yù)處理函數(shù)
.fault_handler = exit_handler_fault,
//錯(cuò)誤處理函數(shù)
.symbol_name = ″do_exit″,
//被監(jiān)視函數(shù)
};
監(jiān)視器內(nèi)核線程kverifyd調(diào)用is_hlist_exist(proc->pid)來分析判斷是否每個(gè)存活進(jìn)程(包括處于運(yùn)行和睡眠狀態(tài)的所有進(jìn)程)都在進(jìn)程哈希表中。若發(fā)現(xiàn)不在進(jìn)程哈希表中的進(jìn)程,則判斷為隱藏進(jìn)程,并立即將其終止,同時(shí)記入系統(tǒng)內(nèi)核日志,以方便通過cat /proc/kmsg內(nèi)核日志輸出操作看到相應(yīng)分析處理結(jié)果。
進(jìn)程隱藏攻擊與檢測(cè)示例如圖4所示。其中,使用包含死循環(huán)的程序malware.o來模擬惡意程序,進(jìn)程隱藏攻擊試圖隱藏該惡意程序和使其從進(jìn)程列表中消失。當(dāng)惡意程序malware.o啟動(dòng)執(zhí)行且進(jìn)程隱藏攻擊還未奏效時(shí),可以在進(jìn)程列表中看到進(jìn)程號(hào)為9696的惡意程序malware.o(參圖4①)。而當(dāng)發(fā)動(dòng)進(jìn)程隱藏攻擊、指定進(jìn)程號(hào)、使惡意進(jìn)程malware.o隱藏之后,可以看到惡意程序已經(jīng)不在進(jìn)程顯示列表中了(參圖4②)。但此時(shí)我們依然可以從惡意程序啟動(dòng)執(zhí)行終端發(fā)現(xiàn)其還在運(yùn)行、并不斷輸出“I’m a malware”(參圖4③)。啟動(dòng)運(yùn)行本文非控制數(shù)據(jù)攻擊在線檢測(cè)模塊KNCDefender,能夠發(fā)現(xiàn)內(nèi)核進(jìn)程哈希表和進(jìn)程鏈表的不一致性,找到可疑的9696號(hào)隱藏進(jìn)程并發(fā)送SIGKILL信號(hào)終止其運(yùn)行(參圖4④⑤所示)。
圖4 進(jìn)程隱藏攻擊與檢測(cè)示例
3.2 SELinux失效攻擊檢測(cè)與恢復(fù)
Linux安全模塊(LSM)框架支持SELinux、apparmor、smack等訪問決策模塊。每個(gè)訪問決策模塊都是通過xxx_init()調(diào)用register_security()函數(shù)向LSM框架加以注冊(cè)的。一旦注冊(cè)成功,即可實(shí)施相應(yīng)的訪問控制決策操作。但如果注冊(cè)時(shí)已有其它安全模塊注冊(cè)生效,則本次注冊(cè)失敗。換句話說,只有等前一個(gè)安全訪問決策模塊卸載之后,才可以加載下一個(gè)安全訪問決策模塊。Linux安全模塊提供了兩類對(duì)安全鉤子函數(shù)的調(diào)用,一類用于管理內(nèi)核對(duì)象的安全域,另一類用于仲裁對(duì)這些內(nèi)核對(duì)象的訪問控制。對(duì)安全鉤子函數(shù)的調(diào)用具體根據(jù)由全局變量security_ops所指向的安全操作結(jié)構(gòu)體中的函數(shù)指針(即鉤子)的設(shè)置來實(shí)現(xiàn)。注冊(cè)安全模塊實(shí)際上就是將security_ops安全操作指針指向?qū)?yīng)安全訪問決策模塊的安全操作實(shí)現(xiàn)函數(shù)。SELinux失效攻擊的原理是,在SELinux已經(jīng)注冊(cè)加載的情況下,將security_ops指針指向default_security_ops結(jié)構(gòu)體變量(許多Linux系統(tǒng)啟動(dòng)時(shí)default_security_ops并未設(shè)定為支持SELinux訪問控制策略),從而迫使系統(tǒng)無法實(shí)施SELinux安全策略及訪問控制決策,當(dāng)然也無法進(jìn)行SELinux 的permissive模式和enforcing模式之間的切換。為此,內(nèi)核非控制數(shù)據(jù)攻擊在線檢測(cè)方案及KNCDefender原型在監(jiān)控內(nèi)核啟動(dòng)加載的一開始,便須獲取security_ops的初值,并將其保存在檢測(cè)模塊基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),即struct lsm_status current_lsm結(jié)構(gòu)變量中。系統(tǒng)運(yùn)行過程中,利用監(jiān)視器內(nèi)核線程kverifyd定時(shí)檢查security_ops所指向的訪問決策模塊,并與檢測(cè)模塊中保存的訪問決策模塊相關(guān)信息進(jìn)行比較,若二者不一致,即若security_ops指向default_security_ops,但內(nèi)核啟動(dòng)時(shí)已經(jīng)加載了SELinux安全模塊,則說明其間發(fā)生了SELinux失效攻擊。
SELinux失效攻擊的整個(gè)過程如圖5所示。執(zhí)行攻擊程序attack-selinux.py的前后,我們可以發(fā)現(xiàn)SELinux執(zhí)行模式切換、文件安全屬性顯示等SELinux安全相關(guān)操作結(jié)果明顯不同。
圖5 SELinux失效攻擊示例
在本文內(nèi)核非控制數(shù)據(jù)攻擊在線檢測(cè)原型KNCDefender啟動(dòng)運(yùn)行的情況下,SELinux失效攻擊會(huì)被及時(shí)發(fā)現(xiàn)和安全處理(如圖6所示)。圖6中①表示攻擊前后文件安全屬性對(duì)比,并沒有發(fā)生變化。這是因?yàn)镵NCDefender在線檢測(cè)模塊在kverifyd監(jiān)視器中通過執(zhí)行SELinux失效攻擊檢查,及時(shí)發(fā)現(xiàn)了不一致性情況,并通過修復(fù)security_ops相關(guān)函數(shù)指針使其指向自內(nèi)核啟動(dòng)以來所加載的SELinux訪問決策模塊(如圖6中②所示)。
圖6 SELinx失效攻擊檢測(cè)與修復(fù)示例
3.3 文件隱藏檢測(cè)
攻擊者經(jīng)常會(huì)隱匿它們?cè)谙到y(tǒng)中留下的蹤跡或后門,從而方便其以后可以繼續(xù)竊取用戶信息或開展破壞系統(tǒng)的其他攻擊,其間不少蹤跡和后門都體現(xiàn)為惡意程序文件。顯然,如果用戶因此不能及時(shí)發(fā)現(xiàn)或者根本就發(fā)現(xiàn)不了被隱藏的惡意程序相關(guān)文件,那造成的安全后果是很嚴(yán)重的。內(nèi)核非控制數(shù)據(jù)攻擊中的文件隱藏,就是采取某種處理措施使得攻擊者在系統(tǒng)中留下的惡意文件對(duì)于用戶(如使用ls -a和find命令時(shí))是不可見的,但是它們客觀存在、可以被攻擊者訪問和加以利用。
一般而言,文件隱藏的第一步,就是讀取被隱藏文件所在的目錄,使內(nèi)存的磁盤高速緩存的塊緩沖中載入被隱藏文件所在目錄的內(nèi)容,也就是該目錄下的所有文件的目錄項(xiàng)。對(duì)于ext2文件系統(tǒng)來說,其目錄微觀結(jié)構(gòu)如圖7所示。
圖7 Ext2文件系統(tǒng)之目錄微觀結(jié)構(gòu)
就Linux文件訪問而言,為了提高系統(tǒng)性能,通常會(huì)維護(hù)一個(gè)磁盤高速緩存指針數(shù)組bh_lrus[8],其中的元素指向最近訪問的8個(gè)緩沖區(qū)首部(即用于描述每個(gè)塊緩沖的buffer_head結(jié)構(gòu)體)。通過讀取被隱藏文件所在的目錄,bh_lrus[0]便指向了被隱藏文件所在目錄的塊緩沖,于是只要修改所隱藏文件在其所在目錄的對(duì)應(yīng)前一目錄項(xiàng)的記錄長(zhǎng)度Record Length,并使該前一目錄項(xiàng)覆蓋被隱藏文件的目錄項(xiàng),便可使執(zhí)行l(wèi)s、find等查看文件命令時(shí),無法從磁盤高速緩存中讀取到被隱藏文件對(duì)應(yīng)的目錄項(xiàng),從而使用戶無法看到文件和達(dá)到文件隱藏的目的。當(dāng)然,相關(guān)文件依然存在并可采用絕對(duì)路徑等方式進(jìn)行訪問操作。
在本文內(nèi)核非控制數(shù)據(jù)攻擊在線檢測(cè)方法及原型KNCDefender中,試圖監(jiān)控目錄項(xiàng)讀取函數(shù)vfs_readdir()的執(zhí)行過程,利用Kprobes內(nèi)核調(diào)試機(jī)制中的jprobe在該函數(shù)入口處設(shè)置探測(cè)點(diǎn),以獲取當(dāng)前目錄的目錄項(xiàng)結(jié)構(gòu)dentry及父、子目錄項(xiàng)鏈表。實(shí)際讀取目錄時(shí),bh_lrus[0]指向了該目錄的緩沖區(qū)頭部,從而可以直接獲取該目錄的內(nèi)容。通過比較該目錄文件內(nèi)容和父子鏈表的一致性,便可確認(rèn)被隱藏的文件。需要特別指出的是,正常的文件刪除也會(huì)采用和文件隱藏一樣的策略來覆蓋目錄項(xiàng),但其同時(shí)會(huì)把文件的目錄項(xiàng)對(duì)象結(jié)構(gòu)dentry鏈接到超級(jí)塊的孤兒鏈表中。因此,若出現(xiàn)對(duì)應(yīng)目錄項(xiàng)對(duì)象dentry的父子鏈表中存在某個(gè)文件,而該文件不在塊緩沖中且不存在于孤兒鏈表中,則可判斷出現(xiàn)了文件隱藏攻擊。
文件隱藏攻擊示例如圖8所示。執(zhí)行文件隱藏程序attack-filehide.py,將需要隱藏的惡意程序配置文件malware.cfg隱藏,可以發(fā)現(xiàn)該文件用ls -a和ls命令操作是無法顯示出來的,但通過指定文件路徑名依然可以找到并可以訪問。
圖8 文件隱藏攻擊示例
采用本文內(nèi)核非控制數(shù)據(jù)攻擊在線檢測(cè)方法及KNCDefender原型(如圖9所示),可以檢查發(fā)現(xiàn)被隱藏文件并在內(nèi)核日志中輸出相關(guān)信息。于是,在終端上通過dmesg | grep’Hidden’ -rn過濾內(nèi)核日志輸出結(jié)果,可以找到對(duì)應(yīng)被隱藏文件malware.cfg及相應(yīng)索引結(jié)點(diǎn)號(hào)的檢查確認(rèn)信息。
圖9 文件隱藏檢測(cè)示例
3.4 資源消耗型攻擊檢測(cè)
操作系統(tǒng)內(nèi)存管理子系統(tǒng)為了滿足系統(tǒng)內(nèi)核和用戶程序的正常運(yùn)行,總是試圖確保內(nèi)存始終擁有足夠多的空閑空間。為此,它采用內(nèi)存平衡算法及各物理內(nèi)存區(qū)的頁面數(shù)閾值(pages_low,pages_min,pages_high)來估計(jì)內(nèi)存分配的壓力。當(dāng)相應(yīng)類型物理內(nèi)存的可用空閑頁面數(shù)低于pages_low時(shí),內(nèi)存管理子系統(tǒng)啟動(dòng)異步模式的內(nèi)外存對(duì)換過程,開始將一些無用的內(nèi)存頁換出到外存,并一直持續(xù)到內(nèi)存中可用空閑頁面數(shù)達(dá)到pages_high的水平。而如果可用的空閑頁面數(shù)低于pages_min時(shí),內(nèi)存管理子系統(tǒng)將啟動(dòng)同步模式的內(nèi)外存對(duì)換過程。資源消耗性攻擊的原理是,惡意主動(dòng)調(diào)整這三個(gè)閾值,將它們?cè)O(shè)定到接近于甚至超過對(duì)應(yīng)類型物理內(nèi)存的頁面總數(shù),而由于當(dāng)前可用空閑頁數(shù)量低于頁面總數(shù),這樣勢(shì)必強(qiáng)迫內(nèi)存管理子系統(tǒng)啟動(dòng)內(nèi)外存對(duì)換操作,并造成了系統(tǒng)內(nèi)存嚴(yán)重短缺的假象。
對(duì)于本文提出的內(nèi)核非控制數(shù)據(jù)攻擊在線檢測(cè)方法,在內(nèi)核啟動(dòng)加載伊始,便收集獲取到各物理內(nèi)存區(qū)(通常即DMA、Normal、HighMem)的這三個(gè)閾值,并存放到檢測(cè)用數(shù)據(jù)結(jié)構(gòu)數(shù)組struct zone_status zones[3]中。系統(tǒng)運(yùn)行過程中,監(jiān)控用于支持熱插拔而引入的物理內(nèi)存區(qū)閾值重置操作內(nèi)核函數(shù)setup_per_zone_wmarks()的執(zhí)行過程,并在監(jiān)視器內(nèi)核線程kverifyd中定期比較各區(qū)的閾值、頁面總數(shù)量以及zones數(shù)組中各區(qū)的取值。若當(dāng)前某個(gè)區(qū)的閾值大于其對(duì)應(yīng)頁面總數(shù)量時(shí),將其恢復(fù)到zones數(shù)組中保持的最近更新的取值。當(dāng)重新設(shè)定每個(gè)區(qū)的閾值時(shí),亦須同步更新檢測(cè)模塊中zones數(shù)組元素相應(yīng)取值。
一旦發(fā)生資源消耗型攻擊,將造成內(nèi)存緊張假象,從而使頁交換線程kswapd被頻繁調(diào)度、內(nèi)外存對(duì)換不斷發(fā)生、交換分區(qū)的使用率急劇上升(從0%變?yōu)?.7%)。此時(shí),文件操作相關(guān)的各種性能指標(biāo)如文件拷貝、壓縮、模塊編譯時(shí)間開銷等亦大幅度增加(如圖10所示)。之后,系統(tǒng)出現(xiàn)卡頓甚至嚴(yán)重影響相關(guān)操作。
圖10 資源消耗型攻擊對(duì)文件操作性能指標(biāo)的影響
運(yùn)用本文內(nèi)核非控制數(shù)據(jù)攻擊在線檢測(cè)對(duì)應(yīng)原型KNCDefender的情況下,其能夠及時(shí)發(fā)現(xiàn)各區(qū)閾值被惡意修改問題,并立刻加以恢復(fù)(檢測(cè)前后對(duì)比參見圖11中①②)。
圖11 資源消耗型攻擊及檢測(cè)示例
4.1 相關(guān)工作比較
從可檢測(cè)的非控制數(shù)據(jù)攻擊種類數(shù)量來看,本文方法具有明顯優(yōu)勢(shì)(如表1所示)。
表1 與相關(guān)方法檢測(cè)效果對(duì)比
另外,本文方法對(duì)于安全人員來說,允許根據(jù)內(nèi)核的數(shù)據(jù)結(jié)構(gòu)關(guān)系進(jìn)行拓展,方便更新升級(jí)以檢測(cè)和防護(hù)更多的攻擊類型,所以具有更好的可擴(kuò)展性。
4.2 性能測(cè)試評(píng)估
為科學(xué)評(píng)判本文方法對(duì)系統(tǒng)性能可能造成的影響,我們利用相關(guān)測(cè)評(píng)工具軟件對(duì)加載內(nèi)核非控制數(shù)據(jù)攻擊檢測(cè)模塊前后的系統(tǒng)性能,從延遲和帶寬等兩個(gè)方面進(jìn)行了測(cè)試和分析。
本文實(shí)驗(yàn)平臺(tái)硬件配置為Intel(R) Core(TM) i5-4200M 2.5 GHz處理器,內(nèi)存1 GB。采用Lmbench進(jìn)行系統(tǒng)性能測(cè)評(píng),其是為UNIX/POSIX定制的一套簡(jiǎn)單可移植并符合ANSI/C標(biāo)準(zhǔn)的微型測(cè)評(píng)工具。
(1) 延遲測(cè)評(píng)
延遲測(cè)評(píng)主要考量I/O相關(guān)系統(tǒng)調(diào)用(如read、write、fstat、select、open/close)及進(jìn)程創(chuàng)建操作(fork+{exit, execve, /bin/sh})的執(zhí)行時(shí)間延遲等(分別參見圖12、圖13所示)。不難看出,加載本文非控制數(shù)據(jù)攻擊檢測(cè)模塊之后,并未對(duì)系統(tǒng)調(diào)用或進(jìn)程創(chuàng)建操作造成明顯延遲后果。
圖12 系統(tǒng)調(diào)用延遲對(duì)比
圖13 進(jìn)程創(chuàng)建操作延遲對(duì)比
(2) 帶寬測(cè)評(píng)
帶寬測(cè)評(píng)主要考量套接字、管道及文件寫操作的帶寬(參見表2所示)。顯然,加載本文在線攻擊檢測(cè)模塊之后,各類帶寬均有小幅下降,但在可容忍限度之內(nèi)。
表2 Lmbench帶寬測(cè)試結(jié)果
本文提出了一種基于Kprobes內(nèi)核調(diào)試機(jī)制和監(jiān)視器內(nèi)核線程的針對(duì)內(nèi)核非控制數(shù)據(jù)攻擊的輕量級(jí)在線檢測(cè)方法。該方法能夠針對(duì)目前進(jìn)程隱藏、文件隱藏、SELinux失效攻擊、資源消耗型攻擊等各種典型非控制數(shù)據(jù)攻擊進(jìn)行有效的實(shí)時(shí)檢測(cè),同時(shí)具有一定的防護(hù)功能。進(jìn)一步來說,該方法可以保證內(nèi)核在運(yùn)行過程中,不會(huì)因?yàn)楣粽咝薷膬?nèi)核數(shù)據(jù)結(jié)構(gòu)而引發(fā)欺騙用戶或?qū)е孪到y(tǒng)穩(wěn)定性失控的問題。實(shí)驗(yàn)結(jié)果和性能評(píng)估表明,我們的方法是完全輕量級(jí)的、可擴(kuò)展的和有效的,可為相關(guān)安全人員防護(hù)內(nèi)核非控制數(shù)據(jù)攻擊提供有益的借鑒和參考。
[1] Xen Bench Result[OL].http://www.bullopensource.org/xen/benchs.html.
[2] George V,Piazza T,Jiang H.Technology insight: Intel?next generation microarchitecture codename ivy bridge[OL].http://www.intel.com/idf/library/pdf/sf_2011/SF11_SPCS005_101F.pdf.
[3] Seshadri A,Luk M,Qu N,et al.SecVisor:a tiny hypervisor to provide lifetime kernel code integrity for commodity OSes[J].ACM SIGOPS Operating Systems Review,2007,41(6):335-350.
[4] Riley R,Jiang X,Xu D.Guest-transparent prevention of kernel rootkits with VMM-based memory shadowing[C]//11th International Symposium on Recent Advances in Intrusion Detection.Springer,2008:1-20.
[5] Hund R,Holz T,Freiling F C.Return-oriented rootkits:bypassing kernel code integrity protection mechanisms[C]//Proceedings of the 18th Conference on USENIX Security Symposium,2009:383-398.
[6] PAX.Homepage of The PaX Team[OL].http://pax.grsecurity.net.
[7] 王曼麗,翟高壽.基于編譯器插件的輕量級(jí)內(nèi)核重構(gòu)加固方法研究[J].軟件,2015,36(3):1-9.
[8] Chen S,Xu J,Sezer E C,et al.Non-control-data attacks are realistic threats[C]//Proceedings of the 14th Conference on USENIX Security Symposium.Berkeley,CA,USA:USENIX Association,2005:12.
[9] Garfinkel T,Rosenblum M.A virtual machine introspection based architecture for intrusion detection[C]//Proceedings of the 2003 Network and Distributed Systems Security Symposium,2003:191-206.
[10] Petroni N L,Fraser T,Molina J,et al.Copilot-a coprocessor-based kernel runtime integrity monitor[C]//Proceedings of the 13th Conference on USENIX Security Symposium,2004:13.
[11] Chkrootkit:locally checks for signs of a rootkit[OL].http://www.chkrootkit.org.
[12] RkHunter:protect your machine[OL].http://www.rootkit.nl/projects/rootkit_ hunter.html.
[13] Petroni N L,Hicks M.Automated detection of persistent kernel control-flow attacks[C]//Proceedings of the 14th ACM Conference on Computer and Communications Security,2007:103-115.
[14] Petroni N L,Fraser T,Walters A,et al.An architecture for specification-based detection of semantic integrity violations in kernel dynamic data[C]//Proceedings of the 15th Conference on USENIX Security Symposium,2006:289-304.
[15] Hofmann O S,Dunn A,Kim S,et al.Ensuring operating system kernel integrity with OSck[C]//Proceedings of the 16th International Conference on Architectural Support for Programming Languages and Operating Systems,2011:279-290.
[16] Riley R.A framework for prototyping and testing data-only rootkit attacks[J].Computers & Security,2013,37:62-71.
[17] Baliga A,Kamat P,Iftode L.Lurking in the shadows:identifying systemic threats to kernel data[C]//Proceedings of the 2007 IEEE Symposium on Security and Privacy,2007:246-251.
A RUNTIME DETECTION METHOD FOR KERNEL NON-CONTROL-DATA ATTACKS
Huang Jie Zhai Gaoshou
(SchoolofComputerandInformationTechnology,BeijingJiaotongUniversity,Beijing100044,China)
Operating system security is the foundation and prerequisite of computer system security, and it is mainly depend on the security of the system kernel. By tampering some key data structures inside kernel space, kernel non-control-data attacks induce some kernel vulnerabilities and a series of stability problems, which will severely affect the security of operating system and even that of the whole computer system. Thus, a runtime detection method based on the Kprobes debugging mechanism and a monitor kernel thread is proposed. The former is used to monitor the execution of key kernel functions and to check the consistency of related dynamic data structures, while the latter is used to check the invariance of some static kernel data structures. Then the corresponding prototype named by KNCDefender is designed and implemental in C language on Linux platform and a series of experiments for verification and performance testing have been carried out. Experimental results show that the method proposed in this paper is completely lightweight, and various attacks against kernel non-control-data can be detected timely.
Operating system security Security of kernel Kernel non-control-data attacks Kprobes debugging mechanism
2015-12-22。中央高?;究蒲袠I(yè)務(wù)費(fèi)專項(xiàng)基金項(xiàng)目(2009JBM019);國(guó)家留學(xué)基金項(xiàng)目(201307095025)。黃杰,碩士生,主研領(lǐng)域:操作系統(tǒng)安全。翟高壽,副教授。
TP316
A
10.3969/j.issn.1000-386x.2017.02.059