樂德廣,章亮,鄭力新,李鑫,陳經途
(1.常熟理工學院 計算機科學與工程學院,江蘇 蘇州215500;2.華僑大學 工學院,福建 泉州362021;3.廈門銳思特軟件科技有限公司,福建 廈門361005)
隨著互聯網應用的普及,軟件的安全問題變得日趨嚴重.自從2006年Word辦公軟件的一個嚴重漏洞被發現以來,Office辦公軟件的漏洞開始成為網絡黑客攻擊和利用的工具,而在這些漏洞當中,利用文件格式解析漏洞的攻擊更是層出不窮[1].國內外的安全研究機構和學者也投入大量的精力研究文檔類漏洞的檢測和分析[2-4].近年來,由于Office Word程序在解析富文本格式(rich text format,RTF)文檔時經常會觸發漏洞,黑客就可以控制正在運行Word的特權用戶,因此深入分析RTF文檔解析過程顯得極為必要.本文在研究RTF文檔繪圖屬性的基礎上,提出一種基于指令回溯調試及特征數據構造的Word程序漏洞逆向分析方法.
RTF是微軟公司為進行文本和圖像信息格式的交換而制定的一種文件格式,它適用于不同的設備、操作環境和操作系統[5].RTF文件數據格式由未格式文本、控制字、控制符和組構成.其中,未格式化本文即單純的編輯文本,不具有任何格式,是RTF文件的正文部分.控制字是RTF用來標記打印控制符和管理文檔信息的一種特殊格式的命令,一個控制字最長32個字符.控制字的使用格式為

其中:每個控制字均以一個反斜杠\開頭;字母序列由“a”~“z”的小寫字母組成.
組由文本(包括在({})中)、控制字或控制符組成.左擴符({)表示組的開始,右擴符(})表示組的結束.每個組包括文本和文本的不同屬性.一個RTF文件符合以下語法,即

從以上RTF文件語法可以看出,RTF文件包括文件頭和文檔區.其中,文件頭的語法為

文檔區的語法為

隨著MS Office系列軟件的廣泛應用,doc,xls和ppt等文檔已經成為日常工作文檔的通用傳遞格式.Word.exe程序支持doc,txt,html,xml,rtf等數據格式的文件.由于Word支持的文件格式廣泛,不同文件格式又相當復雜,因此,在該程序的設計和處理中不可避免地存在大量漏洞,如緩沖區溢出漏洞[6].緩沖區溢出漏洞包括棧溢出漏洞、堆溢出漏洞、釋放后重用漏洞、遠程代碼執行漏洞等[7].
由于微軟發布的Word軟件存在漏洞的公告中,危害等級為“嚴重”的漏洞就經常涉及到RTF文件.例如,Microsoft Word RTF文件解析錯誤代碼執行漏洞,Microsoft Word RTF數據處理遠程內存破壞漏洞,Microsoft Word RTF文件釋放后重用遠程代碼執行漏洞,Microsoft Office RTF分析器堆棧溢出漏洞和Microsoft Word RTF解析引擎堆溢出漏洞等[7].因此,文中重點分析RTF文檔緩沖區溢出漏洞.
通過對RTF的文件頭和文檔區分析,可以將整個RTF文檔的結構分成可存數據區域和不可存數據區域兩個部分,如圖1所示.
對RTF文檔進行重劃分,其中在可存數據區域中,pFragments,pSegmentInfo,pVerticies,Themedata,Datastore等都是容易觸發漏洞的區域,在這些區域中可以填寫惡意代碼(shellcode).Microsoft Word RTF文件解析緩沖區溢出漏洞就是解析RTF繪圖屬性pFragments時造成的緩沖區溢出漏洞.因此,文中重點研究Word程序在解析RTF文檔繪圖屬性時產生的緩沖區溢出漏洞.

