潘璠,洪征,周振吉,吳禮發
(解放軍理工大學 指揮信息系統學院,江蘇 南京 210007)
目前,協議逆向工程在入侵檢測、漏洞挖掘、協議重用等領域得到廣泛的應用。根據分析對象的不同,現有的協議逆向方法大致分為2類:基于網絡流量分析的方法[1,2]和基于執行軌跡分析的方法[3~7]。前者以截獲的網絡數據流為分析對象,依據協議字段的取值變化頻率和特征推斷得到協議格式。后者利用動態污點分析技術跟蹤程序對報文數據的解析過程,并通過分析帶污點信息的執行軌跡實現協議格式的提取。相比于網絡流量分析,執行軌跡分析獲取的協議知識更為精確且不受樣本集限制,正逐漸成為協議逆向技術的主流。
Polyglot[3]首次提出基于執行軌跡分析的協議格式提取方法,但僅實現了對格式中分隔符、定位符和關鍵字的識別。Wondracek等人[8]在 Polyglot的基礎上對多次分析的結果進行融合,得到更具通用性的協議格式描述。AutoFormat[9]在執行軌跡中加入了指令執行的上下文信息,通過上下文匹配實現了協議字段結構的提取。Dispatcher[5]結合對函數調用參數的分析,豐富了分析結果中字段的語義信息。應凌云等[7]則針對惡意軟件分析的需求,在現有方法的基礎上實現了對協議字段的程序行為語義關聯分析,進一步提升了協議逆向的應用價值。然而,現有方法僅對執行軌跡中處理污點數據的指令進行語法層次分析,可能導致字段識別存在冗余和沖突,進而影響了結構提取和語義推斷的準確性。為此,提出了一種新的語義層次的協議格式提取方法。該方法在執行軌跡的重放過程中,首先將二進制指令轉化為精簡的中間語言形式;然后,針對具有單一語義的中間指令,通過細粒度的動態污點分析對字段語義解析過程進行跟蹤;最后,依據字段的語義解析特征,在語義層次實現協議格式的提取。
本文的主要貢獻如下:1) 首次將基于中間語言的動態污點分析思想應用于協議逆向分析領域。將語義復雜、種類繁多的二進制指令轉化為精簡、單一語義的中間語言形式,在降低指令語義分析復雜度的同時,提高了報文數據跟蹤的準確性。2) 提出一種語義層次的字段識別策略。依據字段的語義不可分割性,在語義層次實現字段識別,避免了結果中的字段冗余和沖突,進而提高了協議格式提取的精確度。3) 實現了語義層次的協議格式提取工具原型系統(SPAE, semantic-level protocol format extractor)。利用原型系統對不同類型的多種協議進行了測試,并與現有方法進行了對比。測試結果驗證了本文方法的有效性。
協議格式由若干個字段組成,字段為具有特定語義的最小不可分割的連續字節序列,字段之間存在順序、并列和層次關系。根據這一定義,協議格式提取可分為字段識別、結構提取和字段語義推斷3個階段[5]。字段識別的正確與否直接影響到結構提取和語義推斷的準確性,是協議格式提取的關鍵。
傳統方法利用細粒度的動態污點分析對每個污點報文字節進行標定和追蹤,然后掃描執行軌跡中指令操作數的污點記錄,根據污點數據塊訪問的粒度實現字段邊界的劃分。然而由于內存拷貝、校驗和計算以及編譯器優化等原因,這種在指令語法層次實現的字段識別方式存在粒度過細、冗余和沖突的缺陷[4]。表1給出了傳統方法通過分析執行軌跡實現字段識別的簡單示例。其中,帶污點記錄的執行軌跡片段取自網絡程序 Emule0.48a的報文解析過程。

