徐定強
(廣東松山職業技術學院,廣東韶關512000)
利用虛擬內存快照檢測惡意代碼
徐定強
(廣東松山職業技術學院,廣東韶關512000)
據美國計算機安全緊急響應小組US-CERT數據庫消息,緩沖區溢出已經成為最關切且極為常見的軟件漏洞之一。攻擊者經常利用這些漏洞注入惡意的shellcode以控制目標主機。不同于具有獨立功能的惡意軟件,惡意shellcode是作為正常輸入數據偽裝在二進制代碼片段中的。它們被注入到目標進程的虛擬內存,并劫持進程控制流;更重要的是,它們能夠在制造破壞之前,可以實現安全隱藏。當前,已提出了許多針對惡意shellcode的入侵檢測方法,從檢測的時間上看,大致分為兩大類:其一,在處理輸入數據的過程中進行檢測,簡稱DDC;其二,處理輸入數據之間進行檢測,簡稱DBC。本文將介紹怎么利用這兩種方法來檢測惡意Shellcode。
虛擬內存;Shellcode;DBC
在入侵檢測方法分類中,輸入數據在目標進程對其處理(執行)之前對它們進行檢測,其大致流程如圖1所示。我們對這一類檢測又進行了細分:靜態分析和動態分析。

圖1 基于DBC技術的檢測流程
1.靜態分析
首先對輸入數據進行反匯編,然后通過代碼級的模式分析與匹配進行篩選。模式可以是復雜的簽名或根據已知的惡意代碼進行簡單啟發式自學習。Toth和kruegel在文章《AccurateBufferOverflowDetectionviaAbstract PayloadExecution》中通過檢測NOPsleds的方式來鑒定exploit代碼。然而,攻擊者可不采用nopsleds技術或者使用多態(polymorphic)技術繞過這種檢測(譯注:NOP sleds即當shellcode不能準確定位時,為了使執行路徑“滑行”到shellcode而填充的一串無意義的指令串,通常為一串連續的NOP指令)。當然總體而言,靜態分析還是有效的,只是在檢測的準確性和完整性上存在一定的局限;因為二進制混淆技術可有效阻擾代碼的模式匹配分析。
2.動態分析
通過網絡仿真技術,將輸入數據反匯編成一些可能的執行匯編代碼鏈,然后模擬執行每個鏈。在仿真過程中,若任何一鏈存在惡意行為,則整個數據塊都被列為惡意代碼。盡管網絡仿真相比靜態分析能實現更好的完整性檢測,它依舊容易擺脫。其問題在于它沒有足夠的進程上下文信息,故必須在其初始化和仿真執行時進行假定。
DDC的檢測技術是在進程處理輸入數據的過程中進行檢測,若惡意的運行行為被檢測到,進程會執行并發出警報。輸入的數據及其目標進程狀態日志會被記錄下來以作進一步分析。流跟蹤(Flowtracking)技術使用一種基于感染的方式來檢測輸入信息是否為惡意數據。通過地址空間隨機化可有效地抵御利用內存錯誤的攻擊方式。操作系統擴展方式即在系統內核或庫文件中插入一個檢查點以確定調用的脆弱庫函數是否安全。總體而言,DDC檢測方式是一種基于廣泛性使用進程上下文的良好完整性檢測,但其檢測效率偏低。
與DDC檢測相比,DBC檢測方法則具有較高的檢測效率,但它在檢測的全面性上又不如DDC。這是因為DBC檢測方法沒有使用目標進程在虛擬內存中的運行時信息。
1.系統設計
進程在處理輸入數據之前,系統首先對目標進程虛擬內存快照處理,然后將快照信息作為輸入參數,送入DBC檢測系統,大致流程如圖2所示。此時,DBC檢測器存在新的數據信息,即目標進程在虛擬內存的運行時信息。虛擬內存快照記錄了一個進程的虛擬內存當前狀態,包括目標進程的地址空間和寄存器值。此系統中快照以下面兩種方式使用:
(1)初始化虛擬執行環境。在目標進程處理數據之前的瞬間,其控制流即被定位到我們的系統。此時已經獲取到虛擬內存快照,并立刻激活檢測程序,同時初始化輸入數據被執行和監控的虛擬環境。快照用來初始化此虛擬環境并提供兩個好處。其一,快照對觀察輸入數據的真實行為至關重要,因為它們詮釋了真實的執行流。為了準確地揭露shellcode的行為,此環境盡可能地模仿指定進程處理輸入數據的過程。在惡意shellcode里,進程狀態可用來重定位執行流。若沒有與進程相關的虛擬內存信息,shellcode的執行流可能會發生改變或者甚至被中斷。其二,虛擬內存快照很集中,容易獲取,而且系統的虛擬環境是輕量型的。在已存在的DBC檢測方法中,很難在檢測系統中獲取到真實的shellcode行為,因為其虛擬內存信息要么被消耗要么被忽略了。