圖1 RTF區塊分割Fig.1 RTF Area Segmentation
通過指令回溯調試和特征數據構造方法逆向分析RTF的繪圖屬性.Word.exe程序解析該RTF文檔中的pFragments屬性時,其逆向關鍵代碼如圖2所示.
圖2中:源代碼是Word.exe程序解析pFragments屬性的關鍵函數.在該函數中,方框中的rep指令是將esi所指向的pFragments屬性值數據復制到edi所指向的緩沖區.復制的次數由mov,eax,ecx指令中的ecx寄存器決定.ecx寄存器的最大值為FFFFH,但是在執行rep指令進行復制之前,有一個移位運算shr ecx 2,所以ecx的最大值為3FFFH,rep指令復制的最大字節數為4×3FFFH=FFFCH B.由圖2可知:該函數未嚴格檢查pFragments屬性值所占用的緩沖區空間大小.因此,需要確定由rep指令復制數據的緩沖區大小.

圖2 Word解析RTF pFragments屬性關鍵源代碼Fig.2 Word key assembly codes for RTF pFragments attribute resolution

圖3 RTF pFragments屬性值緩沖區大小Fig.3 Buffer size of RTF pFragments attribute value
圖2函數中的retn指令返回到該函數的調用指令處[8],如圖3所示.圖3中:地址0x30F0B5F8處的call dword ptr ds:[ax+0x1C]指令為圖2的調用函數.通過逆向該函數調用前的棧操作指令可以看出:在地址0x30F0BEB處的lea ecx dword ptr ss:[ebp-0x10]指令在處理pFragments屬性的時候,分配一個最大值為10HB的緩沖區給地址0x30F0B5F8的call函數.由圖3可知:0x30F0B5F8處的call函數未嚴格檢查pFragments屬性值所占用的空間大小,當ecx的值大于10HB時,就會導致圖2中地址0x30ED442C處的rep指令在復制pFragments屬性值數據時產生緩沖區溢出.

圖4 ecx初始值設置Fig.4 Initial value setting of ecx
由于ecx寄存器在程序的執行過程中被反復使用,采用傳統的內存斷點逆向方法很難確定給ecx賦初始值的指令[9].因此,采用一種新的指令回溯逆向方法來確定ecx賦初始值的指令.該方法通過追溯給ecx賦值的前一條指令,然后給該指令下斷點,再通過斷點的指令追溯給這條指令賦值的前一條指令,最終確定給ecx賦初始值的指令,其逆向關鍵代碼如圖4所示.由圖4可知:[ebp-0x8]等于pFragments屬性值的第5和第6個字節.當ja跳轉指令執行跳轉時,Word.exe程序執行的逆向關鍵代碼如圖5所示.
由圖5可知:當ja跳轉指令執行時,eax直接被賦值為0,導致ecx最終被賦值為0.由于rep指令所復制的字節數由ecx決定,而ja跳轉指令決定ecx的值.因此,ja指令是否執行跳轉決定pFragments屬性值數據能否復制至緩沖區,是產生緩沖區溢出漏洞的條件之一.

圖5 ja跳轉流程Fig .5 Jump process of ja
根據上面的分析,基于特征數據構造的方法構造ja指令,采用不跳轉的pFragments屬性值特征數據,將該數據復制到緩沖區中,通過逆向Word.exe繼續解析構造的pFragments屬性值數據,其逆向關鍵代碼如圖6所示.