表1 傳統方法的字段識別過程
在表1中,第1行指令將報文首部的4 byte數據讀入寄存器esi。由于第2~4行指令均操作了污點數據塊<0,3>,傳統方法對字段的識別明顯存在冗余。另外,讀入的4 byte污點數據經過和0xFF的與運算,參與比較并影響跳轉的僅為單字節數據,實際的字段邊界為<0,0>。由于污點數據塊<1,3>還將被后續指令訪問,這一誤差將導致字段識別的沖突。
為了提高協議格式提取的精度,AutoFormat[9]根據字段的邊界范圍構建報文結構樹,通過刪除重復節點去除冗余,但其在消除邊界沖突時將使得字段劃分過細。Tupni[4]以指令操作數訪問的污點數據塊作為候選字段,并將訪問的次數作為該候選字段的權值,將邊界劃分問題轉化為具有最大權值的不相交字段集合的計算??紤]到集合覆蓋本質為 NP完全問題,Tupni僅采用貪心算法獲取局部最優解,并不能保證結果的正確性。
僅在語法層次對二進制指令進行分析,是現有方法難以保證字段識別正確率的根本原因。對于輸入數據而言,其解析過程分為語法解析和語義解析2個階段[10]。在語法解析階段,協議實體將字段對應的連續字節序列讀取到程序變量中,并進行格式化和校驗處理;在語義解析階段,協議實體將對程序變量中字段的取值做出解釋。但在二進制程序中,指令處理的對象為內存單元和寄存器,沒有程序變量的概念。無論字段是數值、指針還是字符流,都被視為位寬有限的數字進行處理,其粒度與指令訪問污點數據的粒度之間并不存在嚴格的對應關系。因此,現有語法層次的指令分析方式難免在識別字段的過程中存在誤差。
字段作為協議格式的基本單位,在語義上具有最小不可分割性。因而在語義解析階段,與指令相關的連續輸入數據必然屬于同一個字段,并且該字段僅包含這些數據。即使在經過編譯器編譯和優化的二進制指令級,這種特性將依然存在,否則協議實體無法與對應的協議規范相匹配。因此,利用字段的語義解析特征劃分字段邊界,將有效克服語法層次方法存在的缺陷,得到更為精準的結果。
基于上述分析,本文考慮在語義層次實現字段識別。根據功能的不同,字段語義可以分為控制語義和操作語義2類[5]??刂普Z義指定報文自身的語法解析方式,如長度、分隔符、關鍵字等;操作語義則決定協議實體如何完成響應操作,如網絡地址、端口、文件路徑等。本文發現,二進制程序對控制語義的解析通過跳轉條件與輸入相關的控制流分支實現,而對操作語義的解析則通過參數與輸入相關的函數調用來完成。因此,本文方法的基本思路是,通過動態污點分析技術跟蹤報文解析過程,重點對分支指令的跳轉條件和函數調用參數進行分析,進而實現語義層次的協議格式提取。
方法以二進制程序和協議報文為輸入,記錄報文解析過程的完整執行軌跡,然后對執行軌跡進行重放,利用基于中間語言的細粒度動態污點分析技術,在語義層次實現協議格式的提取。對于執行軌跡中的每條二進制指令,重放過程分為3個階段。
1) 中間語言轉換。將二進制指令轉換為精簡的、語義等價的中間語言形式,避免直接對種類繁多、語義復雜的二進制指令進行處理。
2) 動態污點分析。依據中間語言的指令語義更新污點上下文C,實現基于中間語言的細粒度動態污點分析,為語義層次的協議格式提取提供支撐。
3) 協議格式提取。分析字段語義解析相關的中間指令,根據語義層次的字段識別策略將指令操作數相關的污點標簽合并為字段,并利用已有方法提取報文結構,最終得到BNF形式的協議格式描述GM。
方法流程更為精確的描述如算法1所示。后續將詳細介紹上述階段的具體處理策略。
算法1 語義層次協議格式提取
輸入:二進制程序P,報文輸入M
輸出:BNF形式的協議格式描述GM
1) ExtractFormat (Trace)
2) let F, GM:= ?; /*F 為已識別字段集*/
3) trace:= LogTrace(P, M); /*執行軌跡的記錄*/
4) C:=InitTaintContext(); /*污點上下文的初始化*/
5) for each i in Trace do
6) ilSeq:=ILtranslate(i); /*中間語言轉換*/
7) for each stmt in ilSeq do
/*細粒度動態污點分析*/
8) C:=DynamicTaintAnalysis(stmt, C);
9) f:=FieldIdentify(i, C, F); /*語義層次字段識別*/
10) F:={f}∪F
/*報文結構提取*/
11) GM:=StructureExtract(stmt, f , GM);
12) end for
13) end for
14) return GM
在二進制級進行語義層次的字段識別主要面臨3個方面的挑戰。首先,指令語義的復雜度高,例如寄存器別名、指令前綴等問題必須考慮。如果對報文數據傳播的跟蹤不夠精確,將無法避免字段語法解析階段帶來的誤差。其次,指令集規模極其龐大,將導致指令語義分析策略過于繁冗。在 x86指令集中,僅條件跳轉指令的種類就超過 30種,在保證完備性的前提下分析策略的復雜度將不可接受。最后,底層指令缺乏對函數調用的抽象,無法通過函數調用參數實現對字段語義的推斷。
針對上述挑戰,采用將二進制級指令轉換為中間語言指令的方式進行分析。David Brumley等[11]提出了面向二進制程序分析的中間語言BIL,如圖1所示。為了簡化描述,省略了圖1中load和store指令的部分參數,默認采用小尾的內存讀寫方式。

