黃 杰 翟高壽
(北京交通大學計算機與信息技術學院 北京 100044)
針對內核非控制數據攻擊的在線檢測方法研究
黃 杰 翟高壽
(北京交通大學計算機與信息技術學院 北京 100044)
操作系統安全是計算機系統安全的基礎保障和前提條件,而操作系統安全則主要依賴于系統內核的安全。針對內核的非控制數據攻擊是指通過篡改內核中的某些關鍵數據結構,誘發內核出現漏洞和產生一系列穩定性問題,從而嚴重影響操作系統乃至整個計算機系統的安全。提出一種基于Kprobes內核調試機制和監視器內核線程的在線檢測方法,前者用于監控內核關鍵函數的執行和檢查相關動態性數據結構的一致性,后者通過設立專門的內核線程實現靜態性內核數據結構的持續監測和不變性驗證。然后在Linux平臺上運用C語言設計實現了相應的內核非控制數據攻擊在線檢測器KNCDefender,進行了一系列驗證實驗和性能測試實驗。實驗結果表明,該方法是完全輕量級的,并能夠及時檢測出針對內核的各種非控制數據攻擊。
操作系統安全 內核安全 內核非控制數據攻擊 Kprobes調試機制
隨著計算機在人們生活中的越來越廣泛的應用,木馬、惡意程序、蠕蟲和各類計算機病毒對計算機系統攻擊花樣的不斷翻新,計算機系統安全正面臨前所未有的嚴重威脅,并受到人們的日益重視。計算機系統安全的前提基礎是操作系統的安全,沒有操作系統的安全,那么一切安全都是空談。而對于操作系統來說,內核的安全是重中之重,只有在穩定、健壯、安全的內核基礎之上,我們的應用程序、驅動程序等其它依賴內核的功能模塊才能可靠運行。
近期的研究表明,內核遭受的各類惡意攻擊越來越多,其中最主要的是Rootkit類攻擊,包括內核控制數據攻擊和內核非控制數據攻擊。長期以來,安全人員主要側重于內核控制數據攻擊,這類攻擊一般通過修改系統調用表、跳轉表、函數指針等使系統轉向執行攻擊者精心設計的惡意代碼。當前,針對內核控制數據攻擊的有效防御方法包括采用CPU保護機制的SMAP[1]和SMEP[2],虛擬機監控器機制的SecVisor[3]和NICKLE[4-5],以及采用純軟件方式的PaX[6]和GCC插件加固內核[7]等。因此,內核控制數據攻擊受到明顯遏制,相關威脅得到一定程度的緩解。對于面向內核的非控制數據攻擊而言,已有的針對控制數據攻擊的檢測方法往往都無法奏效。加之長期以來安全人員對于非控制數據攻擊的重視程度的嚴重欠缺,使得其產生的威脅越來越嚴重。Chen等[8]在2005年首次詳細分析了用戶層的非控制數據引發的安全問題及威脅,討論了包括FTP、SSH、TELNET、HTTP服務器所遭受到的非控制數據攻擊,被攻擊對象具體如認證數據、配置數據、用戶輸入、決策數據等關系到各類服務器安全的非控制數據。已有的運行時Rootkit檢測工具如Livewire[9]、CoPilot[10]和其他一些商用Rootkit工具[11-12]主要針對內核控制數據攻擊,它們周期性掃描并驗證內核代碼和控制數據(如跳轉表和系統調用表),通過比較可疑內存數據區的加密哈希值和之前預先規定的值,從而達到判斷是否存在惡意修改的目的。需要指出的是,它們所分析驗證的相關數據不包括非控制數據,所以目前并不具備關于內核非控制數據遭受篡改的檢測功能。SBCFI[13]同樣用于檢測內核數據的不變性,其通過周期性掃描內核中的函數指針來確保它們準確無誤地指向特定的函數,但是其對于非控制數據亦無能為力。Petroni等[14]提出了基于語義規范的內核非控制數據檢測方法。具體而言,根據內核源代碼的數據結構關系,手工編寫語義規范,然后將語義規范翻譯成底層的檢查判斷,進而利用底層監控來檢測內存可能出現的非控制數據攻擊,從而給安全人員提供了一種可供參考的基于語義的完整性規范模型。Hofmann[15]的方法類似于Petroni[14],他提出了基于特殊規范的系統性驗證內核對象狀態的框架OSck,并同時給出了運行時內存狀態不一致性驗證的解決方案,這對于運行狀態下內核數據的全面檢測驗證是一大進步。截止到目前,相關方法或多或少存在這樣那樣的局限性,如Livewire、CoPilot和SBCFI尚不能用于檢測內核非控制數據攻擊。Petroni的基于語義規范的檢測方法雖然從模型和思路上可行,但是需要專業的內核開發人員才可以編寫語義完備的規范,實現較為困難。而Hofmann的OSck對于檢測新近出現的內核非控制數據攻擊則存在較大的局限性,且沒有提出一個很好的可擴展的框架,所以對于如SELinux卸載攻擊、文件隱藏等新近出現的安全攻擊無所適從或較難改造適應。
為此,本文的主要工作和貢獻是,提出一種輕量級的基于Kprobes內核調試機制和監視器內核線程的在線檢測方法。一方面,基于Kprobes內核調試機制,在內核關鍵函數或系統調用的入口、出口甚至中間某些特定位置設定探測點,插入關于相關內核數據結構的記錄操作和一致性驗證的代碼段。另一方面,創建系統啟動初始化數據的備份,設立監視器內核線程kverifyd,周期性檢查內核中具有不變性的靜態數據是否發生過修改,如果發生變化,則及時恢復。驗證實驗表明,該方法能夠及時并有效地發現可疑的非控制數據攻擊,同時給安全人員提供了一種可以借鑒和可擴展性的檢測模型。
內核非控制數據攻擊通過修改內核中的一些關鍵數據來達到隱藏攻擊痕跡和誘發內核紊亂的目的。當前的操作系統內核管理著成千上萬的非控制數據結構,亦即那些不影響程序執行流程的數據,且其中很多數據結構(如鏈表、哈希表、指針變量等)的取值或狀態正確與否直接關系到內核的安全與穩定。內核非控制數據攻擊主要修改的就是這些非控制類關鍵數據。Riley[16]在其文中明確指出,非控制數據攻擊無需攻擊者注入惡意代碼,只需要攻擊者巧妙地修改相關數據以達到隱匿蹤跡、留下后門、紊亂內核的目的。
常見的內核非控制數據攻擊流程(如圖1所示)一般如下:攻擊者通過掃描內核符號表/proc/kallsyms獲取欲攻擊數據結構的入口參照地址(對于文件隱藏而言,指磁盤高速緩存數組bh_lrus;對于進程隱藏而言,指進程的pid哈希表;對于SELinux失效攻擊而言,指安全操作指針security_ops和default_security_ops)。此處的欲攻擊數據結構的入口參照地址是一個虛擬地址,通過自編地址轉換函數將其轉換成對應的內存物理地址。非控制數據結構的具體篡改一般基于內存映像文件/dev/mem來進行,后者是文件系統中用于訪問內存的接口文件,把文件指針調整為欲修改數據結構所對應的物理地址,就可修改對應數據取值和實現攻擊目的。

