Rootkit——內存真的被偽造過么
McAfee首席反病毒專家Rachit Mathur研究過一種被認為是 TDL3 rootkit 變種的rootkit,這個rootkit就是用來隱藏臭名昭Google Redirect 病毒的程序。但是這個rootkit的行為有些怪異。Mathur在接受ZDNet的采訪時解釋說:
一些反rootkit工具無法通過hooks直接識別出這個rootkit,另外,它還不允許外部debug工具(Windbg等)進行中斷調試,這一點很讓人郁悶。
Mathur還補充說:
反rootkit工具之所以沒有發(fā)現(xiàn)可疑的hooks,是因為這些工具所檢測的內存本身就是偽造的。
很明顯,rootkit開發(fā)人員使用這種技術的目的就是為了防止被反病毒工具發(fā)現(xiàn)并被系統(tǒng)管理者注意到。
偽造內存成為可能?
聽到這個結論,我的第一反應是,“內存是怎么被偽造出來的呢?”
Mathur擁有計算機科學碩士學位,專攻逆向工程,程序轉換以及惡意軟件變種研究。Mathur在McAfee Labs的博客上也有一篇專門針對這個rootkit技術的文章:Memory Forging Attempt by a Rookit. 我嘗試著閱讀了一下,但是指針,寄存器設置以及debug工具等弄的我有些頭大。于是在采訪中,我請求McAfee公關部的Joris Evers先生和H3O Communications的Ian Bain先生幫我聯(lián)系了Mathur先生。下面就是我對Mathur先生的采訪內容。
記者: 我承認,我還是沒明白內存是如何偽造出來的。您能不能比較淺顯的解釋一下這個技術。
Mathur: 我可以先介紹一些背景知識。 Rootkits 一般會修改當前操作系統(tǒng)在內存中的某個特定區(qū)域,從而劫持操作系統(tǒng)的控制功能。這么做會迫使操作系統(tǒng)對掃描軟件(反病毒軟件或反rootkit軟件)反饋錯誤的結果。
比如rootkit會隱藏文件,注冊表項目,進程等,防止檢測軟件掃描這些內容。所以,一般來說rootkit都會修改內存。而反rootkit工具則是通過檢測內存區(qū)域,發(fā)現(xiàn)此類可疑修改,并通知用戶。
我們今天所說的這個rootkit也同樣修改內存的存儲單元(安裝hook)阻止檢測軟件的磁盤訪問動作。我們假設這個存儲單元的位置是X,而這個X是大多數(shù)rootkit都會使用的位置,我們所說的這個rootkit也毫無例外的使用了這個位置。
那么對于反rootkit軟件來說,由于大部分rootkit都會修改X位置的內容,因此反rootkit軟件就會檢查X位置所存儲的內容,看其是否被修改過。
記者: 抱歉我打斷一下,這個rootkit就是在這里做文章的嗎?
Mathur : 恩,我們今天說的這個rootkit,會將原先X位置的內容搬到Y位置存儲起來。當反rootkit軟件掃描X位置時,它會將Y位置的內容提供給檢測軟件。這樣檢測軟件就不會發(fā)現(xiàn)X位置有任何異常了。
記者: 您剛才提到了 X位置和 Y位置。我想到一個問題:既然檢測軟件會掃描X位置,為什么rootkit還要將自身信息放在X位置呢?
Mathur: 惡意軟件之所以必須修改 X位置的數(shù)據(jù),是因為操作系統(tǒng)使用X位置來調用處理磁盤訪問的特定代碼。這樣,在磁盤訪問過程中,惡意軟件就可以決定是否允許程序讀取磁盤上某個文件或向其中植入惡意代碼。這就是所謂的調度表hook或IRP hook。
記者: 您是說,惡意軟件或rootkit有足夠的智能,能夠分辨哪些程序試圖訪問X位置?這是怎么實現(xiàn)的呢?
Mathur: 惡意軟件一定需要判斷讀取請求來自何處。只有當惡意軟件確定操作系統(tǒng)需要讀取X位置的代碼來進行磁盤訪問時,惡意軟件才會放心的把惡意代碼傳送給操作系統(tǒng)。而其它程序,包括反病毒軟件需要讀取X位置的內容時,惡意軟件會將Y位置的原始內容反饋給程序。
當發(fā)生 X位置的讀取請求時,由于CPU硬件中斷設置,會觸發(fā)一個例外事件。而由于惡意軟件同時修改了操作系統(tǒng)變量KiDebugRoutine, 惡意代碼會在該例外觸發(fā)時被啟動,取得控制權。
這時惡意軟件已經(jīng)能獲知指令試圖讀取的內存地址了。惡意軟件會將此地址與預先設置的地址列表進行比對,看是否允許繼續(xù)讀取該內存地址的內容。指令中需要讀取的地址可以分成兩類,一類是地址中包含操作系統(tǒng)數(shù)據(jù),另一類是地址包含了惡意代碼。
如果指令讀取的地址與地址列表上的相符,那么惡意代碼不會提供偽造內存。相關的代碼可以從博客中的圖片“KiDebugRoutine Handler: Snippet 3″中看到。
接下來的代碼是對比一個特定的地址。如果相匹配,那么該異常被設定為不需要偽造內存,讀取命令會繼續(xù)執(zhí)行,讀取“真實”的內存內容:
cmp eax, dword_41D810 ; compare EIP with pre-defined locations that are allowed to read correct memory
jz loc_403BC5 ; set as handled and return
記者: 這個rootkit有名字嗎?
Mathur: McAfee 將其定為 TDSS.e!rootkit.
記者: 我很好奇,您到底是如何認定這個rootkit偽造了內存呢?
Mathur: 最初在分析惡意軟件樣本時,常用的掃描工具都沒有報告出可疑的rootkit活動。但是隨著深入研究和debug分析,我們確定其中確實有一個hook,并且它就位于那些掃描工具最常掃描的地址段內。但是這些掃描工具確實什么也沒發(fā)現(xiàn)。這非常奇怪,所以引起了我的注意。
索性這個rootkit設計的并不完美,隨著研究的深入,我還是發(fā)現(xiàn)了它的蛛絲馬跡。我發(fā)現(xiàn)通過兩種不同方式檢查該地址段,所獲得的反饋內容是不同的。這是個意料之外的線索。
因為我們知道自己在找什么,所以很快我們就發(fā)現(xiàn)到硬件中斷(DR0 寄存器)設置到X位置,而惡意軟件試圖保護自身。剩下的工作就是通過標準的逆向工程來還原出rootkit的工作細節(jié)。
記者: 發(fā)現(xiàn)這個rootkit的機制后,行業(yè)會有什么動作嗎?另外,既然這個rootkit已經(jīng)流傳出去了,會不會有更多的惡意軟件開發(fā)者利用它或者將其進一步改進?
Mathur: 這個問題問得好。目前該技術確實已經(jīng)被一些惡意軟件利用了,而我們也必然會看到反rootkit工具會增加對這種技術的檢測功能,比如在訪問內存特定區(qū)域前,監(jiān)視硬件中斷的活動,或者檢查KiDebugRoutine hook等。
另外,由于使用這個技術需要設置硬件中斷點,因此它可能不會廣泛的被各種惡意軟件利用。因為一旦知道了它的工作原理,想要檢測或避免被這種技術感染的方法并不難。
但是,為反rootkit工具增加針對這種技術的檢測功能需要一段時間。因此,在未來一小段時間內,我們可能會發(fā)現(xiàn)有部分惡意軟件利用了這種技術,而且有可能會出現(xiàn)這種技術的變種。
估計最開始是那些設計精巧的惡意軟件首先采用該技術,然后是設計較好的惡意軟件采用該技術。雖然這都是預想,但是還是比較靠譜的。
記者: 作為普通用戶,我們該如何防范采用這種技術的惡意軟件呢?
Mathur: 從用戶的角度說,一般的防范措施,比如瀏覽安全的網(wǎng)站,保持軟件和系統(tǒng)及時更新等,會有一定的幫助。當然,所安裝的安全軟件需要進行更新,才可能支持對這種新技術的檢測和防范。因此用戶需要隨時關注新版安全軟件的推出,并及時更新病毒庫。
記者: 在您的博客中,您提到這個技術已經(jīng)存在一段時間了,就是之前一直沒有被利用。是不是還有某些新技術也是處于這種狀態(tài)呢?
Mathur:這種技術以前就被人提起過,但是一直沒有惡意軟件使用該技術的報告出現(xiàn),直到這次。不幸的是,我還沒有注意到有類似的技術被雪藏。我們認為惡意軟件制作者們會繼續(xù)改進技術,實現(xiàn)更好的隱藏機制。
這也是我們將要在今年的Virus Bulletin Conference 上討論的話題之一。
總結
病毒和反病毒的斗爭一直在持續(xù),未來也是一樣。我們感謝像Mathur這樣的專家能夠認真的研究和分析新的病毒技術,為我們的反病毒斗爭帶來希望。
【編輯推薦】