圖1 擴展的BIL語法
協議格式提取方法基于BIL實施,首先利用二進制代碼分析平臺 BAP[11]將執行軌跡中的匯編指令轉換為中間語言,主要分為2個步驟:1) 將二進制指令轉化為精簡的VEX IL[12]形式;2) 使用BIL指令顯式描述VEX指令的副效應(side-effect)。
相比于原始匯編指令,BIL的指令規模明顯縮減,并且每條指令都具有單一且明確的語義,在指令語義描述方面具有明顯的優勢。為了提升跨平臺的代碼分析能力,BAP在指令轉換時將所有平臺相關的特殊指令簡化為無執行語義的special string指令,對其不做處理。由于執行軌跡中的跳轉路徑與指令參數取值均已確定,并且特殊指令通常與報文數據的解析無關,BAP的簡化不會造成后續動態污點分析的誤差。
需要說明的是,中間語言轉換得到的BIL指令序列并不唯一,例如BAP可以進一步將BIL指令序列轉換為靜態單賦值(SSA, single static assignment)形式。雖然轉換后的BIL指令可以在語法特征上存在差異,但 BAP能夠保證除平臺相關的特殊指令外,得到BIL形式的指令在語義上與原始指令等價。因此,方法能夠在降低指令分析復雜度的同時,確保語義層次字段識別準確度。
為了分析執行軌跡重放過程中的報文解析語義,需要為每個輸入數據字節賦予唯一的污點標簽,進而跟蹤每個污點字節的傳播過程。為此,提出了基于BIL的細粒度動態污點分析策略,通過維護污點上下文來保存輸入字節的傳播狀態,并根據指令的語義對污點上下文進行更新,實現細粒度的動態污點分析。首先給出污點上下文的定義。
定義1 污點上下文C可定義為四元組<μ, Δ,Tμ, TΔ> ,其中,
1) μ為內存地址到取值的映射,μ[o]表示地址為o的內存字節取值;
2)Δ為變量到取值的映射,Δ[ var]表示變量var的取值;
3)Tμ為內存地址到污點屬性的映射,Tμ[o ]表示地址為o內存字節的污點屬性;
4)TΔ為變量及其字節偏移到污點屬性的映射,TΔ[v ar, n]表示變量var的第n byte的污點屬性。
由于程序內部復雜的數據依賴關系,內存和寄存器變量通常與多個污點數據字節相關。因此在動態污點分析過程中,將污點屬性定義為污點標簽的集合。為了精確描述污點分析策略,采用式(1)所示推理規則對指令執行語義進行定義。

其中,stmt為當前執行的指令,運算符?I表示指令執行操作,computation為完成污點屬性更新所需的計算條件。在 computation中,←表示更新操作符,■表示連續操作符。
表
依據上述約定,基于BIL的細粒度動態污點分析策略如圖2所示。動態污點分析策略由3條指令語義規則和9條表達式賦值規則組成,實現對污點屬性的標記和傳播。污點標記由函數調用指令的語義規則實現。以recv函數為例,規則T-RECV依據函數返回的實際報文長度創建污點標簽,并對函數第 2個參數指向的內存區域進行污點屬性的初始化。污點傳播是對污點屬性映射μT和ΔT的更新,分別由指令語義規則T-ASSIGN、T-RSTORE完成。
在表達式賦值過程中,二元運算符&、|、⊕的結果與參數之間存在位對應關系。為了提高精度,污點分析策略采用T-BBINOP規則單獨對這類運算符進行處理,得到位精確的表達式污點取值。而對于其余的二元運算符(+,*,mod等),則認為運算結果與所有參數中包含的污點標簽相關,通過T-ABINOP規則進行表達式污點賦值。由于二進制程序中清零操作(xor EAX, EAX)和截取操作(and ECX, 0FFh)通過位運算指令實現,T-BBINOP規則還根據指令的參數類型和取值對表達式的污點取值進行修正,以保證污點屬性映射與指令語義之間的等價性。
動態污點分析策略僅對賦值、內存寫入和函數調用3類指令進行處理,不考慮其他指令對動態污點上下文的影響。一方面,goto exp、return等跳轉指令只決定執行流程,無法更新取值和污點屬性映射;另一方面,special string表示的如浮點計算等復雜指令或者特權指令,通常情況下與報文解析過程無關。因此,對指令語義規則的簡化是可以接受的,并且可以提高規則匹配的效率。