圖1 攻擊過程流程圖
本文主要討論進程隱藏、文件隱藏、SELinux失效和資源消耗型等四類內核非控制數據攻擊[16,17]的在線檢測。就進程隱藏類非控制數據攻擊而言,其一般通過修改進程哈希表,從中刪除對應進程表項,從而隱藏特定用戶進程;但由于在運行隊列中仍然保留有該用戶進程,所以被隱藏的用戶進程依然被調度執行。就文件隱藏類非控制數據攻擊而言,攻擊者通過修改被隱藏文件所在目錄的磁盤高速緩存中目錄項記錄長度,將被隱藏文件之前一目錄項記錄長度覆蓋被隱藏文件目錄項,這樣在用戶空間使用文件查看命令的時候無法從高速緩存獲取被隱藏文件信息即可達到隱藏的目的。就SELinux失效型非控制數據攻擊而言,攻擊者在SELinux安全模塊已加載的情況下,將安全操作指針security_ops指向default_security_ops,使得其中與安全策略相關的函數指針全部為空,導致SELinux無法正常工作。就資源消耗型非控制數據攻擊而言,攻擊者通過修改DMA、HIGHMEM、NORMAL等三類物理內存區域的低限閾值和制造內存緊張假象。鑒于內存管理器在發現空閑物理頁面數量低于一定水平的時候,會啟動頁交換內核線程kswapd,強制通過內存與外存之間不斷的頁面置換來緩解內存頁緊張狀況。然而實際上,物理內存可用空間充足,并沒有出現空閑物理空間不足的情況。
相關研究表明,在內核安全防護中,必須加強防范非控制數據攻擊,以防止攻擊者修改非控制數據和擾亂系統內核。
自Linux操作系統面世以來,Linux內核的代碼量和復雜程度不斷增加,其內核數據結構的分析亦日漸困難。相對于內核控制數據而言,內核非控制數據本身的變化規律更難把握,且無法用分析控制數據的方法來分析非控制數據。為降低內核非控制數據分析的難度和提高其在線檢測分析的可行性,本文試圖構建根據數據動/靜態特性采取不同分析檢測機制的解決方案,也就是基于Kprobes內核調試機制和監視器內核線程的在線檢測方法(如圖2所示)。前者用于監控內核關鍵函數的執行和檢查相關動態數據的一致性,后者則通過設立專門的內核線程來實現靜態內核數據的持續檢測和不變性驗證。

