摘 要: 可移動(dòng)存儲(chǔ)設(shè)備管理系統(tǒng)在運(yùn)行時(shí)會(huì)面臨攻擊者采用任務(wù)管理器或第三方工具強(qiáng)行關(guān)閉的攻擊,可能導(dǎo)致應(yīng)用程序無法正常運(yùn)行。為解決這類應(yīng)用程序安全運(yùn)行的問題,提出一種融合進(jìn)程隱藏和進(jìn)程守護(hù)技術(shù)的可移動(dòng)存儲(chǔ)設(shè)備管理系統(tǒng)安全運(yùn)行方案。該方案利用改進(jìn)的遠(yuǎn)程線程注入技術(shù)提高系統(tǒng)隱蔽性,利用雙守護(hù)進(jìn)程的兩級(jí)監(jiān)控體系提高系統(tǒng)健壯性,從而達(dá)到維護(hù)程序安全運(yùn)行的目的。應(yīng)用結(jié)果表明,該方案能夠很好地抵抗強(qiáng)行關(guān)閉攻擊。
關(guān)鍵詞: 進(jìn)程隱藏;信息隱藏;進(jìn)程守護(hù);遠(yuǎn)程線程注入;可移動(dòng)存儲(chǔ)設(shè)備
0 引言
可移動(dòng)存儲(chǔ)設(shè)備由于其體積小、容量大、攜帶方便等優(yōu)點(diǎn)得到了廣泛應(yīng)用??梢苿?dòng)存儲(chǔ)設(shè)備在給人們帶來方便的同時(shí),也給企事業(yè)單位引入了極大的安全隱患,是個(gè)人計(jì)算機(jī)系統(tǒng)信息泄露的主要途徑[1]。在一些有保密性要求的單位,既希望利用可移動(dòng)存儲(chǔ)設(shè)備即插即用、無需安裝驅(qū)動(dòng)程序、攜帶方便等優(yōu)點(diǎn),同時(shí)又希望可移動(dòng)存儲(chǔ)設(shè)備只能在特定范圍內(nèi)使用,以保證所存儲(chǔ)的內(nèi)容不會(huì)向外泄漏。為滿足這一需求,需要開發(fā)對(duì)可移動(dòng)存儲(chǔ)設(shè)備進(jìn)行綜合管理的系統(tǒng),對(duì)單位內(nèi)部的可移動(dòng)存儲(chǔ)設(shè)備進(jìn)行管理,禁止外部可移動(dòng)存儲(chǔ)設(shè)備在內(nèi)部使用[2]。然而,在實(shí)際應(yīng)用中,對(duì)要受保護(hù)的計(jì)算機(jī)安裝可移動(dòng)存儲(chǔ)設(shè)備管理系統(tǒng)后,用戶可以使用任務(wù)管理器或者第三方工具結(jié)束其進(jìn)程,這樣,即使安裝了該程序,也無法實(shí)現(xiàn)對(duì)可移動(dòng)存儲(chǔ)設(shè)備的管理。因此,如何增強(qiáng)系統(tǒng)隱蔽性防止被用戶發(fā)現(xiàn),或者被用戶發(fā)現(xiàn)時(shí)能夠防止被用戶結(jié)束,是可移動(dòng)存儲(chǔ)設(shè)備管理系統(tǒng)安全運(yùn)行亟待解決的問題。解決這一問題通常采用的技術(shù)路線有兩種:進(jìn)程隱藏技術(shù)和進(jìn)程守護(hù)技術(shù)。本文基于對(duì)進(jìn)程隱藏和進(jìn)程守護(hù)技術(shù)的分析,結(jié)合兩種技術(shù)的優(yōu)點(diǎn),給出了一種融合這兩種技術(shù)的可移動(dòng)存儲(chǔ)設(shè)備管理系統(tǒng)安全運(yùn)行的方案。
1 進(jìn)程隱藏技術(shù)
進(jìn)程隱藏技術(shù)有很多,現(xiàn)有進(jìn)程隱藏技術(shù)主要分為三類[3]:(1)基于API Hook的進(jìn)程隱藏;(2)基于DLL的進(jìn)程隱藏;(3)基于遠(yuǎn)程線程注入的進(jìn)程隱藏。其中,基于遠(yuǎn)程線程注入的進(jìn)程隱藏技術(shù)隱蔽性和健壯性好,可以存在于任一進(jìn)程(包括系統(tǒng)進(jìn)程的內(nèi)存空間)中,因而成為目前最為常用的進(jìn)程隱藏技術(shù)[3]。遠(yuǎn)程線程注入技術(shù)有兩種:直接代碼注入和以DLL形式注入。雖然直接代碼注入技術(shù)隱蔽性比DLL形式注入技術(shù)的隱蔽性更好一些,但是直接代碼注入技術(shù)對(duì)注入代碼的大小有限制[4],所以,在實(shí)際開發(fā)可移動(dòng)存儲(chǔ)設(shè)備管理系統(tǒng)時(shí),多采用遠(yuǎn)程線程注入DLL的進(jìn)程隱藏技術(shù)。
1.1 DLL形式遠(yuǎn)程線程注入技術(shù)
通常情況下,每個(gè)進(jìn)程都有自己的私有地址空間,其他進(jìn)程不允許對(duì)這個(gè)私有地址空間進(jìn)行訪問操作。遠(yuǎn)程線程注入技術(shù)通過在目標(biāo)進(jìn)程中創(chuàng)建遠(yuǎn)程線程的方法進(jìn)入目標(biāo)進(jìn)程的內(nèi)存地址空間,由注入到遠(yuǎn)程進(jìn)程中的線程啟動(dòng)指定DLL,在指定DLL中完成要實(shí)現(xiàn)的功能,這樣就可以使要實(shí)現(xiàn)的功能的代碼運(yùn)行到遠(yuǎn)程進(jìn)程中。如果注入到進(jìn)程explorer.exe中,用戶使用任務(wù)管理器或者第三方進(jìn)程查看工具看到的是explorer.exe進(jìn)程,而注入到explorer.exe進(jìn)程中的代碼被隱藏起來,因此,增強(qiáng)了系統(tǒng)的隱蔽性,不容易被發(fā)現(xiàn)。
1.2 遠(yuǎn)程線程注入技術(shù)的實(shí)現(xiàn)
遠(yuǎn)程線程注入技術(shù)的實(shí)現(xiàn)主要有5個(gè)步驟[5]:(1)通過OpenProcess打開試圖注入的遠(yuǎn)程進(jìn)程,獲取其句柄;(2)利用VirtualAllocEx在遠(yuǎn)程進(jìn)程中為要注入的DLL申請(qǐng)足夠的內(nèi)存地址空間;(3)利用WriteProcessMemory將DLL路徑名復(fù)制到遠(yuǎn)程進(jìn)程的內(nèi)存地址空間;(4)通過GetProcAddress計(jì)算LoadLibrary在Windows系統(tǒng)庫中的入口地址,用于后面加載DLL;(5)利用CreateRemote Thread創(chuàng)建遠(yuǎn)程線程并加載DLL。
雖然DLL文件在目標(biāo)進(jìn)程運(yùn)行時(shí)任務(wù)管理器中不會(huì)列出DLL文件名,看到的只是目標(biāo)進(jìn)程的文件名,這在一定程度上增強(qiáng)了系統(tǒng)隱蔽性,能夠有效防止被用戶發(fā)現(xiàn)進(jìn)程,但是通過DLL形式遠(yuǎn)程線程注入技術(shù)的實(shí)現(xiàn)步驟可以發(fā)現(xiàn)該技術(shù)也仍然存在缺點(diǎn),即不僅硬盤上有DLL文件存在,而且使用一些工具查看系統(tǒng)進(jìn)程加載DLL時(shí)也會(huì)發(fā)現(xiàn)進(jìn)程中可疑的DLL,這為系統(tǒng)的安全帶來隱患,需要在設(shè)計(jì)開發(fā)可移動(dòng)存儲(chǔ)設(shè)備管理系統(tǒng)時(shí)加以解決。
2 進(jìn)程守護(hù)技術(shù)
進(jìn)程守護(hù)技術(shù)的基本思想是啟動(dòng)一個(gè)新的進(jìn)程(即守護(hù)進(jìn)程)來對(duì)需要保護(hù)的進(jìn)程(即待檢測(cè)進(jìn)程)進(jìn)行輪詢檢測(cè),如果檢測(cè)到要受保護(hù)的進(jìn)程不存在,則守護(hù)進(jìn)程將立刻啟動(dòng)需要保護(hù)的進(jìn)程,如此循環(huán)往復(fù)。這樣,即使用戶使用任務(wù)管理器或者第三方進(jìn)程查看工具看到了需要保護(hù)的進(jìn)程,關(guān)閉了需要保護(hù)的進(jìn)程后,該進(jìn)程又被守護(hù)進(jìn)程啟動(dòng),使得關(guān)閉需要保護(hù)進(jìn)程的行為變得毫無實(shí)際意義。因此,在設(shè)計(jì)開發(fā)可移動(dòng)存儲(chǔ)設(shè)備管理系統(tǒng)時(shí)采用以進(jìn)程守護(hù)技術(shù)為主同時(shí)融合進(jìn)程隱藏技術(shù)的方案。
進(jìn)程守護(hù)技術(shù)的實(shí)現(xiàn)需要考慮兩個(gè)問題:(1)如何防止守護(hù)進(jìn)程被結(jié)束。因?yàn)榇龣z測(cè)進(jìn)程有守護(hù)進(jìn)程的保護(hù),是無法結(jié)束的。但是,若沒有守護(hù)進(jìn)程的保護(hù),則是可以結(jié)束的。(2)如何提高守護(hù)進(jìn)程和待檢測(cè)進(jìn)程之間的工作效率。如果按時(shí)間直接輪詢,將會(huì)耗費(fèi)系統(tǒng)資源,特別是CPU時(shí)間。占用過多CPU時(shí)間會(huì)引起用戶注意。
3 可移動(dòng)存儲(chǔ)設(shè)備管理系統(tǒng)安全運(yùn)行的方案
可移動(dòng)存儲(chǔ)設(shè)備管理系統(tǒng)的整體結(jié)構(gòu)設(shè)計(jì)分為兩個(gè)部分:可移動(dòng)存儲(chǔ)設(shè)備管理客戶端RSDMSClient和授權(quán)中心RSDMSACenter。授權(quán)中心負(fù)責(zé)對(duì)可移動(dòng)存儲(chǔ)設(shè)備的授權(quán),只有經(jīng)過授權(quán)的可移動(dòng)存儲(chǔ)設(shè)備才能在安裝有客戶端的計(jì)算機(jī)上使用??蛻舳税惭b在每個(gè)需要保護(hù)的計(jì)算機(jī)上,它實(shí)時(shí)監(jiān)測(cè)本地計(jì)算機(jī)系統(tǒng)的每個(gè)移動(dòng)存儲(chǔ)接口,當(dāng)監(jiān)測(cè)到有可移動(dòng)存儲(chǔ)設(shè)備接入本地計(jì)算機(jī)系統(tǒng)時(shí),客戶端進(jìn)程對(duì)來訪的可移動(dòng)存儲(chǔ)設(shè)備進(jìn)行鑒別,并根據(jù)鑒別結(jié)果采取相應(yīng)的訪問控制策略。
一個(gè)普通的可移動(dòng)存儲(chǔ)設(shè)備,如果沒有授權(quán)是不能接入到安裝有客戶端程序的計(jì)算機(jī)上使用的。因此,只要對(duì)單位內(nèi)部的可移動(dòng)存儲(chǔ)設(shè)備進(jìn)行授權(quán),不對(duì)外部的可移動(dòng)存儲(chǔ)設(shè)備授權(quán)就可以達(dá)到禁止外部可移動(dòng)存儲(chǔ)設(shè)備在內(nèi)部使用這一需求。授權(quán)中心運(yùn)行在專用機(jī)器上,不運(yùn)行在客戶端,只有專職人員才能使用,其安全性相對(duì)較高??梢苿?dòng)存儲(chǔ)設(shè)備管理系統(tǒng)客戶端程序安裝在受保護(hù)的個(gè)人計(jì)算機(jī)上,易遭受用戶使用任務(wù)管理器或者第三方工具強(qiáng)行關(guān)閉的攻擊,需要采取措施抵抗用戶的強(qiáng)行關(guān)閉。在設(shè)計(jì)開發(fā)可移動(dòng)存儲(chǔ)設(shè)備管理系統(tǒng)時(shí),將客戶端程序編寫成DLL,融合進(jìn)程隱藏和進(jìn)程守護(hù)技術(shù),能有效防止用戶的強(qiáng)行關(guān)閉攻擊。下面給出設(shè)計(jì)過程中的幾個(gè)要點(diǎn)。
3.1 遠(yuǎn)程線程注入DLL后將其刪除提高系統(tǒng)隱蔽性
遠(yuǎn)程線程注入DLL后,DLL文件在目標(biāo)進(jìn)程中運(yùn)行時(shí),任務(wù)管理器中不會(huì)列出DLL文件名,看到的只是目標(biāo)進(jìn)程文件名,但一些工具可以查看一個(gè)進(jìn)程究竟裝入哪些DLL文件,通過這些工具仍然可以發(fā)現(xiàn)進(jìn)程中的可疑DLL。要解決這個(gè)問題,必須脫離DLL文件,讓遠(yuǎn)程運(yùn)行的代碼只存在于內(nèi)存中,這樣就不會(huì)顯示有某個(gè)文件被非法裝入。因此,采用注入DLL后將其刪除的方法可以進(jìn)一步提高系統(tǒng)隱蔽性。
該方法基本思想:因?yàn)樽⑷隓LL后會(huì)在被注入的進(jìn)程內(nèi)存中產(chǎn)生映像,通過Get ProcAddress函數(shù)獲取映像的入口函數(shù)地址,并對(duì)內(nèi)存映像進(jìn)行備份;使用FreeLibrar y釋放加載的DLL,并刪除DLL文件;前面FreeLibrar y釋放加載的DLL時(shí),內(nèi)存映像的內(nèi)容也會(huì)隨之釋放,因此必須將內(nèi)存映像的備份復(fù)制到釋放前所在的地址空間。這樣,只要通過調(diào)用獲取的入口函數(shù)地址就實(shí)現(xiàn)了程序隱藏,從而提高了系統(tǒng)隱蔽性。
3.2雙守護(hù)進(jìn)程的兩級(jí)監(jiān)控體系提高系統(tǒng)健壯性
將客戶端RSDMSClient程序編寫成DLL,采用遠(yuǎn)程線程注入技術(shù)注入到常用的系統(tǒng)進(jìn)程。這樣即使注入的DLL模塊被發(fā)現(xiàn),在任務(wù)管理器中系統(tǒng)進(jìn)程是不允許被關(guān)閉的,因此安全性得到提高。但是,用戶使用第三方工具還是有可能結(jié)束系統(tǒng)進(jìn)程的,系統(tǒng)進(jìn)程結(jié)束了,注入的監(jiān)控程序也就不存在了,外部的可移動(dòng)存儲(chǔ)設(shè)備就可以在內(nèi)部使用。所以,不能單純采用遠(yuǎn)程線程注入技術(shù),可以結(jié)合使用進(jìn)程守護(hù)技術(shù),形成兩級(jí)監(jiān)控。第一級(jí)監(jiān)控(即守護(hù)進(jìn)程注入到系統(tǒng)進(jìn)程)負(fù)責(zé)監(jiān)控第二級(jí)監(jiān)控是否已經(jīng)注入到另外的系統(tǒng)進(jìn)程,若沒有則將其注入到另外的系統(tǒng)進(jìn)程。第二級(jí)監(jiān)控才是真正負(fù)責(zé)具體監(jiān)控任務(wù)的。
采用兩級(jí)監(jiān)控對(duì)系統(tǒng)起到了隱藏和保護(hù)作用,使得系統(tǒng)更加安全。前面在進(jìn)程守護(hù)技術(shù)中提到,守護(hù)進(jìn)程沒有保護(hù),如果先關(guān)閉守護(hù)進(jìn)程,系統(tǒng)的安全性就降低很多。因此,需要提高守護(hù)進(jìn)程的安全性,在設(shè)計(jì)可移動(dòng)存儲(chǔ)設(shè)備管理系統(tǒng)時(shí)采用雙進(jìn)程守護(hù)技術(shù)。
雙進(jìn)程守護(hù)技術(shù)是功能完全相同的兩個(gè)程序不斷地檢測(cè)對(duì)方是否已經(jīng)被結(jié)束,如果發(fā)現(xiàn)對(duì)方已經(jīng)被結(jié)束了,那么又開始創(chuàng)建對(duì)方,這樣又能夠讓對(duì)方執(zhí)行。顯然,采用雙守護(hù)進(jìn)程的兩級(jí)監(jiān)控體系極大提高了系統(tǒng)健壯性。但是,需要注意的是,雙守護(hù)進(jìn)程彼此不斷檢測(cè)對(duì)方是否存在時(shí),對(duì)系統(tǒng)CPU資源的耗費(fèi)是致命的。解決CPU資源的耗費(fèi)方法是使用心跳機(jī)制。假設(shè)兩個(gè)進(jìn)程是proc1和proc2。proc1首先遍歷進(jìn)程快照,如果proc2存在,proc1刷新進(jìn)程快照,重新遍歷進(jìn)程快照;如果proc2不存在,proc1開始創(chuàng)建proc2,然后proc1退出。當(dāng)proc1退出時(shí),proc2又開始重復(fù)類似proc1的動(dòng)作。
3.3 基于WM_DEVICECHANGE消息提高探測(cè)效率
采用進(jìn)程守護(hù)技術(shù)確實(shí)提高了系統(tǒng)的健壯性,但如何提高守護(hù)進(jìn)程與待檢測(cè)進(jìn)程之間工作效率是必須解決的問題。對(duì)可移動(dòng)存儲(chǔ)設(shè)備的實(shí)時(shí)探測(cè),若按照時(shí)間直接輪詢,則會(huì)耗費(fèi)很多系統(tǒng)資源。因?yàn)橹灰蛻舳顺绦騌SDMSClient運(yùn)行,不管有沒有可移動(dòng)存儲(chǔ)設(shè)備接入都會(huì)不斷輪詢,這其中有大部分是空轉(zhuǎn)輪詢,極大地浪費(fèi)了系統(tǒng)CPU時(shí)間。為了提高探測(cè)效率,按照時(shí)間直接輪詢是不合理的,在設(shè)計(jì)可移動(dòng)存儲(chǔ)設(shè)備管理系統(tǒng)時(shí)采用基于WM_DEVICECHANGE消息的實(shí)時(shí)探測(cè)來提高守護(hù)進(jìn)程與待檢測(cè)進(jìn)程之間工作效率。
當(dāng)設(shè)備狀態(tài)發(fā)生變化時(shí),系統(tǒng)將會(huì)以WM_DEVICECHANGE消息通知應(yīng)用程序。在可移動(dòng)存儲(chǔ)設(shè)備管理系統(tǒng)中,當(dāng)有可移動(dòng)存儲(chǔ)設(shè)備接入到客戶端計(jì)算機(jī)并且準(zhǔn)備就緒,可以正常訪問時(shí),系統(tǒng)會(huì)發(fā)出DBT_DEVICEARRIVAL類型消息,如果這時(shí)探測(cè)接入的設(shè)備,不僅可以保證不漏掉任何可移動(dòng)存儲(chǔ)設(shè)備的探測(cè),而且可以避免出現(xiàn)空轉(zhuǎn)輪詢,從而極大地提高了系統(tǒng)工作效率。WM_DEVICECHANGE所對(duì)應(yīng)的消息處理函數(shù)是OnDeviceChange,它在消息映射宏的位置比較特殊,具體使用可見參考文獻(xiàn)[6]。
目前,一般臺(tái)式機(jī)和筆記本電腦上基本是不配軟驅(qū)的,但為了完整性,在此還是做一下說明。當(dāng)USB或1394接口的可移動(dòng)存儲(chǔ)設(shè)備接入系統(tǒng)時(shí),系統(tǒng)會(huì)發(fā)出WM_DEVICECHANGE消息,但是軟盤插入到軟驅(qū)時(shí),系統(tǒng)無消息產(chǎn)生,這時(shí)需要利用HOOK技術(shù)來解決軟盤探測(cè)問題。
4 結(jié)論
融合進(jìn)程隱藏和進(jìn)程守護(hù)技術(shù)的可移動(dòng)存儲(chǔ)設(shè)備管理系統(tǒng)目前已經(jīng)應(yīng)用到某政府機(jī)關(guān)單位。實(shí)際應(yīng)用結(jié)果表明,改進(jìn)的遠(yuǎn)程線程注入技術(shù)提高了系統(tǒng)隱蔽性,能夠抵抗常規(guī)的安全檢測(cè)技術(shù),雙守護(hù)進(jìn)程的兩級(jí)監(jiān)控體系使得系統(tǒng)運(yùn)行更加安全。
參考文獻(xiàn)
[1] 王慶豐,劉功申.一種可信移動(dòng)存儲(chǔ)介質(zhì)管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].信息安全與通信保密,2008(10):46-49.
[2] 南理勇,左強(qiáng).可移動(dòng)存儲(chǔ)設(shè)備的識(shí)別[J].計(jì)算機(jī)與數(shù)字工程,2005,33(9):131-133.
[3] 肖道舉,左佳,陳曉蘇.進(jìn)程隱藏的相關(guān)問題研究[J].微處理機(jī),2008(4):78-80.
[4] 何志,范明鈺,羅彬杰.基于遠(yuǎn)程線程注入的進(jìn)程隱藏技術(shù)研究[J].計(jì)算機(jī)應(yīng)用,2008,28(6):92-94.
[5] 王崢,婁淵勝.遠(yuǎn)程線程注入技術(shù)在監(jiān)控系統(tǒng)中的應(yīng)用[J].計(jì)算機(jī)技術(shù)與發(fā)展,2010(3):207-210.
[6] 侯捷.深入淺出MFC[M].武漢:華中科技大學(xué)出版社,2001.