圖2 基于BIL的細粒度動態污點分析策略
由圖2可以看出,基于精簡的、具有單一語義的BIL指令集,方法采用少量規則即可實現細粒度的動態污點分析,顯著降低了指令分析的復雜度。與已有基于中間語言的動態污點分析[13]不同,上述策略還考慮了指令參數位寬的差異,與二進制指令的語義更相吻合。
由于污點屬性為污點標簽的集合,字節粒度的污點屬性跟蹤將帶來巨大的內存開銷,同時污點屬性的復制和合并操作也會導致嚴重的性能損失。王鐵磊等[14]依據污點數據傳播的重疊性和連續性特征,引入 roBDD表示集合形式的污點屬性,在減少內存消耗的同時,顯著提高了分析效率。方法在具體實現時沿用了這一思想,以確保動態污點分析策略的可行性。
在動態污點分析的基礎上,提出一種語義層次的字段識別策略?;舅枷胧牵航柚谖埸c上下文,分析分支跳轉指令和函數調用指令的參數,將污點屬性中連續污點標簽識別為字段,并加入到字段集合F中。圖3給出了策略規則的形式化描述。
以F-IF規則為例,對于if exp1then goto exp2else goto exp3指令,假定跳轉條件 e xp1的污點取值為T,計算T所包含污點標簽的集合若有,可將[p,q]識別為字段長度,并更新 F=F∪{f

圖3 語義層次字段識別規則
考慮到goto exp在跳轉地址輸入可控的條件下也作為分支跳轉指令,F-GOTO規則采用與F-IF規則相同的策略對跳轉地址的污點取值進行分析。而對于函數調用指令,F-CALL規則函數的輸入參數依次采用類似的策略。
為了描述字段識別過程,以圖4所示的代碼片段為例。圖4(a)與表1對應,圖4(b)為轉換后的BIL代碼。

圖4 BIL形式的代碼示例
依據動態污點分析策略,圖4(b)中代碼片段的重放過程如表2所示。由于映射μ、Δ、μT與字段識別無關,表中僅保留對映射ΔT更新的描述。1)~5)行均為賦值指令,因此應用規則T-ASSIGN對映射ΔT進行更新。而第6行.為分支跳轉指令,觸發F-IF規則對字段進行識別。計算跳轉條件 R_ZF==0x1對應的污點取值 T為[{i0},{i0},{i0},{i0}],顯然有,因而識別的字段為<0,0>。對比表 1和表2可以看出,語義層次的字段識別可以有效地避免字段語法解析過程帶來的冗余,識別字段邊界也更為精確。
由于協議實體功能的差異,并不是所有協議字段都會被程序解析,因而識別的字段結果往往對報文數據的覆蓋并不完全。在執行軌跡重放完畢后,將所有已識別字段之間的連續字節區域視為一個完整字段加入到字段集合F中??紤]到存在連續多個未解析字段的可能性,這種處理方式可能導致字段識別的粒度較粗,但能夠保證報文結構的完整性。
在字段識別的基礎上,方法還結合已有的結構提取技術實現完整的協議格式逆向分析。Lin等[15]指出并通過實驗證明,當結構化數據按照自頂向下方式解析時,數據結構可通過分析指令之間的動態控制依賴關系得到,克服了原有啟發式結構提取策略的缺陷。但Cui等[4]發現,當內存拷貝、校驗和計算等操作導致字段劃分過細甚至沖突時,Lin的方法將失效。本文方法將語義層次字段識別與 Lin的方法結合,有效彌補了這一缺陷。
為了評估方法的有效性,本文在Linux平臺上實現了原型系統 SPAE,并使用SPAE對若干協議報文進行了格式提取,同時將提取的結果與現有方法結果進行了對比分析。

表2 語義層次的字段識別過程
SPAE由靜態分析模塊、執行軌跡生成模塊、中間語言翻譯模塊、污點分析引擎以及格式提取模塊5部分組成,如圖5所示。

