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