本發(fā)明涉及一種提高模糊測試覆蓋率的測試用例控制變異生成方法,屬于信息安全的漏洞挖掘領(lǐng)域。
背景技術(shù):
近幾年來,伴隨著計算機網(wǎng)絡的發(fā)展,信息化的概念已被人們熟知,網(wǎng)絡信息更是無處不在,網(wǎng)絡信息技術(shù)在國民經(jīng)濟和國防建設中的應用越來越廣泛深入,因此,承載網(wǎng)絡信息的軟件的安全性變得尤為重要。但是隨著軟件系統(tǒng)日益龐大,功能日益復雜,再加上軟件從業(yè)人員安全知識不足,以及編程語言自身的安全缺陷,導致軟件的安全漏洞層出不窮。在我們的生活中,經(jīng)??梢月牭竭@樣的報道:某網(wǎng)站受到黑客攻擊;某計算機系統(tǒng)受到攻擊,造成客戶數(shù)據(jù)丟失;目前又出現(xiàn)某計算機病毒,已擴散到全球……這些安全漏洞直接影響人們的工作和生活,侵害國民利益,甚至危害國家安全。因此,在危害發(fā)生前挖掘軟件漏洞并進行修補,已經(jīng)成為軟件開發(fā)周期中不可或缺的重要一環(huán)。
目前為大家所熟知的漏洞挖掘技術(shù)包括補丁對比分析、面向二進制的符號執(zhí)行、污點跟蹤和模糊測試。其中,模糊測試技術(shù)是一種應用非常廣泛的漏洞挖掘技術(shù),它的原理是通過向目標應用程序注入畸形或意外數(shù)據(jù),使之發(fā)生崩潰或異常行為來發(fā)現(xiàn)漏洞。因此模糊測試技術(shù)的核心問題是如何生成有效的畸形數(shù)據(jù),其中高覆蓋率是模糊測試有效性的重要標準。
當前比較主流的測試用例生成方法有兩種,即基于規(guī)范的生成方法和基于變異的生成方法。其中基于規(guī)范的生成方法效果最好,覆蓋率高,冗余度低,但是其致命缺點是在協(xié)議規(guī)范未知的情況下便無法進行數(shù)據(jù)建模,顯然大部分的軟件的協(xié)議規(guī)范不可能公開,因此此方法有很大的局限性?;谧儺惖纳煞椒ū燃兇怆S機的變異生成方法有一定改善,但測試效率仍十分低下,覆蓋率和冗余度均不理想。針對該問題,業(yè)界已經(jīng)出現(xiàn)的優(yōu)化方法有程序控制流分析、符號執(zhí)行技術(shù)、污點跟蹤與分析技術(shù)和遺傳算法等。符號執(zhí)行存在路徑爆炸和復雜約束求解問題,難以應用到復雜軟件上的測試。污點跟蹤與分析技術(shù)每次只對個別路徑進行測試,并且其原理導致很難做到測試的自動化;遺傳算法可生成漏洞檢測能力較強的測試用例,但是在用例生成與選擇過程中付出高昂的時間代價。
綜上分析,現(xiàn)有的優(yōu)化模糊測試覆蓋率的方法普遍存在時間代價高、測試范圍不完整和自動化程度低的問題。針對這些問題,本發(fā)明將提出一種有效的模糊測試用例控制變異方法,可大大提高模糊測試覆蓋率,實現(xiàn)快速、全面的自動化模糊測試。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的是:針對目前優(yōu)化模糊測試覆蓋率方法時間代價高、測試范圍不完整和自動化程度低等問題,提出一種控制變異生成測試用例的方法,使用簡單高效的控制變異方法來增加代碼覆蓋率,無需進行大量的分析與計算,并在保證代碼覆蓋率的前提下,實現(xiàn)整體方案的自動化。
本發(fā)明的設計原理為:
考慮到程序中對數(shù)據(jù)的一種常見處理方法,即使用數(shù)值作為程序進入某個分支的判斷條件。當測試用例因為變異到達某個程序分支,如果保持該變異字段的信息并聲明為不可變異,將該測試用例作為種子測試用例,待到下次以該種子用例進行變異生成測試用例,將能夠控制模糊測試在該探索到的新分支內(nèi)進行進一步的測試。本發(fā)明使用插樁技術(shù)監(jiān)控測試用例的執(zhí)行路徑,當有新分支出現(xiàn)后,記錄該不可變異字段信息,控制模糊測試的變異范圍。
本發(fā)明的技術(shù)方案是通過如下步驟實現(xiàn)的:
步驟1,提取目標程序可解析的合法文件作為初始用例,隨機變異生成測試用例。
步驟1.1,提取一條目標程序可解析的合法報文作為初始用例。
步驟1.2,為該初始用例定義一個位圖數(shù)據(jù)結(jié)構(gòu),其下標為字節(jié)偏移位置,若數(shù)據(jù)結(jié)構(gòu)值為0,則表示該偏移位置字節(jié)可變異,若為1,則表示該偏移位置字節(jié)不可變異。此處將其初始化為0。
步驟2,對目標程序進行插樁,執(zhí)行步驟1所生成的測試用例。
步驟2.1,初始用例進入控制變異模塊中的隨機變異模塊。
步驟2.2,在隨機變異模塊中,對初始用例執(zhí)行隨機變異操作,主要以位或字節(jié)為單位,采用翻轉(zhuǎn)、增減或插入的方式來使數(shù)據(jù)發(fā)生變異。
步驟3,收集插樁執(zhí)行信息,生成控制信息并存入數(shù)據(jù)庫。
步驟3.1,變異用例進入執(zhí)行反饋模塊中的插樁執(zhí)行模塊。
步驟3.2,生成執(zhí)行路徑信息。當程序進入插樁后的某個分支,將生成一個隨機數(shù)作為該分支的標志值,并將該位置的元素值作加1操作,該元素值即為本次用例執(zhí)行過程中該分支被執(zhí)行的次數(shù),初始值為0,同時記錄該用例的執(zhí)行路徑,這些信息即為執(zhí)行路徑信息。這些信息用來與下一個測試用例的執(zhí)行路徑進行對比,得出是否發(fā)生分支跳轉(zhuǎn)的信息。
步驟3.3,編譯插樁模塊將生成的執(zhí)行路徑信息輸入控制信息生成模塊。
步驟3.4,控制信息生成模塊對變異用例的執(zhí)行路徑信息進行處理,生成控制信息??刂频慕M成是測試用例與不可變異字段信息。其中不可變異字段信息標志了該字段的變異是否會導致分支的改變。
步驟3.5,將生成的控制信息存儲到控制信息數(shù)據(jù)庫中。
步驟3.6,重復執(zhí)行步驟3,直至覆蓋應用程序的所有分支,并將所有控制信息存儲到控制信息數(shù)據(jù)庫中。
步驟4,從數(shù)據(jù)庫中提取控制信息,指導種子用例進行控制變異,并進行模糊測試。
步驟4.1,從數(shù)據(jù)庫中取出種子測試用例,進行初始化。
步驟4.2,對種子測試用例使用隨機變異策略,指向第一個字段,查看該字段是否標記為不可變異,如果標記為不可變異,則指向下一字段,并查看不可變異標記位,如果沒有標記,則對該字段進行變異,并執(zhí)行fuzzing測試。
步驟4.3,查看是否發(fā)生了分支跳轉(zhuǎn)。如果沒有發(fā)生跳轉(zhuǎn),則指向下一個字段,并重復步驟4.2中的判斷操作。如果發(fā)生了分支跳轉(zhuǎn),則保存該測試用例為種子用例,并記錄不可變異信息。
有益效果
相比于目前的提高模糊測試覆蓋率的方法,本專利中的測試用例變異策略控制調(diào)控方法優(yōu)化了模糊測試的代碼覆蓋率,并且優(yōu)化所耗的時間代價較低,測試范圍相對完整,并且測試過程無需人工干預,具有更好的性能和效果。
附圖說明
圖1為本發(fā)明提出的提高模糊測試覆蓋率的控制變異方法的系統(tǒng)原理圖;
圖2為本發(fā)明提出的提高模糊測試覆蓋率的控制變異方法中控制變異流程圖;
具體實施方式
為了更好的說明本發(fā)明的目的和優(yōu)點,下面結(jié)合附圖和實施用例對本發(fā)明方法的實施方式做進一步詳細說明。在此,本發(fā)明的示意性實施用例及其中說明用于解釋本發(fā)明,但并不作為對本發(fā)明的限定。
實施用例包含一臺pc主機,參數(shù)環(huán)境為windows764位操作系統(tǒng),intelcorei5cpu@3.10ghz,安裝內(nèi)存4gb。使用變異策略控制調(diào)控方法的程序記作msdrfuzz(mutationstrategydynamicregulationfuzz)。實驗環(huán)境軟件包括開源的zzuf、msdrfuzz和ffmpeg3.1.4。以下將詳細描述具體實施方式步驟。
第一環(huán)節(jié)
本環(huán)節(jié)的目的是提取目標程序可解析的合法文件作為初始用例,并對測試用例進行初始化。具體實施步驟如下:
提取目標程序可解析的合法文件作為初始用例。
步驟1.1,提取一條目標程序可解析的合法報文作為初始用例。
步驟1.2,為該初始用例定義一個位圖數(shù)據(jù)結(jié)構(gòu),其下標為字節(jié)偏移位置,若數(shù)據(jù)結(jié)構(gòu)值為0,則表示該偏移位置字節(jié)可變異,若為1,則表示該偏移位置字節(jié)不可變異。此處將其初始化為0。
第二環(huán)節(jié)
本環(huán)節(jié)的目的是對初始用例進行隨機變異。具體實施步驟如下:
步驟2.1,初始用例進入控制變異模塊中的隨機變異模塊。
步驟2.2,在隨機變異模塊中,對初始用例執(zhí)行隨機變異操作,主要以位或字節(jié)為單位,采用翻轉(zhuǎn)、增減或插入的方式來使數(shù)據(jù)發(fā)生變異。本方法采用5種變異因子,分別為flip_bit(以位為單位(1bit,2bit,4bit,8bit)的位翻轉(zhuǎn)),arith(以字節(jié)為單位(1byte,2byte,4byte),將整數(shù)c加減一個整數(shù)),set_intresting(以字節(jié)為單位(1byte,2byte,4byte),將整數(shù)c設為0,1,-1,c+1,c-1),bytes_copy(超長數(shù)組復制(1byte,2byte,4byte))和bytes_delete(刪除數(shù)組(1byte,2byte,4byte))。
步驟2.3,生成變異用例。
第三環(huán)節(jié)
步驟3.1,變異用例進入執(zhí)行反饋模塊中的插樁執(zhí)行模塊,本發(fā)明采用模糊測試工具afl[66](americanfuzzerlop)的編譯插樁模塊。
步驟3.2,生成執(zhí)行路徑信息。當程序進入插樁后的某個分支,將生成一個隨機數(shù)作為該分支的標志值,并將該位置的元素值作加1操作,該元素值即為本次用例執(zhí)行過程中該分支被執(zhí)行的次數(shù),初始值為0,同時記錄該用例的執(zhí)行路徑,這些信息即為執(zhí)行路徑信息。這些信息用來與下一個測試用例的執(zhí)行路徑進行對比,得出是否發(fā)生分支跳轉(zhuǎn)的信息。
步驟3.3,編譯插樁模塊將生成的執(zhí)行路徑信息輸入控制信息生成模塊。
步驟3.4,控制信息生成模塊對變異用例的執(zhí)行路徑信息進行處理,生成控制信息??刂菩畔⒌慕M成是測試用例與不可變異字段信息。其中不可變異字段信息標志了該字段的變異是否會導致分支的改變。
步驟3.5,將生成的控制信息存儲到控制信息數(shù)據(jù)庫中。
步驟3.6,重復執(zhí)行第三環(huán)節(jié),直至覆蓋應用程序的所有分支,并將所有控制信息存儲到控制信息數(shù)據(jù)庫中。
第四環(huán)節(jié)
本環(huán)節(jié)的目的是在控制信息數(shù)據(jù)庫中測試用例的控制信息的指導下,進行控制變異操作。具體實施步驟如下:
步驟4.1,從數(shù)據(jù)庫中取出種子測試用例,進行初始化。
步驟4.2,對種子測試用例使用隨機變異策略,指向第一個字段,查看該字段是否標記為不可變異,如果標記為不可變異,則指向下一字段,并查看不可變異標記位,如果沒有標記,則對該字段進行變異,并執(zhí)行fuzzing測試。
步驟4.3,查看是否發(fā)生了分支跳轉(zhuǎn)。如果沒有發(fā)生跳轉(zhuǎn),則指向下一個字段,并重復步驟4.2中的判斷操作。如果發(fā)生了分支跳轉(zhuǎn),則保存該測試用例為種子用例,并記錄位圖數(shù)據(jù)結(jié)構(gòu)信息,即該字節(jié)的不可變異信息。