圖5 SPAE設計架構
靜態分析模塊利用 IDA Pro反匯編二進制程序,將識別的靜態庫函數信息提供給執行軌跡生成模塊,并計算分支指令的直接必經節點信息,為報文結構提取時動態依賴關系的計算提供依據。
考慮安全性與跨平臺需求,執行軌跡生成模塊以插件形式與系統級動態分析平臺 TEMU[16]進行交互,負責記錄報文解析過程中指令靜態信息、指令運行時信息以及函數調用的參數和返回值等。
中間語言翻譯模塊擴展了 BAP平臺[11]的組件toil和iltrans,負責將執行軌跡中的指令轉換為帶函數抽象的BIL形式。
作為SPAE的核心,污點分析引擎負責維護重放過程中的污點上下文。此外,污點分析執行引擎還集成了roBDD開源庫BuDDY[17],用于實現污點屬性的壓縮存儲。
格式提取模塊根據污點上下文分析指令語義,實現字段識別和結構提取,并輸出分析結果。
本文利用SPAE對Windows環境下多種協議解析程序進行了測試。具體分析環境配置如下:運行SPAE的分析主機配備了Intel Core Duo 2.93 GHz的E6500 CPU,4 GB內存和32 bit的Ubuntu9.04系統,同時在TEMU中加載32 bit的Windows XP系統作為協議解析程序的執行環境。
根據協議類型,選擇了3種二進制協議(DNS、eDonkey、DHCP)、3種文本型協議(FTP、HTTP、SIP)以及混合型的McAfee ePO框架服務協議作為測試對象。報文樣本及執行軌跡信息如表3所示。
SPAE對記錄的執行軌跡進行重放,并輸出協議格式提取結果。將結果中識別的字段與公開的協議規范進行對比,以評估字段識別的準確率。同時作為對照,借助于TEMU自帶的tracecap插件記錄了帶污點信息的執行軌跡,并分別采用AutoFormat的字段樹構造方法和Tupni的加權集合覆蓋計算方法完成字段識別。
表4給出了報文實際包含的字段數、執行軌跡中與污點相關的記錄數以及3種方法的字段識別結果對比。|F|、|Fc|、|Fo|分別為正確識別、識別粒度過粗和識別粒度過細的字段數。可以看出,3種方法識別的字段數與報文實際的字段數相當,均有效避免了大規模污點訪問記錄可能導致的字段重復識別。相比而言,AutoFormat與Tupni的識別結果中同時存在粒度過粗和過細的字段,而SPAE的結果中則僅存在少量粒度劃分過粗的字段。進一步統計得到AutoFormat、Tupni和SPAE的平均字段識別準確率分別為 71.1%、79.4%和 93.9%,這說明SPAE具有更精準的字段識別能力。在此,對字段識別誤差產生的原因進行詳細分析。
對于 Emule客戶端之間發送的 Hello報文,SPAE能夠正確識別所有的字段,而 AutoFormat和Tupni均存在字段識別的誤差,如圖6所示。對于單字節的Protocol Type字段,目標程序采用表1所示的方式進行解析,對Protocol Type字段和Length字段訪問邊界分別為<0,3>、<1,4>。AutoFormat在構造字段樹時,將數據塊<0,3>、<1,4>作為結構處理,識別的字段為<0,1>、<1,3>和<3,4>,導致對Length字段的劃分粒度過細。盡管邊界存在沖突,Tupni能夠正確識別出Protocol Type字段和Length字段。這是由于Length字段作為循環條件被反復訪問,<0,3>的累計權值要遠小于<1,4>,因而在計算加權集合覆蓋的過程中被剔除。

表3 SPAE測試樣本信息

表4 字段識別的結果統計

圖6 eDonkey Hello報文的字段識別結果對比
程序對Payload Type字段的解析方式與Protocol Type字段相同。類似地,AutoFormat將User Hash字段錯誤識別為2個劃分粒度過細的字段。另外,由于數據塊<5,8>的累計訪問權值大于數據塊<7,23> (<7,23>通過對同一指令連續訪問的數據塊合并得到),Tupni將字段邊界錯誤識別為<5,8>和<9,23>。相比 AutoFormat和 Tupni,SPAE采用更為精確的動態污點分析策略,避免了位運算造成的字段識別誤差。
對于DNS查詢報文,3種方法正確識別的字段數分別為9、9和10,如圖7所示。通過分析發現,程序分別采用不同的指令對Flags字段的2個字節進行讀取和運算,因而AutoFormat與Tupni將Flags字段錯誤識別為 2個單字節字段。而 SPAE只在Flags比較時實現字段識別,因而正確劃分了該字段邊界。此外,AutoFormat、Tupni和SPAE將連續的Answer RRs、Authority RRs和 Additional RRs字段識別為同一字段,導致對字段的劃分粒度過粗。這是由于目標程序在解析請求報文時跳過了對這些字段的處理,因而執行軌跡中并不存在對這些字段的處理指令,3種方法只能將未識別的連續字節區域合并為單獨的字段。
對于DHCP協議的BOOTP請求報文,3種方法的字段識別結果相同,除將Transaction ID、Server host name等11個字段被錯誤合并為5個字段粒度劃分過粗的字段之外,正確識別了其余的 28個字段。對執行軌跡的分析表明,字段誤識別的原因與DNS報文解析類似,均在于目標程序未對這些字段進行處理。