圖6 特征值數據分析Fig.6 Characteristic data analysis
由圖6可知:在Word.exe程序將構造好的pFragments屬性值數據復制到緩沖區后,將執行方框中的指令.因此,繼續采用基于特征數據構造的方法讓je指令分別執行跳轉和不跳轉操作.當不產生跳轉時,Word.exe程序將執行地址0x30F0B7CB處的call 30F0B90A,此時Word.exe程序不能正常返回,并最終造成程序直接崩潰;當je指令發生跳轉時,Word.exe程序可以正常執行,并造成緩沖區溢出.因此,[ebp+10]的特征值為0000H.該特征值決定了構造的pFragments屬性值數據能否讓程序正常執行,這是產生緩沖區溢出漏洞的另一條件.
通過以上對于RTF文檔繪圖屬性pFragments逆向分析可以得出:通過ja和je指令的2次正確跳轉后,pFragments屬性值數據才能夠正確復制到緩沖區,并造成溢出.
根據2.2節對RTF繪圖屬性分析,得出緩沖區溢出條件.Word在解析RTF繪圖屬性時產生溢出漏洞的流程,如圖7所示.
由圖7可知:RTF文檔繪圖屬性產生7個步驟緩沖區溢出的流程.
步驟1首先,構造一個具有繪圖屬性的RTF文檔,例如,test.rtf.
步驟2用Word.exe程序打開RTF文檔.
步驟3Word.exe程序解析RTF繪圖屬性的sv屬性值數據.
步驟4判斷RTF文件繪圖屬性的sv屬性值中是否包含有將sv屬性值復制到緩沖區中的特征值數據,例如,[ebp+0xE]≤[ebp-0x4].如包含有該特征值,則執行步驟5;否則,Word.exe程序進入正常數據處理,并結束.
步驟5RTF文件繪圖屬性的sv屬性值數據復制到緩沖區中.
步驟6判斷RTF文件繪圖屬性的sv屬性值數據是否包含程序正常返回的特征值數據,例如,[ebp+10]=0000H.如果包含特征值數據,則執行步驟7;否則,Word.exe程序進入異常數據的處理,并結束.
步驟7判斷RTF文件繪圖屬性的sv屬性值數據的長度是否大于到緩沖區存儲空間,例如,[ebp-0x8]>10H.如果復制的sv屬性值數據長度大于緩沖區存儲空間,則造成溢出并觸發漏洞;否則Word.exe程序進入正常數據處理,并結束.

圖7 Word解析RTF繪圖屬性漏洞分析流程Fig.7 Analysis flows of word RTF drawing attribute resolution vulnerability
對2.3節提出的RTF漏洞分析流程進行實驗測試,測試硬件環境分別是I3-3110處理器,4G內存的筆記本電腦,I5-4460型處理器,4G內存的臺式機,E31225v3型處理器及8G內存的服務器.操作系統是Windows XP SP3,軟件是Office 2003SP2.首先,基于該流程構造POC(proof of concept)[10],并通過shellcode證明該漏洞分析流程的有效性.
根據RTF繪圖屬性漏洞分析的流程可以看出:繪圖屬性的sv屬性值是能否觸發漏洞的關鍵,只有在POC中構造合適的sv才能觸發漏洞,造成緩沖區溢出.根據圖7中步驟4的判斷條件,構造sv屬性值為

其中:sv的屬性值是111122223333H;第1,2個字節構成的16進制數為1111H,第3,4個字節構成的16進制數為2222H,即(12)H<(34)H,所以這時可以復制3333H長度的sv屬性值數據到緩沖區中.
雖然可以復制指定大小的數據到內存緩沖區中,但是并不知道這些數據能否讓Word.exe程序正常執行,而程序能否正常執行也是通過sv屬性值的特征數據來控制,該特征數據具體是在第47~50個字節處,需要將這4個字節置為0000H,程序才能正常執行.根據圖7中步驟6的判斷條件,進一步構造sv的屬性值為

其中:第1~4個字節判斷屬性值數據能否復制至緩沖區;第5~6個字節指定拷貝屬性值數據的長度;第7~50個字節是填入緩沖區的屬性值數據;第47~50個字節為判斷屬性值數據能否讓Word.exe程序正常執行的特征值數據.
打開構造好的POC文檔test.rtf,緩沖區數據如圖8所示.由圖8可知:構造的數據已經成功復制到緩沖區中,只要合適長度數據就可以造成緩沖區溢出漏洞.
通過構造shellcode,對漏洞進行利用測試.測試的shellcode功能是調用系統命令執行程序CMD窗口,所以在構造shellcode的過程中重點是自定位、獲取kernel32.dll基地址以及API函數地址[11],其構造流程,如圖9所示.
在獲取完kernel32.dll的基址后,再通過PE文件導出函數表的結構可以獲取構造shellcode所需要的API函數的地址,具體構造的shellcode機器碼為