圖2 非控制數據攻擊在線檢測總體框架
本文實驗原型KNCDefender是基于Ubuntu10.04LTS Linux 2.6.32.27內核版本、gcc 4.4.3及C語言開發完成的。
加載啟用在線檢測模塊KNCDefender之后,其首先初始化檢測用基礎數據(包括內核非控制動態數據和內核非控制靜態數據)。接下來,便進入內核非控制數據的在線分析及攻擊檢測循環。對于動態變化性質的數據結構,利用注冊Kprobes鉤子函數的方式來監控內核關鍵函數的執行,檢查相關聯數據結構之間的一致性。對于靜態不變性質的內核非控制數據(如各物理內存區的頁面數閾值pages_low,pages_min,pages_high等),設立監視器內核線程監控它們的變化情況,一旦發現異常變化,則及時計算和恢復到正確狀態。相關監視及檢測分析結果應實時同步輸出到用戶層,即寫入klogd日志系統中。同時,在原型實現時,把相關操作函數執行不頻繁的某些動態數據的一致性檢查功能也放到了監視器內核線程中。
2.1 內核數據分析基本思路
(1) 動態數據結構的一致性分析
內核中的動態數據結構數量龐大,但就類型來說,主要包括鏈表、哈希表、內核先進先出隊列、映射、紅黑樹等。在內核的運行過程中,一些數據結構取值或其所含分量取值伴隨有關操作經常會發生變化。分析相關動態數據結構之間所維持的一致性,就是利用Kprobes內核調試機制在引發數據變化的操作函數的特定位置設置探測點,使更新對應檢測用基礎數據之后,接著比較相關聯的所有數據結構的內容,若出現不一致的情況,則可判斷為可疑攻擊或潛在威脅。
(2) 靜態數據結構的不變性分析
對于內核中的靜態數據結構,主要是一些自內核啟動以后保持不變的簡單變量。要想對它們重新賦值和并使之生效,往往需要重啟系統內核。一般情況下,這些變量的取值在內核運行過程中應保持不變,且它們對內核具有較大的影響作用。譬如前面提到的關于各物理內存區的頁面數閾值的三個變量便是典型的靜態性內核非控制數據變量。對于此類變量需在攻擊檢測模塊啟動初始化時就設法收集它們的初始取值,并在監視器內核線程中定期比較相關變量的當前取值與初始取值。若有不同,便可判斷為可疑攻擊或潛在威脅。
2.2 Kprobes內核調試機制
Kprobes內核調試機制在Linux 2.6內核以后引入,用于動態調試內核和收集內核信息。其由Dprobe項目派生而來,是一種輕量級的非破壞性工具,可用來監控內核中的任何函數、被執行指令以及一些異步事件。
Kprobes內核調試機制實現了三種類型的探測點(即kprobe、jprobe、kretprobe)。kprobe探測點可以設置在任何指令位置,對應注冊方法為register_kprobe(struct kprobe *kp)。jprobe探測點一般設置在函數的入口處,以方便訪問函數的參數,對應注冊方法是register_jprobe(struct jprobe *jp)。kretprobe又稱返回式kprobe,顧名思義,就是在函數返回處設置探測點,從而在函數返回之前進行探測處理,對應注冊方法是register_kretprobe(struct kretprobe *rp)。其中jprobe和kretprobe均是對kprobe的封裝和特殊化處理,對應使用方法和工作原理都與kprobe類似。
作為Kprobes內核調試機制的核心和基礎,kprobe所涉關鍵數據結構定義如下:
struct kprobe {
struct list_head list;
/* 用于連接多個kprobe的鏈表*/
kprobe_opcode_t *addr;
/* 探測點地址*/
const char *symbol_name;
/*用戶指定的探測點符號*/
kprobe_pre_handler_t pre_handler;
/*探測點之前調用的處理函數*/
kprobe_post_handler_t post_handler;
/* 探測點之后調用的處理函數*/
kprobe_fault_handler_t fault_handler;
/*出錯處理函數 */
struct arch_specific_insn ainsn;
/*原指令的拷貝*/
……
/*其它*/
};
就kprobe探測(其工作機理如圖3所示)而言,首先應選定被監視或跟蹤的函數的特定位置設置探測點,備份探測點處原指令、注冊kprobe結構,進而利用系統內核的異步工作方式在相應中斷的notifier_call_chain中注冊對應處理函數,并用int 3中斷指令來替代探測點處原指令。在系統內核運行過程中,當CPU執行到探測點時,引發int 3中斷。在保存CPU寄存器內容及現場信息之后,執行3#中斷處理函數及其notifier_call_chain中注冊的所有notifier函數(即pre_handler函數指針所指向的函數)。然后單步執行先前備份的探測點處原指令,執行結束后并引發調試異常和int 1中斷,執行對應中斷處理操作及post_handler函數指針所指向的函數。其整個過程都是禁止搶占和關中斷的,最終返回探測點處并從對應下一條指令起繼續執行。