圖7 DNS查詢報文的字段識別結果對比
對于文本型的FTP協議,由于用戶請求報文的格式較為簡單,3種方法均正確識別了所有的字段。需要說明的是,雖然程序以字節為粒度讀取和處理字符串,AutoFormat與Tupni通過對同一指令連續污點記錄的合并避免了字段誤識別;SPAE則通過對字符串處理函數的抽象,實現了語義層次的文本型字段的識別。
對于 HTTP請求報文和 SIP注冊報文,SPAE的識別結果與協議規范一致,而 AutoFormat和Tupni識別結果中存在少量的劃分粒度過細的情況。通過分析發現,誤識別的字段均為Quality Factor字段(如“q=0.500”),用于指定服務器返回媒體類型的優先級。由于此類字段為字符串形式的浮點值,目標程序對小數點前后的字符采用了不同的加權方式,導致了AutoFormat和Tupni錯誤地將該字段細分為包括小數點在內的3個字段。可以看出,得益于語義層次的字段識別方式,SPAE消除了類似語法解析過程給字段識別帶來的誤差。
對于 McAfee ePO框架服務協議的策略檢查報文,SPAE正確識別的字段數遠多于AutoFormat和Tupni。通過對執行軌跡的分析發現,ePO服務器首先將報文數據與 0xAA進行異或,以完成對報文的解密。因而在字段樹構造過程中,AutoFormat將報文數據的每一字節都識別為字段,而將實際的報文字段識別為結構體。同樣受到解密過程的影響,Tupni僅能正確識別出累計訪問權值超過自身長度的字段,其中包括 1個類型字段與 26個長度字段。而SPAE正確識別出了絕大部分的字段,僅報文尾部與數字簽名相關的5個字段因客戶端版本過低而未被服務器處理,導致了字段劃分粒度過粗的誤差。
在字段識別的基礎上,還對報文樣本的結構進行了識別。結果表明,SPAE能夠精確識別出所有報文樣本的結構。以 eDonkey Hello報文為例,Wireshark和SPAE識別出的報文結構如圖8所示。可以看出,SPAE識別的報文結構層次與Wireshark的識別結果基本一致,僅對協議類型字段的識別存在差異。這是由于Emule0.48a同時支持協議類型取值為0xC5的Emule擴展協議,需要對協議類型字段進行比較以選擇對應的指令分支,因此協議類型字段在SPAE識別結果中的層次要高于其他字段。由此說明,SPAE的識別結果更加接近于程序對報文的解析方式。
SPAE通過基于BIL的動態污點分析策略提高了字段識別的精確度,但可能存在時空開銷過于龐大的問題。表5給出了SPAE與tracecap跟蹤報文解析過程的時空開銷對比。為了精確評估動態污點分析對效率的影響,在統計過程中SPAE未啟用格式提取模塊。

圖8 eDonkey Hello報文結構識別對比

