摘要:本文描述了一種檢測(cè)內(nèi)核與用戶級(jí)rootkit的新技術(shù)。此技術(shù)利用處理器的單步執(zhí)行模式,來測(cè)定系統(tǒng)內(nèi)核與dll中執(zhí)行指令的數(shù)量,從而達(dá)到檢測(cè)rootkit和后門的目的。同時(shí)還討論了其在win2k下的代碼實(shí)現(xiàn)。
背景知識(shí) pxU s9[wVYH$[本資料來源于貴州學(xué)習(xí)網(wǎng) http://www.gzu521.com]pxU s9[wVYH$
一個(gè)在計(jì)算機(jī)安全領(lǐng)域中重要的問題是,如何判斷給定的主機(jī)是否已被入侵。由于以下兩點(diǎn)這項(xiàng)工作變的非常困難:
1、攻擊者可以利用未知漏洞進(jìn)入系統(tǒng)。
2、當(dāng)進(jìn)入系統(tǒng)后,入侵者可通過安裝rootkit和后門來隱藏自身(例如:隱藏進(jìn)程,通訊渠道,文件等)。本文將集中討論在win2k系統(tǒng)下rootkit的檢測(cè)問題。
傳統(tǒng)rootkit檢測(cè)技術(shù)中的一些問題
傳統(tǒng)的rootkit檢測(cè)程序(那些我們經(jīng)常在unix系統(tǒng)中見到的)只能檢測(cè)一些已知的rootkit(這點(diǎn)使它變的像反病毒程序)或進(jìn)行一些內(nèi)核存儲(chǔ)的掃描。例如linux中就有一些工具掃描內(nèi)核中的syscall table。這顯然不夠好,因?yàn)橐呀?jīng)有了很多并不更改syscall table的rootkit,而win2k下也可開發(fā)出類似的rootkit。
那檢測(cè)程序是不是還應(yīng)該掃描內(nèi)核代碼空間?這樣我們就有了一個(gè)運(yùn)行在內(nèi)核模式中的tripwire。但這還不夠好,因?yàn)樵诖蠖鄶?shù)的操作系統(tǒng)中,我們可以寫出即不更改sst(syscall table)也不更改代碼的內(nèi)核級(jí)rootkit。在系統(tǒng)中有很多可以勾連的函數(shù)指針(例見[2])。
以我看,存儲(chǔ)掃描技術(shù)決不會(huì)成為rootkit檢測(cè)的終結(jié)。這主要是因?yàn)槲覀儾荒艽_定具體的監(jiān)測(cè)存儲(chǔ)區(qū)域。
那到底怎樣檢測(cè)出我們系統(tǒng)中的入侵者呢?
首先我們以rootkit中所使用的技術(shù),將其分為兩類:
*通過更改系統(tǒng)結(jié)構(gòu)來隱藏某對(duì)象的(如運(yùn)行的進(jìn)程)和
*更改內(nèi)核執(zhí)行路徑(例:勾連那些負(fù)責(zé)枚舉活動(dòng)進(jìn)程的內(nèi)核函數(shù))來達(dá)到同樣目的的。
更改系統(tǒng)數(shù)據(jù)結(jié)構(gòu)的rootkit
這類的rootkit不太多。有意思的例子包括fu rootkit(見[3]),通過刪除內(nèi)核中psactiveprocesslist鏈上的進(jìn)程對(duì)象來隱藏進(jìn)程。 zwquerysysteminformation等函數(shù)是不能發(fā)現(xiàn)這些隱藏進(jìn)程的。但同時(shí),因?yàn)閣indows的線程分派器(dispatcher, scheduler)使用另外的數(shù)據(jù)結(jié)構(gòu),這些"隱藏"進(jìn)程仍可運(yùn)行(被分配到cpu使用時(shí)間)。windows的線程分派器使用以下三個(gè)(注1)數(shù)據(jù)結(jié)構(gòu):
*pkidispatcherreadylisthead
*pkiwaitinlisthead
*pkiwaitoutlisthead
后兩個(gè)是處于"等待"狀態(tài)的線程鏈頭。他們之間稍有不同,但對(duì)我們來說并不重要。
從上面的信息我們可以找到一種檢測(cè)隱藏進(jìn)程的方法。及讀取線程分派器使用的數(shù)據(jù)結(jié)構(gòu),而不是psactiveprocesslist。
當(dāng)檢測(cè)rootkit時(shí)我們應(yīng)該盡可能的觸及更底層的內(nèi)核數(shù)據(jù)結(jié)構(gòu)。
有一點(diǎn)應(yīng)該注意,直接從線程分派器使用的鏈中刪除要隱藏的進(jìn)程是不可能的,因?yàn)殡[藏的進(jìn)程將分配不到cpu使用時(shí)間。
更改執(zhí)行路徑的rootkit
這類的rootkit較為普及。他們通過修改或增加內(nèi)核或系統(tǒng)dll中的指令來達(dá)到目的。檢測(cè)這類rootkit的問題是,我們不知道 rootkit在什么地方做了那些修改。它可以勾連dll中的函數(shù),系統(tǒng)服務(wù)列表(system service table),改變內(nèi)核函數(shù)的內(nèi)容或修改內(nèi)核中一些奇怪的函數(shù)指針。
執(zhí)行路徑分析(execution path analysis)
epa關(guān)注這樣一個(gè)事實(shí):如果入侵者通過修改執(zhí)行路徑隱藏了一些對(duì)象,那么當(dāng)調(diào)用一些典型的系統(tǒng)和庫(kù)的函數(shù)時(shí),系統(tǒng)將運(yùn)行一些多余的指令。
背景知識(shí) pxU s9[wVYH$[本資料來源于貴州學(xué)習(xí)網(wǎng) http://www.gzu521.com]pxU s9[wVYH$
一個(gè)在計(jì)算機(jī)安全領(lǐng)域中重要的問題是,如何判斷給定的主機(jī)是否已被入侵。由于以下兩點(diǎn)這項(xiàng)工作變的非常困難:
1、攻擊者可以利用未知漏洞進(jìn)入系統(tǒng)。
2、當(dāng)進(jìn)入系統(tǒng)后,入侵者可通過安裝rootkit和后門來隱藏自身(例如:隱藏進(jìn)程,通訊渠道,文件等)。本文將集中討論在win2k系統(tǒng)下rootkit的檢測(cè)問題。
傳統(tǒng)rootkit檢測(cè)技術(shù)中的一些問題
傳統(tǒng)的rootkit檢測(cè)程序(那些我們經(jīng)常在unix系統(tǒng)中見到的)只能檢測(cè)一些已知的rootkit(這點(diǎn)使它變的像反病毒程序)或進(jìn)行一些內(nèi)核存儲(chǔ)的掃描。例如linux中就有一些工具掃描內(nèi)核中的syscall table。這顯然不夠好,因?yàn)橐呀?jīng)有了很多并不更改syscall table的rootkit,而win2k下也可開發(fā)出類似的rootkit。
那檢測(cè)程序是不是還應(yīng)該掃描內(nèi)核代碼空間?這樣我們就有了一個(gè)運(yùn)行在內(nèi)核模式中的tripwire。但這還不夠好,因?yàn)樵诖蠖鄶?shù)的操作系統(tǒng)中,我們可以寫出即不更改sst(syscall table)也不更改代碼的內(nèi)核級(jí)rootkit。在系統(tǒng)中有很多可以勾連的函數(shù)指針(例見[2])。
以我看,存儲(chǔ)掃描技術(shù)決不會(huì)成為rootkit檢測(cè)的終結(jié)。這主要是因?yàn)槲覀儾荒艽_定具體的監(jiān)測(cè)存儲(chǔ)區(qū)域。
那到底怎樣檢測(cè)出我們系統(tǒng)中的入侵者呢?
首先我們以rootkit中所使用的技術(shù),將其分為兩類:
*通過更改系統(tǒng)結(jié)構(gòu)來隱藏某對(duì)象的(如運(yùn)行的進(jìn)程)和
*更改內(nèi)核執(zhí)行路徑(例:勾連那些負(fù)責(zé)枚舉活動(dòng)進(jìn)程的內(nèi)核函數(shù))來達(dá)到同樣目的的。
更改系統(tǒng)數(shù)據(jù)結(jié)構(gòu)的rootkit
這類的rootkit不太多。有意思的例子包括fu rootkit(見[3]),通過刪除內(nèi)核中psactiveprocesslist鏈上的進(jìn)程對(duì)象來隱藏進(jìn)程。 zwquerysysteminformation等函數(shù)是不能發(fā)現(xiàn)這些隱藏進(jìn)程的。但同時(shí),因?yàn)閣indows的線程分派器(dispatcher, scheduler)使用另外的數(shù)據(jù)結(jié)構(gòu),這些"隱藏"進(jìn)程仍可運(yùn)行(被分配到cpu使用時(shí)間)。windows的線程分派器使用以下三個(gè)(注1)數(shù)據(jù)結(jié)構(gòu):
*pkidispatcherreadylisthead
*pkiwaitinlisthead
*pkiwaitoutlisthead
后兩個(gè)是處于"等待"狀態(tài)的線程鏈頭。他們之間稍有不同,但對(duì)我們來說并不重要。
從上面的信息我們可以找到一種檢測(cè)隱藏進(jìn)程的方法。及讀取線程分派器使用的數(shù)據(jù)結(jié)構(gòu),而不是psactiveprocesslist。
當(dāng)檢測(cè)rootkit時(shí)我們應(yīng)該盡可能的觸及更底層的內(nèi)核數(shù)據(jù)結(jié)構(gòu)。
有一點(diǎn)應(yīng)該注意,直接從線程分派器使用的鏈中刪除要隱藏的進(jìn)程是不可能的,因?yàn)殡[藏的進(jìn)程將分配不到cpu使用時(shí)間。
更改執(zhí)行路徑的rootkit
這類的rootkit較為普及。他們通過修改或增加內(nèi)核或系統(tǒng)dll中的指令來達(dá)到目的。檢測(cè)這類rootkit的問題是,我們不知道 rootkit在什么地方做了那些修改。它可以勾連dll中的函數(shù),系統(tǒng)服務(wù)列表(system service table),改變內(nèi)核函數(shù)的內(nèi)容或修改內(nèi)核中一些奇怪的函數(shù)指針。
執(zhí)行路徑分析(execution path analysis)
epa關(guān)注這樣一個(gè)事實(shí):如果入侵者通過修改執(zhí)行路徑隱藏了一些對(duì)象,那么當(dāng)調(diào)用一些典型的系統(tǒng)和庫(kù)的函數(shù)時(shí),系統(tǒng)將運(yùn)行一些多余的指令。