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