圖3 kprobe工作原理
Kprobes內核調試機制是本文內核非控制數據攻擊在線檢測框架的核心所在。通過在動態數據操作函數特定位置設置和注冊探測點,使內核執行到相關探測點時,順次調用精心設計的內核數據分析處理函數,從而實現相關聯內核數據結構間一致性的檢查驗證。
2.3 監視器內核線程
線程是現代操作系統為了降低調度開銷和提高多處理器運行效率而建立的新概念。對于Linux操作系統來說,線程與進程并沒有太大的區別,線程被看作是共享進程地址空間的進程,內核同樣為它們分配進程控制塊(struct task_struct),只不過其內存地址指針(mm)為NULL。在Linux內核中,有時需要執行一些后臺操作,且這種任務通常使用只存在于內核空間和獨立運行于內核空間的進程,即內核線程來完成。內核線程具有輕量型特點,同普通進程一樣參與調度和搶占處理。常見的內核線程有頁交換線程Kswapd、中斷線程Ksoftirqd等。需要指出的是,內核線程只可以由其它內核線程創建,且所有內核線程都源自于系統的kthreadd內核進程。
就本文內核非控制數據攻擊在線檢測方法而言,通過創建內核線程kverifyd來擔當內核數據不變性分析的監視器,周期性進行相應數據結構內容或取值的比較,同時與Kprobes內核調試機制協同工作,從而最終實現內核非控制數據攻擊所引發的不一致性或異常變化的檢測。監視器內核線程實現偽代碼如下所示:
verify_thread(void)
{
allow_signal(SIGKILL);
//允許本線程響應SIGKILL信號
allow_signal(SIGTERM);
//允許本線程響應SIGTERM信號
do {
check_zone()
//進行各物理內存區檢查
check_selinux_valid_status()
//檢查SELinux的有效狀態
…
set_current_state(TASK_INTERRUPTIBLE);
//設置線程狀態
schedule_timeout(10 * HZ);
//設置調度周期
} while (!signal_pending(current));
//線程退出狀態檢查
}
為檢驗上述在線檢測方法及KNCDefender原型的有效性,本文針對Linux2.6.32.27內核進行了包括進程隱藏、文件隱藏、SELinux失效攻擊、資源消耗型等內核非控制數據攻擊在內的一系列在線檢測驗證實驗。
3.1 進程隱藏檢測
就Linux內核進程管理而言,進程哈希表用于快速查找指定進程,而進程鏈表則是由0號進程開始的所有存活進程連接在一起形成的鏈表。對于Linux進程調度來說,首先基于CFS公平調度算法從進程鏈表中選取合適的進程,構建起用紅黑樹來組織的可運行進程隊列,然后再從其中挑選出合適的進程分配處理器和加以執行。進程隱藏攻擊原理是將惡意進程從進程哈希表中移除,但由于其依然保留在進程鏈表中,所以,盡管利用進程查看操作無法顯示被隱藏的惡意進程,但當CFS調度時,惡意進程仍然能夠被調度和執行。
關于進程隱藏的在線檢測,我們利用Kprobes內核調試機制監視進程的創建、消亡及相關數據結構,同時在監視器內核線程kverifyd中分析進程哈希表和進程鏈表的一致性。具體而言,分別利用kretprobe、kprobe來監視進程創建時拷貝函數copy_process和進程退出函數do_exit的執行,并且同步更新進程檢測用數據結構LIST_HEAD(cur_list)鏈表(其用于記錄當前內核所管理的所有進程)。不言而喻,其間主要設置了兩個探測點,相關結構體變量定義如下:
struct kretprobe do_fork_kretp = {
.handler = fork_handler,
//處理函數
.maxactive = 20,
//被探測函數可以被同時探測的實例數
.kp.symbol_name = ″copy_process″,
//被監視函數
};
struct kprobe do_exit_kp = {
.pre_handler = exit_handler_pre,
//預處理函數
.fault_handler = exit_handler_fault,
//錯誤處理函數
.symbol_name = ″do_exit″,
//被監視函數
};
監視器內核線程kverifyd調用is_hlist_exist(proc->pid)來分析判斷是否每個存活進程(包括處于運行和睡眠狀態的所有進程)都在進程哈希表中。若發現不在進程哈希表中的進程,則判斷為隱藏進程,并立即將其終止,同時記入系統內核日志,以方便通過cat /proc/kmsg內核日志輸出操作看到相應分析處理結果。
進程隱藏攻擊與檢測示例如圖4所示。其中,使用包含死循環的程序malware.o來模擬惡意程序,進程隱藏攻擊試圖隱藏該惡意程序和使其從進程列表中消失。當惡意程序malware.o啟動執行且進程隱藏攻擊還未奏效時,可以在進程列表中看到進程號為9696的惡意程序malware.o(參圖4①)。而當發動進程隱藏攻擊、指定進程號、使惡意進程malware.o隱藏之后,可以看到惡意程序已經不在進程顯示列表中了(參圖4②)。但此時我們依然可以從惡意程序啟動執行終端發現其還在運行、并不斷輸出“I’m a malware”(參圖4③)。啟動運行本文非控制數據攻擊在線檢測模塊KNCDefender,能夠發現內核進程哈希表和進程鏈表的不一致性,找到可疑的9696號隱藏進程并發送SIGKILL信號終止其運行(參圖4④⑤所示)。

