本發(fā)明涉及計(jì)算機(jī)軟件開發(fā)領(lǐng)域,具體涉及一種在linux系統(tǒng)中對惡意軟件Rootkit的檢測和修復(fù)方法,本發(fā)明可以在不重新編譯內(nèi)核的基礎(chǔ)上,實(shí)現(xiàn)linux系統(tǒng)內(nèi)核級(jí)別的對惡意軟件Rootkit的檢測以及修復(fù),從而能夠有效檢測linux系統(tǒng)存在的異常狀況,提高linux系統(tǒng)的安全性。
背景技術(shù):
隨著計(jì)算機(jī)技術(shù)不斷發(fā)展,各種網(wǎng)站、移動(dòng)終端以及移動(dòng)終端上app服務(wù)的廣泛應(yīng)用,服務(wù)器系統(tǒng)的安全性問題越來越受到重視。linux系統(tǒng)作為服務(wù)器系統(tǒng)中重要的一員,采用Linux系統(tǒng)的服務(wù)器的使用數(shù)量也與日俱增,針對linux系統(tǒng)的各種木馬病毒也在不斷地更新。
Rootkit是linux系統(tǒng)上最為頑固的一種惡意病毒。Rootkit是一種特殊類型的malware(惡意軟件),之所以特殊是因?yàn)橛脩舨恢浪鼈冊谧鍪裁词虑?。Rootkit基本上是無法檢測到的,而且?guī)缀醪豢赡軇h除它們。雖然檢測工具在不斷增多,但是惡意軟件的開發(fā)者也在不斷尋找新的途徑來掩蓋他們的蹤跡。Rootkit幾乎可以隱藏任何軟件,包括文件服務(wù)器、鍵盤記錄器、Botnet和Remailer,許多Rootkit甚至可以隱藏大型的文件集合并允許攻擊者在計(jì)算機(jī)上保存許多文件,而用戶卻無法看到。Rootkit本身不會(huì)像病毒或蠕蟲那樣影響計(jì)算機(jī)的運(yùn)行,它可以悄無聲息的隱藏自己,然后為所欲為。如今很多手機(jī)系統(tǒng)采用的是安卓系統(tǒng),安卓系統(tǒng)使用的正是linux內(nèi)核,所以Rootkit同樣會(huì)發(fā)生在手機(jī)上,因?yàn)镽ootkit攻擊的自我隱藏性,我們很難發(fā)現(xiàn)并且鏟除被隱藏的文件和進(jìn)程。
針對上述問題,本申請發(fā)明了一種能夠在內(nèi)核級(jí)別檢測linux系統(tǒng)是否被Rootkit攻擊,并對linux系統(tǒng)做出修復(fù)的方法,可以在不影響linux系統(tǒng)業(yè)務(wù)的基礎(chǔ)上發(fā)現(xiàn)被隱藏的Rootkit文件和進(jìn)程,從而達(dá)到檢測和修復(fù)linux系統(tǒng)的效果。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明通過鍵入內(nèi)核模塊的方式對系統(tǒng)調(diào)用和函數(shù)的輸出來檢測是否被Rootkit攻擊,并通過HOOK技術(shù)修復(fù)被替換的系統(tǒng)掉調(diào)用,從而達(dá)到修復(fù)系統(tǒng)的結(jié)果。
本申請發(fā)明一種在linux系統(tǒng)中對惡意軟件Rootkit的檢測方法,其特征在于,該檢測方法具體包括如下步驟:動(dòng)態(tài)加載linux系統(tǒng)肉核模塊;輸出目前系統(tǒng)內(nèi)存中的系統(tǒng)調(diào)用和內(nèi)核級(jí)別函數(shù)的地址;將該輸出的系統(tǒng)調(diào)用和內(nèi)核級(jí)別函數(shù)地址內(nèi)容與預(yù)備好的地址表進(jìn)行比對;如果系統(tǒng)調(diào)用和內(nèi)核級(jí)別函數(shù)地址與預(yù)備的地址表不能對應(yīng),則表示系統(tǒng)已經(jīng)被Rootkit攻擊;如果系統(tǒng)調(diào)用和內(nèi)核級(jí)別函數(shù)地址與預(yù)備的地址表可以對應(yīng),則表示系統(tǒng)安全,未被攻擊。
所述的在linux系統(tǒng)中對惡意軟件Rootkit的檢測方法,其特征還在于,該預(yù)備好的地址表可以使用系統(tǒng)本身預(yù)留的系統(tǒng)調(diào)用map文件,也可以使用標(biāo)準(zhǔn)的內(nèi)核產(chǎn)生的map文件。
所述的在linux系統(tǒng)中對惡意軟件Rootkit的檢測方法,其特征還在于,所述的動(dòng)態(tài)加載linux系統(tǒng)內(nèi)核模塊步驟是使用insmod加載內(nèi)核模塊。
所述的在linux系統(tǒng)中對惡意軟件Rootkit的檢測方法,其特征還在于,所述的動(dòng)態(tài)加載linux系統(tǒng)內(nèi)核模塊步驟具體包括:使用insmod在用戶空間啟動(dòng)加載過程并定義需要加載的模塊,執(zhí)行l(wèi)oad_module函數(shù)將內(nèi)核模塊嵌入內(nèi)核,獲取內(nèi)核級(jí)別的信息。
本申請還發(fā)明一種在linux系統(tǒng)中對惡意軟件Rootkit的修復(fù)方法,其特征在于,該修復(fù)方法具體包括如下步驟:動(dòng)態(tài)加載linux系統(tǒng)內(nèi)核模塊;輸出目前系統(tǒng)內(nèi)存中的系統(tǒng)調(diào)用和內(nèi)核級(jí)別函數(shù)的地址;將該輸出的系統(tǒng)調(diào)用和內(nèi)核級(jí)別函數(shù)地址內(nèi)容與預(yù)備好的地址表進(jìn)行比對;如果系統(tǒng)調(diào)用和內(nèi)核級(jí)別函數(shù)地址與預(yù)備的地址表不能對應(yīng),則表示系統(tǒng)已經(jīng)被Rootkit攻擊,通過HOOK技術(shù)將不一致的系統(tǒng)調(diào)用和函數(shù)的地址替換為正確的地址。
所述的在linux系統(tǒng)中對惡意軟件Rootkit的修復(fù)方法,其特征還在于,該預(yù)備好的地址表可以使用系統(tǒng)本身預(yù)留的系統(tǒng)調(diào)用map文件,也可以使用標(biāo)準(zhǔn)的內(nèi)核產(chǎn)生的map文件。
所述的在linux系統(tǒng)中對惡意軟件Rootkit的修復(fù)方法,其特征還在于,所述的動(dòng)態(tài)加載linux系統(tǒng)內(nèi)核模塊步驟是使用insmod加載內(nèi)核模塊。
所述的在linux系統(tǒng)中對惡意軟件Rootkit的修復(fù)方法,其特征還在于,所述的動(dòng)態(tài)加載linux系統(tǒng)內(nèi)核模塊步驟具體包括:使用insmod在用戶空間啟動(dòng)加載過程并定義需要加載的模塊,執(zhí)行l(wèi)oad_module函數(shù)將內(nèi)核模塊嵌入內(nèi)核,獲取內(nèi)核級(jí)別的信息。
所述的在linux系統(tǒng)中對惡意軟件Rootkit的修復(fù)方法,其特征還在于,通過HOOK技術(shù)將不一致的系統(tǒng)調(diào)用和函數(shù)的地址替換為正確的地址步驟具體包括:找出所有的被劫持的函數(shù);將錯(cuò)誤的函數(shù)的地址通過HOOK的方式更改為正確的地址;找到相關(guān)的惡意Rootkit的文件和程序;刪除相關(guān)的惡意Rootkit的文件和程序。
所述的在linux系統(tǒng)中對惡意軟件Rootkit的修復(fù)方法,其特征還在于,通過HOOK技術(shù)將不一致的系統(tǒng)調(diào)用和函數(shù)的地址替換為正確的地址步驟可以通過更改sys-read和syswrite是這兩個(gè)系統(tǒng)函數(shù)指針來實(shí)現(xiàn)。
本文提出檢測和保護(hù)方案可以補(bǔ)充SSR(浪潮操作系統(tǒng)安全增強(qiáng)系統(tǒng))的不足,SSR只能在未被Rootkit的基礎(chǔ)上保護(hù)系統(tǒng)不被攻擊,但是此方法可以實(shí)現(xiàn)對已經(jīng)被攻擊的系統(tǒng)進(jìn)行修復(fù),然后再使用SSR對系統(tǒng)進(jìn)行保護(hù),來補(bǔ)充SSR的不足之處。
附圖說明
圖1、重定向系統(tǒng)調(diào)用示意圖
具體實(shí)施方式
下面對本發(fā)明的內(nèi)容進(jìn)行更加詳細(xì)的闡述:
本發(fā)明提出了一種linux系統(tǒng)內(nèi)核級(jí)別Rootkit檢測和修復(fù)程序。本發(fā)明的顯著特征是在不重新編譯內(nèi)核的基礎(chǔ)上,實(shí)現(xiàn)內(nèi)核級(jí)別的Rootkit檢測以及修復(fù)。
Rootkit技術(shù)是惡意程序用于隱藏自身的主要技術(shù)手段之一,其原理為:系統(tǒng)調(diào)用實(shí)現(xiàn)函數(shù)位于內(nèi)核空間,而可加載內(nèi)核模塊可以通過內(nèi)核符號(hào)表訪問內(nèi)核空間中的各種資源,利用HOOK技術(shù)掛鉤系統(tǒng)調(diào)用來執(zhí)行相關(guān)的自定義操作,比如隱藏文件和惡意的進(jìn)程。現(xiàn)有的內(nèi)核級(jí)Rootkit正是基于這種原理實(shí)現(xiàn)的。修改系統(tǒng)調(diào)用表的Rootkit對位于系統(tǒng)調(diào)用表中的一些系統(tǒng)調(diào)用函數(shù)地址進(jìn)行修改。同樣我們也可以利用這種技術(shù)檢測系統(tǒng)是否被攻擊,并在檢測的基礎(chǔ)上進(jìn)行修復(fù)。
本發(fā)明基于linux動(dòng)態(tài)模塊加載和HOOK技術(shù),嵌入內(nèi)核模塊對系統(tǒng)的系統(tǒng)調(diào)用和函數(shù)進(jìn)行檢測,然后使用HOOK技術(shù)對系統(tǒng)進(jìn)行修復(fù),并顯示已經(jīng)被隱藏的文件,從而達(dá)到真正的修復(fù)系統(tǒng)的效果。
本文通過動(dòng)態(tài)加載內(nèi)核模塊,將目前系統(tǒng)內(nèi)存中的系統(tǒng)調(diào)用和內(nèi)核級(jí)別函數(shù)的地址輸出,然后將輸出內(nèi)容與預(yù)備好的地址表進(jìn)行比對。如果系統(tǒng)調(diào)用和函數(shù)地址的與預(yù)備的地址表不能對應(yīng),則表示系統(tǒng)被Rootkit攻擊。
通過HOOK技術(shù)將不一致的系統(tǒng)調(diào)用和函數(shù)的地址替換為正確的地址。此時(shí)系統(tǒng)就恢復(fù)正常。但此時(shí)惡意的Rootkit模塊仍然在我們的肉核模塊中,只是不能再對兄內(nèi)核的系統(tǒng)調(diào)用進(jìn)行劫持,也不能隱藏自身的文件和進(jìn)程,這時(shí)我們可以通過找到相關(guān)的惡意文件和程序來進(jìn)行對linux系統(tǒng)的徹底修復(fù)。
為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將對每個(gè)部分作出詳細(xì)的闡釋:
獲取系統(tǒng)調(diào)用表地址System.map文件包含了系統(tǒng)的內(nèi)核符號(hào)地址,由于每次編譯內(nèi)核時(shí),內(nèi)核符號(hào)有可能會(huì)發(fā)生變化,因此每次編譯都會(huì)生成一個(gè)新的System.map。因此本發(fā)明可以使用系統(tǒng)本身預(yù)留的系統(tǒng)調(diào)用map文件,也可以使用標(biāo)準(zhǔn)的內(nèi)核產(chǎn)生的map文件,按實(shí)際情況使用。
然后加載用戶linux系統(tǒng)的內(nèi)核模塊,獲取到內(nèi)存中的system.map的內(nèi)容并輸出。首先使用insmod加載內(nèi)核模塊。insmod在用戶空間啟動(dòng)加載過程并定義需要加載的模塊,然后它會(huì)調(diào)用init_module系統(tǒng)調(diào)用。init_module將模塊二進(jìn)制文件復(fù)制到內(nèi)核后,接著系統(tǒng)調(diào)用實(shí)現(xiàn)函數(shù)sys-init_module先檢查調(diào)用者是否具有執(zhí)行加載模塊操作的權(quán)限,然后調(diào)用load_module函數(shù)。執(zhí)行完成load_module函數(shù)后用戶linux系統(tǒng)的內(nèi)核模塊就被嵌入內(nèi)核,然后就可以按照寫好的程序獲取內(nèi)核級(jí)別的信息,將內(nèi)存中的地址表輸出出來,最終可以將地址的內(nèi)容與預(yù)留的內(nèi)容對比。比如我們從內(nèi)存輸出的系統(tǒng)調(diào)用open函數(shù)的地址是A,然而我們預(yù)留的標(biāo)準(zhǔn)中open函數(shù)的地址是B,那么我們的open系統(tǒng)調(diào)用就被劫持了。此時(shí)我們就能確定我們的系統(tǒng)被Rootkit攻擊了。
通過以上方式可以找出所有的被劫持的函數(shù),然后將錯(cuò)誤的函數(shù)的地址通過HOOK的方式,再更改為正確的地址,如此就可以去掉惡意肉核模塊對操作系統(tǒng)的影響,這樣處理之后,能夠看到被惡意內(nèi)核模塊隱藏的文件和程序。比如惡意的內(nèi)核模塊可以通過劫持open和read等系統(tǒng)調(diào)用是我們看不到某些關(guān)鍵系統(tǒng)的配置文件中的相關(guān)內(nèi)容。利用hook技術(shù)實(shí)現(xiàn)系統(tǒng)調(diào)用函數(shù)的劫持。實(shí)現(xiàn)方法是在Rootkit模塊加載時(shí)將系統(tǒng)調(diào)用表中待劫持的系統(tǒng)調(diào)用索引替換為攻擊者定義的函數(shù)指針,如圖1所示,read和write系統(tǒng)調(diào)用展示了重定向系統(tǒng)調(diào)用過程。sys_read和sys_write是這兩個(gè)系統(tǒng)調(diào)用的實(shí)現(xiàn)函數(shù),系統(tǒng)調(diào)用表中-NR_read和-NR_write兩個(gè)索引指向這兩個(gè)函數(shù)(圖中虛線所示)。攻擊者將系統(tǒng)調(diào)用表中相關(guān)索引指向的具體實(shí)現(xiàn)函數(shù)更改為:Rootkit-read和Rootkit_write(圖中實(shí)線所示),這樣當(dāng)read和write被調(diào)用時(shí),實(shí)際執(zhí)行的就是攻擊者函數(shù)。這兩個(gè)系統(tǒng)調(diào)用被替換后,我們也可以使用這種方式將正確的函數(shù)的地址替換回去,從而在不干擾系統(tǒng)正常運(yùn)行的情況下將系統(tǒng)進(jìn)行部分的修復(fù)。
將系統(tǒng)調(diào)用和函數(shù)被修復(fù)后,我們就可以看到所有的文件系統(tǒng)的調(diào)用情況。此時(shí)我們就可以判定哪些是惡意攻擊中的文件或進(jìn)程。最主要的是要找到Rootkit的內(nèi)核模塊文件。此文件就是隱藏文件和進(jìn)程的罪魁禍?zhǔn)?。此文件與我們的內(nèi)核模塊的文件類似,一般是以.ko結(jié)尾。找到此文件并且刪除文件,然后刪除相關(guān)的之前被隱藏的文件,開機(jī)啟動(dòng)文件等,此時(shí)系統(tǒng)就從Rootkit攻擊中恢復(fù)回來。等待合適的時(shí)間重啟系統(tǒng)即可。
本文提出的檢測和保護(hù)方案可以補(bǔ)充SSR的不足,SSR只能在未被Rootkit攻擊的基礎(chǔ)上保護(hù)系統(tǒng)不被攻擊,但是此方法可以實(shí)現(xiàn)對已經(jīng)被攻擊的linux系統(tǒng)進(jìn)行修復(fù),然后再使用SSR對linux系統(tǒng)進(jìn)行保護(hù),來補(bǔ)充SSR的不足之處。