表5 SPAE與tracecap的時空開銷對比
從表 5中可以看出,SPAE的時間開銷約為tracecap的30~70倍。特別是對于擁有圖形界面的協議解析程序(eDonkey和SIP),協議格式提取過程耗費的時間接近0.5 h。但考慮到漏洞挖掘、協議重用等逆向應用對實時性的要求較低,認為以這樣的時間開銷為代價換取格式提取的精確度是值得的。另外,SPAE使用的內存空間要明顯多于tracecap,但仍在可接受的范圍之內。同時SPAE的內存開銷并未隨著報文數據規模的增大而顯著增長,由此驗證了文獻[14]的結論:基于roBBD的污點屬性存儲的開銷并不依賴于污點數據的多少,更適用于大規模的細粒度動態污點分析。
由于缺乏公開的測試樣本集和原型工具,本文對 AutoFormat和 Tupni的字段識別部分進行了實現,以對比SPAE與已有方法的字段識別準確度。結合已有測試結果[4,9]可以發現,本文中AutoFormat和Tupni的字段識別準確率與已有測試結果基本一致,僅因測試目標的不同而存在細微差別。由此說明,SPAE在協議格式提取的精確度方面的確更具優勢。此外認為,所提出的細粒度動態污點分析策略并不局限于協議逆向分析領域,還能與惡意攻擊檢測[18]、測試用例生成[19]等領域的研究成果相結合,進一步推進動態污點分析在網絡安全各個領域的應用。
本文方法在抽象的中間語言層進行指令分析,在降低分析策略復雜度的同時,能夠以較少的代價移植到其他指令系統,具有跨平臺的優勢。值得說明的是,在SPAE的設計架構中,完全可以將TEMU替換為其他二進制插樁工具,如PIN、DynamoRIO等,以提高執行軌跡生成的效率。但考慮到插樁操作可能對協議解析流程產生干擾,采用類似TEMU的虛擬機系統得到的分析結果更為可靠。另外,本文方法還可以采用在線方式實現,以避免記錄指令數目龐大的程序執行軌跡。但采用離線方式使執行軌跡記錄階段和協議格式提取階段分離,能夠避免分析過程給目標程序執行帶來過高的時延,確保報文解析流程的正常執行;同時執行軌跡分析可以在多個更高性能的計算平臺上并行實現,以提高協議格式提取的效率。
隱式信息流的跟蹤是動態污點分析所面臨的一個重要挑戰,目前還沒有通用可行的解決方案。已有研究主要采用指針污染和控制流污染的方式,極易引起過污染 (over-tainting) 的問題[20,21]。與程序異常檢測不同,協議格式提取對過污染缺陷更為敏感。雖然欠污染 (under-tainting) 可能導致部分字段無法識別,但過污染將給整個協議格式提取過程帶來大量的干擾。目前在實驗中還尚未發現欠污染給字段識別帶來的影響,因此在動態污點分析策略中忽略了對隱式信息流的處理。
筆者注意到,包括SPAE在內的現有方法雖然實現了對字段邊界和語義的識別,但無法獲取字段之間的依賴關系。例如SPAE能識別出字段具有長度語義,但無法獲知其取值所表示的真實長度。存在這一缺陷的原因在于動態污點分析僅能跟蹤污點數據的傳播,但不能提供協議解析過程對污點數據處理的運算關系。在未來工作中,將嘗試引入基于中間語言的符號執行技術[13,14],以獲取更為豐富的協議格式信息。
目前,本文方法主要針對明文協議的格式提取,對復雜加密協議無能為力,并且沒有考慮到對協議狀態機的推斷。但現有的加密協議逆向方法[5,22]和協議狀態機推斷方法[6,23]均以協議格式提取為基礎,因而相信,結合本文提出的語義層次的字段識別思想,這些方法的識別準確率將得到進一步提高。
針對現有方法存在的字段識別準確度不高的缺陷,本文提出了一種語義層次的協議格式提取方法。該方法將二進制指令轉換為語義等價的中間語言形式并進行重放,通過細粒度的動態污點分析技術跟蹤報文字段的語義解析過程,在語義層次實現了對協議格式的提取。對原型系統的測試結果表明,本文提出的方法能夠以可接受的時間和內存開銷實現協議格式的提取,相比于 AutoFormat和Tupni具有更高的識別準確率。
下一步,計劃結合符號執行技術以增加對字段依賴關系的提取能力,并實現更為完善的支持加密協議和狀態協議識別的協議逆向系統。
[1] CUI W, KANNAN J, WANG H. Discoverer: automatic protocol reverse engineering from network traces[A]. The 16th USENIX Security Symposium[C]. Boston, Sheraton, USA, 2007. 199-212.
[2] 李偉明,張愛芳,劉建財等. 網絡協議的自動化模糊測試漏洞挖掘方法[J].計算機學報,2011, 34(2):242-255.LI W M, ZHANG A F, LIU J C, et al. An automatic network protocol fuzz testing and vulnerability discovering method[J]. Chinese Journal of Computers, 2011, 34(2):242-255.
[3] CABALLERO J, YIN H, LIANG Z, et al. Polyglot: automatic extraction of protocol format using dynamic binary analysis[A]. ACM CCS[C]. Alexandria, VA, USA, 2007.317-329.
[4] CUI W, PEINADO M, CHEN K, et al. Tupni: automatic reverse engineering of input formats[A]. ACM CCS[C]. Alexandria, VA, USA,2008. 391-402
[5] CABALLERO J, POOSANKAM P, KREIBICH C, et al. Dispatcher:enabling active botnet infiltration using automatic protocol Reverse-engineering[A]. ACM CCS[C]. Chicago, IL, USA, 2009.621-634.
[6] COMPARETTI P, WONDRACEK G, KRUEGEL C, et al. Prospex:protocol specification extraction[A]. IEEE S&P[C]. Oakland, California, USA, 2009.110-125.
[7] 應凌云,楊軼,馮登國等. 惡意軟件網絡協議的語法和行為語義分析方法[J]. 軟件學報, 2011, 22(7): 1676-1689.YING L Y, YANG Y, FENG D G, et al. Syntax and behavior semantics analysis of network protocol of malware[J]. Journal of Software, 2011,22(7): 1676-1689.
[8] WONDRACEK G, COMPARETTI P, KRUEGEL C, et al. Automatic network protocol analysis[A]. NDSS[C]. San Diego, California, USA,2008.1-14.
[9] LIN Z, JIANG X, XU D, et al. Automatic protocol format reverse engineering through context-aware monitored execution[A]. NDSS[C].San Diego, California, USA, 2008.29-43.
[10] GODEFRIOD P, KIEZUN A, LEVIN M, Grammar-based whitebox fuzzing[J]. ACM SIGPLAN Notices, 2008, 43(6):206-215.
[11] BRUMLEY D, JAGER I, AVGERINOS T, et al. BAP: a binary analysis platform[A]. ACM CAV[C]. Snowbird, Utah, USA, 2011.463-369.
[12] NICHOLAS N. Dynamic Binary Analysis and Instrumentation or Building Tools is Easy[D]. University of Cambridge, 2004.
[13] EDWARD J, AVGERINOS T, BRUMLEY D. All you ever wanted to know about dynamic taint analysis and forward symbolic execution(but might have been afraid to ask)[A]. IEEE S&P[C]. Oakland, California, USA, 2010. 317-331.
[14] 王鐵磊. 面向二進制程序的漏洞挖掘關鍵技術研究[D]. 北京: 北京大學, 2011.WANG T. Research on Binary-Executable-Oriented Software Vulnerability Detection[D]. Beijing: Peking University, 2011.
[15] LIN Z, ZHANG X. Deriving input syntactic structure from execution[A]. ACM SIGSOFT[C]. Atlanta, Georgia, USA, 2008. 83-93.
[16] YIN H, SONG D. TEMU: binary code analysis via whole-system layered annotative execution[EB/OL]. http://www.eecs.berkeley.edu/Pubs/TechRpts/2010/EECS-2010-3.html, 2010.
[17] A BDD package[EB/OL]. http://buddy.sourceforge.net/.
[18] 劉豫, 聶眉寧, 蘇璞睿等. 基于可回溯動態污點分析的攻擊特征生成方法[J]. 通信學報, 2012, 33(5):21-28.LIU Y, NIE M Y, SU P R, et al. Attack signature generation by traceable dynamic taint analysis[J]. Journal on Communications, 2012,33(5):21-28.
[19] 陳愷,馮登國,蘇璞睿等.基于彩色污點傳播的黑盒測試方法[J]. 中國科學:信息科學, 2011, 41(5):526-540 CHEN K, FENG D G, SU P R, et al. Black-box testing based on colorful taint analysis[J]. Science China Information Science, 2011,41(5):526-540.
[20] SLOWINSKA A, BOS H. Pointless tainting?: evaluating the practicality of pointer tainting[A]. ACM European Conference on Computer Systems[C]. Nuremberg, Germany, 2009. 61-74.
[21] KAND M, MCCAMANT S, POOSANKAM P, et al. DTA++:dynamic taint analysis with targeted control-flow propagation[A]. NDSS[C].San Diego, California, USA, 2011.26-39.
[22] WANG Z, JIANG X, CUI W, et al. ReFormat: automatic reverse engineering of encrypted messages[A]. CESORICS[C]. Athens, Greece,2010. 200-215.
[23] CHO C, DOMAGOJ B, SHIN E, et al. Inference and analysis of formal models of botnet command and control protocols[A]. ACM CCS[C]. Chicago, Illinois, USA, 2010. 426-439