圖4 進程隱藏攻擊與檢測示例
3.2 SELinux失效攻擊檢測與恢復
Linux安全模塊(LSM)框架支持SELinux、apparmor、smack等訪問決策模塊。每個訪問決策模塊都是通過xxx_init()調用register_security()函數向LSM框架加以注冊的。一旦注冊成功,即可實施相應的訪問控制決策操作。但如果注冊時已有其它安全模塊注冊生效,則本次注冊失敗。換句話說,只有等前一個安全訪問決策模塊卸載之后,才可以加載下一個安全訪問決策模塊。Linux安全模塊提供了兩類對安全鉤子函數的調用,一類用于管理內核對象的安全域,另一類用于仲裁對這些內核對象的訪問控制。對安全鉤子函數的調用具體根據由全局變量security_ops所指向的安全操作結構體中的函數指針(即鉤子)的設置來實現。注冊安全模塊實際上就是將security_ops安全操作指針指向對應安全訪問決策模塊的安全操作實現函數。SELinux失效攻擊的原理是,在SELinux已經注冊加載的情況下,將security_ops指針指向default_security_ops結構體變量(許多Linux系統啟動時default_security_ops并未設定為支持SELinux訪問控制策略),從而迫使系統無法實施SELinux安全策略及訪問控制決策,當然也無法進行SELinux 的permissive模式和enforcing模式之間的切換。為此,內核非控制數據攻擊在線檢測方案及KNCDefender原型在監控內核啟動加載的一開始,便須獲取security_ops的初值,并將其保存在檢測模塊基礎數據結構,即struct lsm_status current_lsm結構變量中。系統運行過程中,利用監視器內核線程kverifyd定時檢查security_ops所指向的訪問決策模塊,并與檢測模塊中保存的訪問決策模塊相關信息進行比較,若二者不一致,即若security_ops指向default_security_ops,但內核啟動時已經加載了SELinux安全模塊,則說明其間發生了SELinux失效攻擊。
SELinux失效攻擊的整個過程如圖5所示。執行攻擊程序attack-selinux.py的前后,我們可以發現SELinux執行模式切換、文件安全屬性顯示等SELinux安全相關操作結果明顯不同。