構造好shellcode后,需要將Word.exe程序的EIP指針指向shellcode入口處,采用jmp esp作為跳轉地址,跳至shellcode處.由于Windows XP系統的jmp esp指令的跳轉地址為0x7FFA4512[12],將Word.exe程序的返回地址通過緩沖區溢出修改為jmp esp的跳轉地址0x7FFA4512.該地址在緩沖區中存儲的數據為1245FA7FH.
RTF漏洞利用文檔的完整數據為

其中:90H之后是shellcode的填充區域.
最后,將以上構造數據保存成RTF文檔,并用Word.exe程序打開該RTF文檔,結果如圖10所示.由圖10可知:打開構造好的POC文件彈出CMD命令行窗口,證明通過提出的漏洞分析流程所構造的RTF文檔漏洞利用成功.

圖8 緩沖區數據分布Fig.8 Distribution of buffer data

圖9 shellcode構造流程Fig.9 Process flow of shellcode

圖10 RTF文檔漏洞利用結果 Fig.10 Utilization result of RTF vulnerability
分析了Office Word軟件所面臨的安全威脅,并對Word 2003程序在解析RTF文檔時容易觸發漏洞進行詳細分析,提出一種面向RTF文檔漏洞利用分析的方法,最后通過漏洞利用測試證明該方法的有效性.今后,還將針對WPS Office,Excel,Word 2007及更高版本程序做進一步研究,并基于Word漏洞分析進一步研究RTF文檔解析漏洞的補丁加強對Word漏洞的攻擊防御.此外,漏洞分析方法雖然在Win 32平臺下具有可行性,但是對于其他平臺,如Win 64或Linux平臺,還沒有進行驗證,也需要在今后的工作中作進一步的驗證.
[1]KUHN R,JOHNSON C.Vulnerability trends:Measuring progress[J].IT Professional,2010,12(4):51-53.
[2]史飛悅,傅德勝.緩沖區溢出漏洞挖掘分析及利用的研究[J].計算機科學,2013,40(11):143-146.
[3]陳愷,馮登國,蘇璞睿.基于有限約束滿足問題的溢出漏洞動態檢測方法[J].計算機學報,2012,35(5):898-909.
[4]高志偉,姚堯,饒飛,等.基于漏洞嚴重程度分類的漏洞預測模型[J].電子學報,2013,41(9):1784-1787.
[5]Microsoft Corporation.Rich Text Format(RTF)Specification[EB/OL].[2014-10-08].http://msdn.microsoft.com/en-us/library/aa140277(office.10).aspx.
[6]李毅超,劉丹,韓宏,等.緩沖區溢出漏洞研究與進展[J].計算機科學,2008,35(1):87-90.
[7]CHANG Yung-yu,ZAVARSKY P,RUHL R,et al.Trend analysis of the CVE for software vulnerability management[C]∥Proceedings of IEEE Third International Conference on Privacy,Security,Risk and Trust(PASSAT)and IEEE Third Inernational Conference on Social Computing(SocialCom).Boston:Institute of Electrical and Electronic Engineers,2011:1290-1293.
[8]HUANG Shih-Kun,HUANG Min-Hsiang,HUANG Po-Yen,et al.Software crash analysis for automatic exploit generation on binary programs[J].IEEE Transactions on Reliability,2014,63(1):270,289.
[9]葛毅,茅兵,謝立.基于內存更新記錄的漏洞攻擊錯誤定位方法[J].計算機科學,2009,36(1):253-256.
[10]FATAUER T S,KHATTAB S,OMARA F A.OverCovert:Using stack-overflow software vulnerability to create a covert channel[C]∥Proceedings of IEEE 4th IFIP International Conference on New Technologies,Mobility and Security.Paris:Institute of Electrical and Electronic Engineers,2011:1-5.
[11]AN Zhi-yuan,LIU Hai-yan.Locating the address of local variables to achieve a buffer overflow[C]∥Proceedings of IEEE Fifth International Conference on Computational and Information Sciences.Shiyang:IEEE Press,2013:1999-2002.
[12]羅文華.基于逆向技術的惡意程序分析方法[J].計算機應用,2011,31(11):2766-2769.