圖2 獲取快照信息,將其輸入到目標進程的檢測器中
(2)方便基于系統調用的檢測。虛擬內存快照可以讓系統及時發現shellcode的其中一種行為,即系統調用的觸發,這對檢測而言極為重要。惡意shellcode借助系統調用以切換到內核模式運行操作系統相關操作。無論其偽裝性多好,它總會使用系統調用來啟動攻擊行為。不同的系統調用是通過系統調用號和參數來區分的,其存放在寄存器中。如在IA-32體系架構中,系統調用號存放在eax中,其函數參數則存放在ebx、ecx、edx、esi、edi等寄存器中。已存在的DBC檢測方法包含靜態方法和動態方法,都不可能在檢測中跟蹤到系統調用,因為它們缺乏必要的寄存器信息。故使用虛擬內存快照,我們可準確鑒別其使用的系統調用,以提高檢測精度。下面將根據其工作流來介紹系統的整個設計。
2.系統架構
下面將介紹整個系統架構的設計并提出它的關鍵模塊——shellcode分析器。
(1)結構。整個系統由三個模塊組成,如圖3所示。第一個模塊為協議分析器,可從輸入信息中萃取出頭部信息,并可依照上層的需求將payload劃分成多個子payload。第二個模塊為shellcode分析器,主要負責借助虛擬內存快照檢測惡意shellcode;其可接收來自協議分析器、外部文件或者同一主機內與本地進程間通信的另一個子進程的sub-payloads。第三個模塊為上下文信息的提供者(ContextInformationProvider),充當模擬的執行環境和真實環境之間的一個接口。

圖3 系統整體設計
(2)關鍵模塊——shellcode分析器。shellcode分析器結構如圖4所示。此模塊由指令解密器、指令仿真器、惡意行為檢測器、內存仿真系統以及一整套模擬寄存器。指令解密器不斷將緩沖區內容翻譯成指令,并發送到仿真器。仿真器接收到每一條指令后,它會仿真出一個執行環境,如為內存仿真系統及寄存器提供運行時虛擬環境。此環境被虛擬內存快照實例化,在仿真過程中,虛擬內存或寄存器的訪問都被直接定位到內存仿真系統或者寄存器中。

圖4 shellcode分析器設計結構
3.工作流分析
Shellcode分析器的工作流程見圖5。從輸入數據的每個位置看,Shellcode分析器使用虛擬內存快照來模擬解碼器指令的執行順序。快照對觀測輸入數據的真實行為提供方便,以解釋真實執行流。ShellcodeAnalyzer()函數存在兩個輸入參數:其一為base_address,即將被分析的輸入數據起始地址;其二為base_size,即輸入數據大小。由快照提供的精確虛擬內存信息可確保Shellcode的執行流不被中斷。若執行的子序列為惡意Shellcode,則其使用的所有指令都會在執行流的仿真中檢測到,包括Shellcode本身的、由原始消息產生的及其加載到目標進程地址空間的庫文件等。故在Shellcode分析器內使用虛擬內存快照進行仿真可用來準確觀測多形的變化的Shellcodes及其在群攻擊中使用的Shellcode。

圖5 Shellcode工作流程代碼
hellcode分析器的核心函數為MaliciousInstruction-Seq(),此函數可檢測一惡意指令序列。惡意指令序列的工作過程由上面代碼的14~34行給出。函數一開始即使用虛擬內存快照初始化仿真環境,然后執行一個while循環以仿真指令序列的執行,直到發生以下錯誤:其一,檢測到惡意行為;其二,遇到非法指令或特權指令;其三,內存非法訪問;其四,已執行指令的數量超過了上限。
MaliciousInstructionSeq()函數當遇到條件2和4或者MALICIOUS_SEQUENCE時,則返回BENIGN_SEQUE NCE。在Linux和MSWindows系統里,并不是所有系統調用都會危害目標主機的安全,這依賴于系統調用號和存儲在寄存器中的參數。因為快照,系統調用號和其參數可準確獲取,此時即可確定當前系統調用是否會危害主機安全。例如,Linux中的11號系統調用execve函數,用于執行某一程序。在指令的仿真中,若其為系統調用指令,且模擬寄存器eax值為11,則系統調用號為11。在校驗存儲在其他模擬寄存器中的參數后,若其第一個參數為“/bin/sh",則我們可推斷此指令具有一定的危害性,因為其作用是試著打開一個root權限的shell。此案例中,系統調用指令將會被列為惡意系統調用。
[1]白南石.關于虛擬內存的一點理解[J].科技信息,2010(27).
[2]王穎,李祥和,關龍,崔寶江.Shellcode攻擊與防范技術[J].計算機工程,2010(18).
[3]董鵬程,康緋,舒輝.一種Shellcode動態檢測與分析技術[J].小型微型計算機系統,2013(7).
TN
A
1673-0046(2015)4-0167-03