圖5 SELinux失效攻擊示例
在本文內核非控制數據攻擊在線檢測原型KNCDefender啟動運行的情況下,SELinux失效攻擊會被及時發現和安全處理(如圖6所示)。圖6中①表示攻擊前后文件安全屬性對比,并沒有發生變化。這是因為KNCDefender在線檢測模塊在kverifyd監視器中通過執行SELinux失效攻擊檢查,及時發現了不一致性情況,并通過修復security_ops相關函數指針使其指向自內核啟動以來所加載的SELinux訪問決策模塊(如圖6中②所示)。

圖6 SELinx失效攻擊檢測與修復示例
3.3 文件隱藏檢測
攻擊者經常會隱匿它們在系統中留下的蹤跡或后門,從而方便其以后可以繼續竊取用戶信息或開展破壞系統的其他攻擊,其間不少蹤跡和后門都體現為惡意程序文件。顯然,如果用戶因此不能及時發現或者根本就發現不了被隱藏的惡意程序相關文件,那造成的安全后果是很嚴重的。內核非控制數據攻擊中的文件隱藏,就是采取某種處理措施使得攻擊者在系統中留下的惡意文件對于用戶(如使用ls -a和find命令時)是不可見的,但是它們客觀存在、可以被攻擊者訪問和加以利用。
一般而言,文件隱藏的第一步,就是讀取被隱藏文件所在的目錄,使內存的磁盤高速緩存的塊緩沖中載入被隱藏文件所在目錄的內容,也就是該目錄下的所有文件的目錄項。對于ext2文件系統來說,其目錄微觀結構如圖7所示。

