刁培金,劉嘉勇
(四川大學電子信息學院,成都 610065)
針對復合文檔的漏洞挖掘技術研究
刁培金,劉嘉勇
(四川大學電子信息學院,成都610065)
Fuzzing測試是目前軟件漏洞挖掘工作中廣泛使用的技術,它通過對樣本進行變異并輸入到目標程序中監(jiān)控發(fā)生的異常,來挖掘程序的漏洞。但是傳統(tǒng)的Fuzzing測試效率低,盲目性比較強,未反饋測試用例的使用情況是否有效、對異常類型的分類比較粗糙,導致后期漏洞分析工作效率較低[1]。本文根據(jù)復合文檔結構化存儲的特征和上述Fuzzing測試中存在的問題,設計了一套原型工具DocuFuzzer,并通過實驗證明了該工具在復合文檔漏洞挖掘方面的有效性。
復合文檔與文件系統(tǒng)的結構類似,它將數(shù)據(jù)分成許多流,這些流存儲在不同的倉庫里。每個復合文檔都包含一個根倉庫。流和倉庫的命名規(guī)則與文件系統(tǒng)相似,同一個倉庫下的流不能重名,不同倉庫下可以有同名的流[2-4]。復合文檔的結構如圖1所示。
所有的流分成更小的數(shù)據(jù)塊,叫做數(shù)據(jù)扇區(qū)(Sectors)。數(shù)據(jù)扇區(qū)包含控制數(shù)據(jù)或者用戶數(shù)據(jù)。整個文件由一個頭結構 (Header)以及其后的所有數(shù)據(jù)扇區(qū)組成。扇區(qū)的大小在頭部中確定,并且每個sectors的大小都相同。
圖1 復合文檔結構
以二進制方式打開一個樣本,分析其二進制結構,文件的二進制結構如圖2所示。
圖2 復合文檔結構圖
(1)復合文檔頭。每個文件都有一個頭部,大小為512字節(jié),包含文檔的控制信息。
(2)主扇區(qū)配置表。
(3)扇區(qū)配置表。
(4)短扇區(qū)配置表。
(5)目錄結構。目錄是一種內(nèi)部控制流,由一系列目錄入口組成。每一個目錄入口都指向復合文檔的倉庫或流。
(6)目錄入口。目錄入口按照在目錄流中出現(xiàn)的順序列舉,一個以0開始的目錄入口索引稱為目錄入口標識。
(7)流結構。流結構包括流的入口、大小以及計算得出的數(shù)據(jù)流的位置[5]。
我們所知道最早的對Fuzzing的描述是1989年Barton Miller教授使用一個模糊器來測試Unix應用程序的安全性。此后,各種Fuzzing測試工具層出不窮,包括Sully、Zzuf、Peach等一系列具有代表性的測試工具[6]。
Fuzzing測試的思路比較簡單:首先準備測試樣本,可以通過生成和變異的方式構造測試樣本。變異樣本的時候可以用“overwrite”和“replace”兩種方式修改原始數(shù)據(jù)?!皁verwrite”使用畸形數(shù)據(jù)直接覆蓋指定位置的正常數(shù)據(jù),不改變樣本的大小。“replace”通過搜索特征串進行替換,并可以改變文件的大小,支持正則表達式,可以有針對性地進行數(shù)據(jù)替換[7]。
然后部署目標程序,指示其加載測試用例,開始執(zhí)行Fuzzing測試并通過調(diào)試器監(jiān)視異常信息。圖3展示了Fuzzing測試的各個步驟[8]:
在Fuzzing的過程中,一個至關緊要的步驟就是對產(chǎn)生的異常進行監(jiān)視。當異常發(fā)生時,保存調(diào)試器記錄的堆棧、寄存器等信息,保存觸發(fā)異常的測試樣本,分析找出有價值的異常作為重現(xiàn)及利用的依據(jù)[9]。
識別異常最好的方法是使用調(diào)試器,它既可以識別已處理的異常,也能夠識別未處理的異常。調(diào)試器可以在每次迭代的過程中監(jiān)視異常條件,當有異常發(fā)生的時候,異常發(fā)生的位置和異常線程的前后代碼、內(nèi)存地址、堆棧數(shù)據(jù)都會被保存下來。根據(jù)這些信息可以確定異常的準確位置。出現(xiàn)的異常類型包括拒絕服務、整數(shù)溢出、堆溢出和棧溢出、邏輯錯誤、格式化字符串和競爭條件等。
圖3 Fuzzing測試過程
下面使用一段簡單的代碼描述整數(shù)溢出:
上面代碼描述了一個導致內(nèi)存破壞的整數(shù)溢出漏洞。如果size被人為賦值為0xFFFFFFFF,則allcation_size的值經(jīng)過size的值加1操作后將變?yōu)?,在代碼的第三行將使用malloc()函數(shù)分配一個大小為0的內(nèi)存,buffer指針將指向一個未分配的內(nèi)存塊。在代碼第四行和第五行進入循環(huán),把size大小的數(shù)據(jù)復制到內(nèi)存塊中,從而造成內(nèi)存破壞。如果人為構造數(shù)據(jù)可以使覆蓋的內(nèi)存數(shù)據(jù)能夠被使用,則可以獲取對應用程序的控制權。
根據(jù)上文對Fuzzing測試的描述,其過程可以描述為,其中,表示Fuzzing測試的過程,表示初始樣本集,表示Fuzzing所使用的時間,“P”表示目標Fuzzing程序,表示對樣本的變異策略[10]。
最后通過人工分析產(chǎn)生的異常,找到產(chǎn)生異常的原因,分析其可利用性。
該漏洞挖掘工具的包括初始化、讀取文檔結構、生成變異文檔、部署目標程序、核心Fuzz測試、異常檢測6個模塊。其運行過程可以簡單描述如圖4所示:
圖4 Docufuzzer運行過程
初始化模塊主要用于初始化DocuFuzzer,包括解析命令行選項并檢測DocuFuzzer所依賴的軟件是否被正確地安裝。
然后讀取模塊開始解析文檔結構。根據(jù)上文對復合文檔格式的介紹,可以有針對性的構造畸形樣本:選取一個正常的復合文檔,根據(jù)上文對復合文檔結構的介紹,定位文件的頭部、目錄結構以及數(shù)據(jù)流的位置,根據(jù)需要修改某特定位置的數(shù)據(jù)并保存,生成新的測試樣本。而且采用以下幾種方法可以提高測試的成功率:
①插入或替換數(shù)據(jù)的時候,選取臨界值、負數(shù)、超大值、超小值以及特殊字符。
②用多種方式改變數(shù)據(jù),在不改變固定標識的前提下,增加或刪除數(shù)據(jù)塊,改變數(shù)據(jù)塊的相對位置。
③在重要的數(shù)據(jù)區(qū)(頭部、長度控制區(qū)域、CRC32/ 16校驗碼)處修改數(shù)據(jù)。
生成測試樣本之后,要初始化Process類的實例,將它們部署到目標測試程序中。在目標程序每次測試的過程中,創(chuàng)建一個進程并設置其屬性,并設置每個進程運行時間間隔,使進程在達到間隔之后自動銷毀。
Fuzzing測試過程中,一個核心的操作是控制目標測試程序使用什么樣的畸形數(shù)據(jù)以及在什么位置對樣本進行修改??梢詼蕚湟粋€畸形值數(shù)據(jù)庫,選定文檔特定位置使用畸形值進行變異。通常是使用任意長度的任意值,包括二進制數(shù)值和字符串。字符串數(shù)值可以使用任意字符串,特定字符串。Fuzzing測試中常用的字符串值是"AAAAA",可以導致緩沖區(qū)溢出。
異常檢測模塊也是Fuzzing測試中的一個核心部分。獲取異常信息的途徑是觀察目標程序的崩潰或者查看日志文件,通過時間戳識別輸入和輸出之間的關聯(lián)。在Docufuzzer中,使用調(diào)試器識別異常。調(diào)試器可以識別已發(fā)生和未發(fā)生的異常,而且,不能直接將調(diào)試器關聯(lián)到目標程序,因為每達到一個時間間隔,目標程序進程會被銷毀[11]。筆者在Docufuzzer中使用調(diào)試器。所以當執(zhí)行Fuzzing測試的時候,Docufuzzer可以關聯(lián)到調(diào)試器并銷毀目標程序。部分核心代碼如下:
上段代碼的功能是只要沒達到時間間隔,調(diào)試器就一直監(jiān)視異常。
可以看出上述組件分別對應測試前準備、Fuzzing測試中兩個階段,最后通過人工分析異常信息,找出漏洞成因、驗證代碼以及危害程度。
為證明Docufuzzer在復合文檔漏洞挖掘方面的有效性,本節(jié)將用實驗進行驗證。把工具布置在虛擬機上,實驗環(huán)境:物理機系統(tǒng)Win7,配置為Intel Corei5-5200,2.20GHz,8GB內(nèi)存,虛擬機為VMware Workstation10.0,系統(tǒng)為WinXP sp3,內(nèi)存為2GB。
本文使用doc文件類型進行實驗,從網(wǎng)絡上下載100個doc文件,以金山WPS作為目標程序,應用本工具進行漏洞挖掘工作。實驗數(shù)據(jù)見表1:
表1 樣本數(shù)據(jù)
設置DocuFuzzer的測試時間閾值為500分鐘,在配置文件里設置對每個樣本變異50次,經(jīng)過測試,實驗數(shù)據(jù)如表2所示:
表2 異常數(shù)量
經(jīng)過測試,發(fā)現(xiàn)生成的異常數(shù)大于測試的樣本數(shù),為了使數(shù)據(jù)更加真實,對產(chǎn)生的異常進行人工分析,清除重復異常。
對產(chǎn)生的異常進行分析與分類,得到的數(shù)據(jù)如表3所示:
表3 異常分類
表4 人工分析結果
高危漏洞指對機密性、完整性和可用性的影響比較嚴重的漏洞,中危漏洞指對機密性、完整性和可用性的影響相對較輕的漏洞,雖不可被利用但是某些關鍵數(shù)據(jù)可被人為控制,低危漏洞指對機密性、完整性和可用性影響基本可以忽略的漏洞,不可利用且關鍵數(shù)據(jù)不可控[12]。從表中的數(shù)據(jù)可以看出,Docufuzzer可以有效挖掘出使用復合文檔的程序的漏洞。
將Docufuzzer部署在漏洞挖掘平臺中,已發(fā)現(xiàn)金山WPS辦公軟件[13]的3個0day漏洞并提交到國家漏洞庫。出于安全性考慮,不在此披露漏洞的細節(jié)。
針對目前Fuzzing測試過程中數(shù)據(jù)完整性校驗嚴重影響了測試效果的問題,以及復合文檔的結構化存儲的特征,設計了一套原型工具DocuFuzzer,該工具從樣本處理、測試策略調(diào)整兩個層面進行改進與優(yōu)化,以提高Fuzzing測試的效率。在樣本處理方面,本文提出了針對文檔格式的數(shù)據(jù)模型構造畸形樣本;在測試策略方面,本文提出一種動態(tài)選擇元素方法。實驗結果表明,本工具在復合文檔的漏洞挖掘方面具有較強的實用性。
本文對傳統(tǒng)Fuzzing測試技術的不足之處進行了補充,拓展了Fuzzing測試的思路,有助于Fuzzing測試技術的進一步應用和推廣。
[1]李紅輝,齊佳,劉峰,等.模糊測試技術研究[J].中國科學,2014:44(10):1305-I22
[2]唐彰國,鐘明全,李煥洲,張健.基于Fuzzing的文件格式漏洞挖掘技術.計算機工程,2010,16(16):151-153.
[3]任春鈺,舒輝,瞿進.一種改進的針對復合文檔的Fuzz測試技術[J].計算機應用,2008,28(2):535-537.
[4]高峻,徐志大,李健.針對復合文檔的Fuzzing測試技術[J].計算機與數(shù)字工程,2008,12(12):116-119.
[5]羅文華.Microsoft復合文檔結構電子數(shù)據(jù)取證分析.信息網(wǎng)絡安全,2013,3(03):9-11.
[6]王欣,董國偉,邵帥,朱龍華.基于驗證繞過的漏洞Fuzzing測試技術[C].信息安全漏洞分析與風險評估大會,2014.
[7]歐陽永基,魏強,王清賢,尹中旭,等?;诋惓7植紝虻闹悄蹻uzzing方法.電子與信息學報,2015,01期(1):143-149.
[8]Rebert A,Cha S,Avgerinos T,et al.Optimizing Seed Selection for Fuzzing[C].Proc.23rd USENIX conference on Security Symposium. California,San Diego:USENIX Association,2014:861-875.
[9]熊琦,王婷,彭勇,戴忠華,伊勝偉.工控網(wǎng)絡協(xié)議Fuzzing測試技術研究進展[C].信息安全漏洞分析與風險評估大會,2013.
[10]馬金鑫,張濤,李舟軍,張江霄.Fuzzing過程中的若干優(yōu)化方法研究[C].信息安全漏洞分析與風險評估大會,2015.
[11]MichaelSutton,AdamGreene,PedramAmini.Fuzzing:Brute Force Vulnerability Discovery.
[12]劉奇旭,張翀斌,張玉清,張寶峰.安全漏洞等級劃分關鍵技術研究[J].通信學報,2012,S1(S1):79-87.
[13]WPS.http://www.wps.cn/
Compound Document;Fuzzing Test;Storage Feature;Docufuzzer
Research and Implementation of Vulnerabilities for Compound Document
DIAO Pei-jin,LIU Jia-yong
(College of Electronic Information,Sichuan University,Chengdu 610065)
1007-1423(2016)02-0011-05
10.3969/j.issn.1007-1423.2016.02.003
刁培金(1990-),男,碩士研究生,研究方向為網(wǎng)絡通信與網(wǎng)絡安全
2015-12-01
2012-12-30
復合文檔是一種包含文本、圖形、電子表格數(shù)據(jù)、聲音、視頻圖像以及其他信息的結構化存儲的文件類型。由于其被辦公軟件廣泛應用,針對復合文檔的攻擊技術也越來越多。然而復合文檔結構嚴謹,支持多種編碼方式和壓縮算法,其復雜的格式導致傳統(tǒng)的Fuzzing測試效率低下。針對復合文檔的結構化存儲的特征,設計一套原型工具DocuFuzzer,并使用該工具對金山WPS進行測試實驗,證明該工具確實可以提高測試效率。
復合文檔 ;Fuzzing測試;結構化存儲;Docufuzzer
劉嘉勇(1962-),男,博士,教授,研究方向為網(wǎng)絡通信與網(wǎng)絡安全
Compound document is a document type that contains text,graphics,spreadsheet data,voice,video and other information storage structure,since it is widely used office software,attacks against a compound document technology is also increasing.However,compound document structured to support multiple encoding and compression algorithm,which leads to poor form complex traditional Fuzzing test efficiency.According to the structure of the compound document storage feature,designs a prototype tool DocuFuzzer,and uses the tool to test Kingsoft WPS,experiments prove that the tool can indeed improve test efficiency.