• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      Linux 2.6內(nèi)核下LKM安全性研究

      2011-06-05 10:48:06熊盛武
      電子設(shè)計工程 2011年12期
      關(guān)鍵詞:鉤子鏈表內(nèi)核

      徐 敏 ,熊盛武

      (武漢理工大學(xué) 湖北 武漢 430070)

      可加載內(nèi)核模塊[1](Loadable Kernle Module(LKM))作為對Linux宏內(nèi)核結(jié)構(gòu)的一種改進(jìn),它可以在不需要重新編譯內(nèi)核下被動態(tài)加載,作為內(nèi)核級代碼存在于內(nèi)核空間,能夠訪問內(nèi)核的重要數(shù)據(jù)結(jié)構(gòu)。通常情況下模塊通過合理修改系統(tǒng)的控制轉(zhuǎn)移地址或添加門來和系統(tǒng)聯(lián)系成一個整體,如果是惡意模塊,它就可以進(jìn)行多種非法操作,留下系統(tǒng)級后門。

      1 LKM攻擊方法

      1.1 LKM系統(tǒng)調(diào)用劫持

      在Linux中劫持系統(tǒng)調(diào)用的思想是修改程序執(zhí)行過程中跳轉(zhuǎn)的目的地址。在Linux 2.4.18內(nèi)核以前,是直接對sys_call_table[2]表進(jìn)行修改,sys_call_table表是保存所有系統(tǒng)調(diào)用函數(shù)地址的指針數(shù)組,直接用自定義的函數(shù)地址替換原來的地址,即可實現(xiàn)對系統(tǒng)調(diào)用的劫持。在Linux2.4.18內(nèi)核以后,為了解決這個安全問題,sys_call_table表不能直接導(dǎo)出,利用中斷描述符表IDT及字符設(shè)備文件/dev/kmem依然可以查找到sys_call_table表的地址,可以通過sIDT指令獲取到中斷向量表的地址,然后通過讀取/dev/kmem來定位到該地址,然后通過調(diào)用read函數(shù)或者mmap函數(shù)的方式來讀取出0×80中斷描述符的內(nèi)容,然后從其中可以提取出sys_call_table表的地址。2.6內(nèi)核采用被稱為“快速系統(tǒng)調(diào)用”的sysenter指令來完成從用戶態(tài)到內(nèi)核態(tài)的快速切換方法,這是一種不檢查特權(quán)級的系統(tǒng)調(diào)用,在實際情況下,發(fā)生系統(tǒng)調(diào)用時的特權(quán)檢查工作會浪費(fèi)許多時間且沒有必要,由于通過INT$0×80指令進(jìn)入系統(tǒng)調(diào)用時,其門描述符的描述符特權(quán)級DPL為3,而系統(tǒng)調(diào)用在正常情況下也是從用戶態(tài)進(jìn)入內(nèi)核態(tài),故進(jìn)入之前的權(quán)限當(dāng)前特權(quán)級CPL也是3,權(quán)限提高前后級別不變,則CPU檢查門描述符的DPL和調(diào)用者的CPL就沒有必要。根據(jù)sysenter指令的實現(xiàn)原理,MSR_IA32_SYSENTER_EIP寄存器存放著指令到內(nèi)核態(tài)的跳轉(zhuǎn)地址,只需要通過改變MSR_IA32_SYSENTER_EIP寄存器來完成劫持。首先利用rdmsr指令把系統(tǒng)定義的sysenter指令的目的地址讀到某一變量old_sysenter,然后利用wrmsr指令將自定義的函數(shù)地址寫到MSR_IA32_SYSENTER_EIP寄存器,撤消截獲的方法是將old_sysenter通過wrmsr指令寫回到MSR_IA32_SYSENTER_EIP寄存器。

      在Linux 2.6內(nèi)核最新版本中,為了防止惡意模塊通過IDT表和/dev/kmem設(shè)備找出sys_call_table表的地址,/dev/kmem設(shè)備也不再導(dǎo)出。但對于惡意的LKM,只要它躲過安全檢查進(jìn)入到內(nèi)核態(tài)下,它仍然可以利用中斷描述符表中的0x80中斷以及MSR_IA32_SYSENTER_EIP寄存器中的跳轉(zhuǎn)地址來搜索內(nèi)存,尋找到sys_call_table表的地址來完成系統(tǒng)調(diào)用劫持,這是需要改進(jìn)的地方,在后面會討論這一點。

      1.2 LKM注射技術(shù)

      LKM注射攻擊[3]通過感染系統(tǒng)正常的LKM,在不影響原有功能的情況下將攻擊模塊鏈接到該LKM中。LKM的目標(biāo)文件格式是ELF格式,其中有兩個重要節(jié).symtab節(jié)和.strtab節(jié),.strtab節(jié)是一個表示函數(shù)或變量名的非空字符串列表,.symtab節(jié)是個結(jié)構(gòu)體數(shù)組,結(jié)構(gòu)體元素是struct Elf32_Sym類型的,其中字段st_name是.strtab節(jié)的索引,字段st_value表示.strtab節(jié)中函數(shù)或變量的地址值。通過檢查.strtab節(jié)里的字符串(如init_module),可以定位模塊中原先init函數(shù)的地址,如果修改這個字符串,則可以在模塊被加載時只執(zhí)行修改后的字符串所對應(yīng)的惡意函數(shù)。如果在這個惡意函數(shù)中再調(diào)用原來的函數(shù),那么就可以使這種攻擊變得更加隱秘。由于Linux 2.6內(nèi)核模塊子系統(tǒng)被完全重寫,修改.strtab的方法已經(jīng)失效,即使修改了.strtab節(jié)中init_module,運(yùn)行的始終是原來的init_module。因為Linux 2.6內(nèi)核符號的重定位不再需要.strtab節(jié)的參與,攻擊的目標(biāo)從.strtab節(jié)變成了.rel.gnu.linkonce.this_module重定位節(jié)中的Elf32_Rel項,被注射攻擊的模塊會通過遍歷.rel.gnu.linkonce.this_module節(jié)中Elf32_Rel項, 如 orig_init_idx== ELF32_R_SYM (rel->r_info), 就 將rel_r_info的symbol部分替換成被被注射模塊函數(shù)的索引號。

      1.3 LKM隱藏技術(shù)

      由于在加載新的LKM后會在/proc/modules文件中留下記錄,只需利用/sbin/lsmod命令就可以查看模塊信息。如果能夠使該攻擊模塊在/proc/modules中不被顯示,就能使系統(tǒng)管理員無從察覺該攻擊模塊的痕跡,從而實現(xiàn)了隱藏。為了完成該攻擊模塊的隱藏,有大致3類方法。

      1)將該攻擊模塊從module_list鏈表中摘下而不真正地將它從內(nèi)存中卸載。由于該模塊加載時通過宏EXPORT_SYMBOL輸出的變量和函數(shù)已經(jīng)被其他模塊和內(nèi)核所引用,故從鏈表中摘除該攻擊模塊并不影響其功能。

      2)截獲并替換查詢模塊信息的系統(tǒng)調(diào)用sys_query_module()函數(shù),在替換后的調(diào)用中首先執(zhí)行原來的sys_query_module()函數(shù),把所有模塊信息讀到內(nèi)存某個地方,然后對這些信息進(jìn)行查詢并過濾掉需要隱藏的模塊信息。

      3)不是把自己從module_list鏈表中刪除,而是把某個正常的模塊從該鏈表刪除,然后將該攻擊模塊改名成剛才被刪除的正常模塊。但這樣會導(dǎo)致系統(tǒng)在使用這個被刪除的正常模塊時出現(xiàn)問題,不利于自己的隱藏。

      在Linux 2.6內(nèi)核中,絕大部分內(nèi)核數(shù)據(jù)結(jié)構(gòu)都改用雙向鏈表組織,模塊也不例外。因為雙向鏈表從鏈表中間刪除數(shù)據(jù)項比單向鏈表簡單,而且還可以從后往前遍歷鏈表。

      2 LSM框架與LKM安全

      2.1 LSM框架原理

      LSM[4]框架為了實現(xiàn)一個通用的訪問控制框架,為安全模塊的開發(fā)提供一致性接口。它是在內(nèi)核對象的數(shù)據(jù)結(jié)構(gòu)中添加一個透明安全字段,并在內(nèi)核源代碼的適當(dāng)位置放置鉤子函數(shù),LSM框架只提供這些字段以及這些鉤子函數(shù)的調(diào)用接口,字段的分配、釋放、管理等是由安全模塊處理的,鉤子函數(shù)的實現(xiàn)是在安全模塊完成的,其用來對內(nèi)核對象的訪問權(quán)限進(jìn)行判斷,LSM框架鉤子函數(shù)結(jié)構(gòu)如圖1所示。LSM框架指定的內(nèi)核對象有task_struct(進(jìn)程)、super_block(文件系統(tǒng))、inode(文件、管道、套接字)、sk_buff(套接字緩沖區(qū))等等。LSM框架提供了兩種鉤子函數(shù),一種用來分配、釋放、管理內(nèi)核對象的安全字段,如alloc_security、free_security;另一種用來對內(nèi)核對象進(jìn)行訪問控制。對這兩種鉤子函數(shù)的調(diào)用方式是security_ops->鉤子函數(shù)名,其中security_ops是指向struct security_opertaions結(jié)構(gòu)體的函數(shù)指針,這些鉤子函數(shù)被放置在內(nèi)核源代碼的某些關(guān)鍵點,以完成相應(yīng)安全檢查。

      還需要向LSM框架注冊安全模塊,安全模塊的注冊和注銷功能是由 register_security()和 unregister_security()函數(shù)分別完成的,注冊函數(shù)將設(shè)置全局表指針security_ops,使其指向這個安全模塊的鉤子函數(shù)表。一旦這個安全模塊被加載,就不會被后面的register_security()函數(shù)覆蓋,直至這個安全模塊使用unregister_security()向LSM框架注銷。LSM框架只允許注冊一個主安全模塊,為了完善主安全模塊的不足,它還提供了輔助安全模塊的模塊堆棧機(jī)制:輔助安全模塊向主安全模塊注冊,使用mod_reg_security()和mod_unreg_security函數(shù)分別向主安全模塊注冊和注銷。

      圖1 LSM框架鉤子函數(shù)結(jié)構(gòu)圖Fig.1 Structure of LSM frame’s hook

      2.2 LSM框架對LKM安全的保障

      在Linux2.6內(nèi)核中,LSM框架對LKM安全的控制可以從模塊加載過程中得知,它主要是通過基于安全鉤子函數(shù)的調(diào)用來為系統(tǒng)的各種訪問控制提供可擴(kuò)展的安全模塊框架。模塊是通過insmod程序進(jìn)行加載的,insmod中的執(zhí)行過程是先調(diào)用grabfile函數(shù)在用戶態(tài)下獲取文件的內(nèi)存映象,然后調(diào)用sys_init_module函數(shù)進(jìn)入內(nèi)核態(tài)進(jìn)行模塊鏈接。在grabfile函數(shù)中,需要調(diào)用security_inode_permission函數(shù)來對inode索引節(jié)點的訪問權(quán)限進(jìn)行檢查以及調(diào)用security_dentry_open函數(shù)來對文件打開權(quán)限進(jìn)行檢查。在sys_init_module函數(shù)中,需要調(diào)用security_capable函數(shù)進(jìn)行基于CAP_SYS_MODULE能力的加載權(quán)限的檢查。所以專門針對module的安全鉤子的調(diào)用只有 security_inode_permission、security_dentry_open、security_capable這3個函數(shù)。在攻擊方式的分析中,如果不導(dǎo)出sys_call_table表,LKM惡意程序需要訪問/dev/kmem文件,在LSM框架下,訪問文件的時候內(nèi)核會調(diào)用security_inode_permission函數(shù)以及security_inode_permission函數(shù)來對訪問文件的權(quán)限進(jìn)行檢查。在一些Linux 2.6最新內(nèi)核中,/dev/kmem文件不再導(dǎo)出。但惡意模塊仍然可以通過中斷描述符和MSR的方法搜索出sys_call_table表的起始地址,但這一方法的前提是這個惡意模塊已經(jīng)被加載到內(nèi)核中,這樣惡意模塊在加載的時候就需要這3個函數(shù)的檢查。這3個安全鉤子函數(shù)是基于進(jìn)程是否對文件具有訪問權(quán)以及對模塊加載權(quán),其具體的判斷準(zhǔn)則是以LSM模塊的具體實現(xiàn)為標(biāo)準(zhǔn)。

      2.3 LKM框架與安全模塊管理器

      由于在LSM框架下內(nèi)核對象的數(shù)據(jù)結(jié)構(gòu)中的安全域指針只有一個,這種設(shè)計決定了LSM框架只能同時支持一個安全模塊,多個獨立設(shè)計且分別具有自己相應(yīng)安全域的安全模塊,不能夠在LSM框架共存,即使采用模塊疊加技術(shù),本質(zhì)上還是只支持一個獨立安全模塊,因為主安全策略決定了從模塊的安全策略。為了真正解決這個問題,實現(xiàn)多個安全模塊策略綜合的安全模塊管理器(SMM)[5]就出現(xiàn)了,它支持多個獨立的安全模塊共存,可對多安全模塊進(jìn)行有效管理,且與LSM框架兼容。SMM也以LKM形式存在。裝載到內(nèi)核的安全模塊并沒有直接向LSM框架注冊,而是先在SMM注冊,即在安全模塊鏈表中添加一個節(jié)點。LSM框架首先調(diào)用SMM的鉤子函數(shù),再由SMM鉤子函數(shù)調(diào)用各個安全模塊中的安全鉤子函數(shù)。當(dāng)用戶進(jìn)程進(jìn)行系統(tǒng)調(diào)用時,系統(tǒng)調(diào)用內(nèi)要調(diào)用SMM中的鉤子函數(shù)進(jìn)行安全檢測,SMM把這個安全檢測交給各個獨立安全模塊分別進(jìn)行檢測,只要有一個安全模塊的檢測沒有通過,系統(tǒng)調(diào)用就會被SMM拒絕而退出整個檢測過程。最后SMM將各個安全模塊的檢測結(jié)果綜合并返回給系統(tǒng)調(diào)用,然后系統(tǒng)調(diào)用根據(jù)結(jié)果決定是否繼續(xù)執(zhí)行。當(dāng)然在SMM上加載多個安全模塊會增加系統(tǒng)開銷,且略大于各個單個安全模塊開銷的代數(shù)和,這主要是因為LSM和各個安全模塊之間多了SMM模塊。為此可以對多模塊的調(diào)用順序進(jìn)行算法優(yōu)化,而且可以引入Cache機(jī)制,來緩存一些安全檢測結(jié)果,從而來提高SMM的時間效率。另外為了適應(yīng)不同環(huán)境下特定的安全應(yīng)用,還可以通過設(shè)計策略開關(guān)靈活地進(jìn)行安全策略的動態(tài)選擇。SMM工作原理圖如圖2所示。

      3 SELinux模型與LKM安全

      3.1 SELinux模型

      LSM框架自身并不提供任何安全策略,它只是為安全模型提供了一致性接口。它使得各種不同的安全模型以內(nèi)核模塊的方式得到實現(xiàn),而且不需改動內(nèi)核源代碼以及重新編譯內(nèi)核。目前基于LSM框架實現(xiàn)的最主要的安全模塊主要有SELinux[6](安全增強(qiáng)型 Linux)、LIDS(Linux 入侵檢測系統(tǒng))、POSIX 1e Capabilities以及DTE(域和類安全增強(qiáng))。

      圖2 SMM工作原理圖Fig.2 Working principle of SMM

      SELinux模型的安全體系結(jié)構(gòu)被稱為Flask體系,其體系結(jié)構(gòu)如圖3所示,它是基于動態(tài)策略配置的MAC(強(qiáng)制訪問控制)子系統(tǒng),能夠支持較細(xì)粒度的權(quán)限管理,開始是以內(nèi)核補(bǔ)丁的方式實現(xiàn),在Linux 2.6內(nèi)核中是以模塊形式出現(xiàn)。SELinux由3部分組成:安全服務(wù)器,訪問向量緩存,對象管理器。安全服務(wù)器為獲得安全策略的決策判定提供通用接口,使其余部分保持安全策略的獨立性。訪問向量緩存AVC提供了從安全服務(wù)器獲得的訪問策略決策結(jié)果的緩沖區(qū),以減少性能開銷。對象管理器集成在內(nèi)核的各個子系統(tǒng),如進(jìn)程管理子系統(tǒng),文件子系統(tǒng),它從安全服務(wù)器或者訪問向量緩存AVC中獲得安全策略判定結(jié)果,然后應(yīng)用這些判定結(jié)果給進(jìn)程和對象的安全標(biāo)記賦值,最后根據(jù)這些安全標(biāo)記控制系統(tǒng)上的各種操作。

      圖3 FLASK體系結(jié)構(gòu)圖Fig.3 Architecture of FLASK

      3.2 SELinux模型保障LKM安全

      在傳統(tǒng)的安全機(jī)制下,Linux安全是基于自主存取控制(DAC)機(jī)制的,只要符合規(guī)定的權(quán)限,如規(guī)定的所有者和文件屬性(讀、寫、執(zhí)行)等,就可存取資源。一些通過setuid/setgid的程序就能形成嚴(yán)重的安全隱患,甚至一些錯誤的配置就可引發(fā)巨大漏洞,使系統(tǒng)被輕易攻擊。而SELinux則基于強(qiáng)制存取控制(MAC),透過強(qiáng)制性的安全策略,應(yīng)用程序或用戶必須同時符合DAC及對應(yīng)SELinux的MAC才能進(jìn)行正常操作,否則都將遭到拒絕或失敗,而這些問題將不會影響其他正常運(yùn)作的程序和應(yīng)用,并保持它們的安全系統(tǒng)結(jié)構(gòu)。

      LKM 注入攻擊一般是對/lib/modules/(uname-r)/kernel/下的模塊文件進(jìn)行修改,SELinux下的權(quán)限設(shè)置能限制對模塊文件的修改,為模塊文件的完整性提供保證,從而防止針對模塊文件的LKM注入攻擊。同時SELinux下的權(quán)限設(shè)置限制了惡意程序?qū)?dev/目錄下文件訪問和修改。由于進(jìn)行了基于CAP_SYS_MODULE權(quán)能的加載權(quán)限的檢查,阻止了許多獲取root權(quán)限后的惡意加載。

      雖然SELinux對LKM的安全有很好的保證,但是一旦由于訪問策略的設(shè)置失誤以及直接在原模塊代碼中植入惡意函數(shù)片段,這樣的LKM惡意模塊依然能鏈接進(jìn)內(nèi)核,由于LSM框架并沒有相應(yīng)的安全鉤子函數(shù)來保障諸如IDT表、sys_call_table表等內(nèi)核重要數(shù)據(jù)結(jié)構(gòu)的安全,惡意程序就可以利用這些信息進(jìn)行惡意攻擊。為此可以擴(kuò)展LSM框架,在內(nèi)核源代碼相應(yīng)關(guān)鍵點插入鉤子函數(shù)。由于LKM攻擊的根本特性是init_module函數(shù)的執(zhí)行,init_module函數(shù)能修改內(nèi)核數(shù)據(jù)中跳轉(zhuǎn)地址值,所以init_module的正確運(yùn)行是模塊安全的關(guān)鍵。如果能在init_module的前后進(jìn)行重要數(shù)據(jù)結(jié)構(gòu)內(nèi)容的檢測和恢復(fù),則可保障內(nèi)核重要數(shù)據(jù)結(jié)構(gòu)的安全,因此我們可以在init_module函數(shù)的前后位置各放置一個安全鉤子函數(shù),分別用于記錄重要數(shù)據(jù)結(jié)構(gòu)在init_module函數(shù)執(zhí)行之前的值以及在init_module函數(shù)執(zhí)行之后校驗這些數(shù)據(jù)結(jié)構(gòu)的值,從而防止已加載進(jìn)內(nèi)核的惡意模塊利用這些信息進(jìn)行攻擊。

      4 結(jié)束語

      針對LKM的攻擊手段有很多,以介紹Linux 2.4內(nèi)核下的LKM攻擊技術(shù)為切入點,重點介紹Linux 2.6內(nèi)核下LKM攻擊技術(shù)的原理和方法,同時著重分析了針對這些攻擊的防御體系LSM框架,針對目前的LSM防御體系只支持一個獨立安全模塊的不足,提出了安全管理器SMM的解決方案。通過分析已經(jīng)在Linux下實現(xiàn)的基于LSM框架的SELinux模型針對LKM安全性的作用以及不足之處,提出了使用LSM擴(kuò)展技術(shù)在init_module函數(shù)的前后位置各放置安全鉤子函數(shù)的解決方案。

      [1]博韋,西斯特.深入理解LINUX內(nèi)核[M].3版.陳莉君,張瓊聲,張宏偉,譯.北京:中國電力出版社,2007.

      [2]毛德操,胡希明.Linux內(nèi)核源代碼情景分析(上、下冊)[M].杭州:浙江大學(xué)出版社,2001.

      [3]耿顯虎.Linux下LKM安全的分析與改進(jìn)研究[D].成都:電子科技大學(xué),2008.

      [4]馬桂媛.基于通用訪問控制框架LSM的Linux安全內(nèi)核的研究[D].四川:西南交通大學(xué),2004.

      [5]李婷妤.基于LSM框架的安全模塊管理器的設(shè)計與實現(xiàn)[D].湖南:中南大學(xué),2008.

      [6]龔友.Linux下內(nèi)核級Rootkit檢測防護(hù)機(jī)制的研究 [D].成都:電子科技大學(xué),2009.

      猜你喜歡
      鉤子鏈表內(nèi)核
      萬物皆可IP的時代,我們當(dāng)夯實的IP內(nèi)核是什么?
      強(qiáng)化『高新』內(nèi)核 打造農(nóng)業(yè)『硅谷』
      基于二進(jìn)制鏈表的粗糙集屬性約簡
      跟麥咭學(xué)編程
      基于嵌入式Linux內(nèi)核的自恢復(fù)設(shè)計
      Linux內(nèi)核mmap保護(hù)機(jī)制研究
      誰和誰好
      快樂語文(2018年15期)2018-11-29 10:23:17
      基于鏈表多分支路徑樹的云存儲數(shù)據(jù)完整性驗證機(jī)制
      幸福的一家
      《脈望館鈔校本古今雜劇》穿關(guān)之“鉤子困帶”考
      中華戲曲(2017年2期)2017-02-16 06:53:24
      张家界市| 准格尔旗| 高州市| 红桥区| 平潭县| 玉门市| 枝江市| 宜君县| 托里县| 桦甸市| 肇源县| 塔城市| 温宿县| 天峻县| 方城县| 房产| 常州市| 天峨县| 阳东县| 牡丹江市| 四川省| 连平县| 巴楚县| 临漳县| 应城市| 湾仔区| 连州市| 思南县| 宜都市| 礼泉县| 邵东县| 凯里市| 天长市| 信阳市| 封开县| 临海市| 田东县| 山东省| 博野县| 平乐县| 金阳县|