圖7 Ext2文件系統之目錄微觀結構
就Linux文件訪問而言,為了提高系統性能,通常會維護一個磁盤高速緩存指針數組bh_lrus[8],其中的元素指向最近訪問的8個緩沖區首部(即用于描述每個塊緩沖的buffer_head結構體)。通過讀取被隱藏文件所在的目錄,bh_lrus[0]便指向了被隱藏文件所在目錄的塊緩沖,于是只要修改所隱藏文件在其所在目錄的對應前一目錄項的記錄長度Record Length,并使該前一目錄項覆蓋被隱藏文件的目錄項,便可使執行ls、find等查看文件命令時,無法從磁盤高速緩存中讀取到被隱藏文件對應的目錄項,從而使用戶無法看到文件和達到文件隱藏的目的。當然,相關文件依然存在并可采用絕對路徑等方式進行訪問操作。
在本文內核非控制數據攻擊在線檢測方法及原型KNCDefender中,試圖監控目錄項讀取函數vfs_readdir()的執行過程,利用Kprobes內核調試機制中的jprobe在該函數入口處設置探測點,以獲取當前目錄的目錄項結構dentry及父、子目錄項鏈表。實際讀取目錄時,bh_lrus[0]指向了該目錄的緩沖區頭部,從而可以直接獲取該目錄的內容。通過比較該目錄文件內容和父子鏈表的一致性,便可確認被隱藏的文件。需要特別指出的是,正常的文件刪除也會采用和文件隱藏一樣的策略來覆蓋目錄項,但其同時會把文件的目錄項對象結構dentry鏈接到超級塊的孤兒鏈表中。因此,若出現對應目錄項對象dentry的父子鏈表中存在某個文件,而該文件不在塊緩沖中且不存在于孤兒鏈表中,則可判斷出現了文件隱藏攻擊。
文件隱藏攻擊示例如圖8所示。執行文件隱藏程序attack-filehide.py,將需要隱藏的惡意程序配置文件malware.cfg隱藏,可以發現該文件用ls -a和ls命令操作是無法顯示出來的,但通過指定文件路徑名依然可以找到并可以訪問。

圖8 文件隱藏攻擊示例
采用本文內核非控制數據攻擊在線檢測方法及KNCDefender原型(如圖9所示),可以檢查發現被隱藏文件并在內核日志中輸出相關信息。于是,在終端上通過dmesg | grep’Hidden’ -rn過濾內核日志輸出結果,可以找到對應被隱藏文件malware.cfg及相應索引結點號的檢查確認信息。

圖9 文件隱藏檢測示例
3.4 資源消耗型攻擊檢測
操作系統內存管理子系統為了滿足系統內核和用戶程序的正常運行,總是試圖確保內存始終擁有足夠多的空閑空間。為此,它采用內存平衡算法及各物理內存區的頁面數閾值(pages_low,pages_min,pages_high)來估計內存分配的壓力。當相應類型物理內存的可用空閑頁面數低于pages_low時,內存管理子系統啟動異步模式的內外存對換過程,開始將一些無用的內存頁換出到外存,并一直持續到內存中可用空閑頁面數達到pages_high的水平。而如果可用的空閑頁面數低于pages_min時,內存管理子系統將啟動同步模式的內外存對換過程。資源消耗性攻擊的原理是,惡意主動調整這三個閾值,將它們設定到接近于甚至超過對應類型物理內存的頁面總數,而由于當前可用空閑頁數量低于頁面總數,這樣勢必強迫內存管理子系統啟動內外存對換操作,并造成了系統內存嚴重短缺的假象。
對于本文提出的內核非控制數據攻擊在線檢測方法,在內核啟動加載伊始,便收集獲取到各物理內存區(通常即DMA、Normal、HighMem)的這三個閾值,并存放到檢測用數據結構數組struct zone_status zones[3]中。系統運行過程中,監控用于支持熱插拔而引入的物理內存區閾值重置操作內核函數setup_per_zone_wmarks()的執行過程,并在監視器內核線程kverifyd中定期比較各區的閾值、頁面總數量以及zones數組中各區的取值。若當前某個區的閾值大于其對應頁面總數量時,將其恢復到zones數組中保持的最近更新的取值。當重新設定每個區的閾值時,亦須同步更新檢測模塊中zones數組元素相應取值。
一旦發生資源消耗型攻擊,將造成內存緊張假象,從而使頁交換線程kswapd被頻繁調度、內外存對換不斷發生、交換分區的使用率急劇上升(從0%變為7.7%)。此時,文件操作相關的各種性能指標如文件拷貝、壓縮、模塊編譯時間開銷等亦大幅度增加(如圖10所示)。之后,系統出現卡頓甚至嚴重影響相關操作。

圖10 資源消耗型攻擊對文件操作性能指標的影響
運用本文內核非控制數據攻擊在線檢測對應原型KNCDefender的情況下,其能夠及時發現各區閾值被惡意修改問題,并立刻加以恢復(檢測前后對比參見圖11中①②)。

圖11 資源消耗型攻擊及檢測示例
4.1 相關工作比較
從可檢測的非控制數據攻擊種類數量來看,本文方法具有明顯優勢(如表1所示)。

表1 與相關方法檢測效果對比
另外,本文方法對于安全人員來說,允許根據內核的數據結構關系進行拓展,方便更新升級以檢測和防護更多的攻擊類型,所以具有更好的可擴展性。
4.2 性能測試評估
為科學評判本文方法對系統性能可能造成的影響,我們利用相關測評工具軟件對加載內核非控制數據攻擊檢測模塊前后的系統性能,從延遲和帶寬等兩個方面進行了測試和分析。
本文實驗平臺硬件配置為Intel(R) Core(TM) i5-4200M 2.5 GHz處理器,內存1 GB。采用Lmbench進行系統性能測評,其是為UNIX/POSIX定制的一套簡單可移植并符合ANSI/C標準的微型測評工具。
(1) 延遲測評
延遲測評主要考量I/O相關系統調用(如read、write、fstat、select、open/close)及進程創建操作(fork+{exit, execve, /bin/sh})的執行時間延遲等(分別參見圖12、圖13所示)。不難看出,加載本文非控制數據攻擊檢測模塊之后,并未對系統調用或進程創建操作造成明顯延遲后果。

圖12 系統調用延遲對比

圖13 進程創建操作延遲對比
(2) 帶寬測評
帶寬測評主要考量套接字、管道及文件寫操作的帶寬(參見表2所示)。顯然,加載本文在線攻擊檢測模塊之后,各類帶寬均有小幅下降,但在可容忍限度之內。

表2 Lmbench帶寬測試結果
本文提出了一種基于Kprobes內核調試機制和監視器內核線程的針對內核非控制數據攻擊的輕量級在線檢測方法。該方法能夠針對目前進程隱藏、文件隱藏、SELinux失效攻擊、資源消耗型攻擊等各種典型非控制數據攻擊進行有效的實時檢測,同時具有一定的防護功能。進一步來說,該方法可以保證內核在運行過程中,不會因為攻擊者修改內核數據結構而引發欺騙用戶或導致系統穩定性失控的問題。實驗結果和性能評估表明,我們的方法是完全輕量級的、可擴展的和有效的,可為相關安全人員防護內核非控制數據攻擊提供有益的借鑒和參考。
[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].軟件,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。中央高校基本科研業務費專項基金項目(2009JBM019);國家留學基金項目(201307095025)。黃杰,碩士生,主研領域:操作系統安全。翟高壽,副教授。
TP316
A
10.3969/j.issn.1000-386x.2017.02.059