一種面向敏感區(qū)域的嵌入式軟件測試用例生成方法
【專利摘要】本發(fā)明涉及一種面向敏感區(qū)域的嵌入式軟件測試用例生成方法。本發(fā)明首先對二進制文件進行分析,對反匯編技術(shù)生成的匯編語言進行中間語言轉(zhuǎn)換,并對轉(zhuǎn)換結(jié)果進行插樁處理,得到插樁程序;然后利用所得的插樁程序進行敏感區(qū)域分析,確定出污點數(shù)據(jù);其次利用種子測試用例動態(tài)執(zhí)行程序,收集分支路徑約束條件,在遇到分支跳轉(zhuǎn)時,將當前收集到的約束集取反輸出;最后分析收集到的約束集中的各個約束是否包含污點并進行處理,將化簡后的約束集送入約束求解器求解,所得的最終結(jié)果就為能夠生成覆蓋污點數(shù)據(jù)輸入可控的各分支路徑的測試用例。本發(fā)明相較單一的靜態(tài)分析技術(shù)或動態(tài)分析技術(shù)有著更高的分析效率。
【專利說明】一種面向敏感區(qū)域的嵌入式軟件測試用例生成方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明屬于軟件測試【技術(shù)領(lǐng)域】,涉及一種面向敏感區(qū)域的嵌入式軟件測試用例生成方法。
【背景技術(shù)】
[0002]如今嵌入式軟件在各行各業(yè)都有著巨大的市場占有率,醫(yī)學,教育,銀行,軍事,計算機等各個領(lǐng)域都深受嵌入式系統(tǒng)的影響,但由于嵌入式軟件內(nèi)存容量有限,實時性要求高,專用性較強,繼承性差等特點使得嵌入式軟件在空間以及時間資源等方面很大程度上被限制在了有限的條件下,同時由于嵌入式軟件對于可靠性和安全性的要求比較高,因此對于嵌入式的缺陷檢測提出了更高的要求。針對嵌入式軟件進行安全檢測,及時發(fā)現(xiàn)軟件存在的漏洞,減少實際應用中帶來的經(jīng)濟損失,已經(jīng)成為嵌入式軟件研究的一個熱點領(lǐng)域。所以研究嵌入式軟件,挖掘軟件中存在的缺陷漏洞具有重大的實際意義。
[0003]如何針對特定的嵌入式軟件生成與之相對應的測試用例集,成為檢測嵌入式軟件可靠性的重要標準,國內(nèi)外研究學者在相關(guān)方面做了大量的研究工作,可以將相關(guān)技術(shù)按不同劃分準則劃分成不同的種類,其中按照分析對象不同可分成:
(I)源代碼分析。這種分析方法以軟件源代碼為分析對象,與編譯過程緊密相關(guān)。一般在編譯生成的中間語言格式上進行分析,包括數(shù)據(jù)流分析,控制流分析,SSA分析,最弱條件分析,廣泛用到格理論,模型檢測理論等。源碼分析也可以結(jié)合符號執(zhí)行與約束求解器進行分析,優(yōu)點是程序的全局信息比較完整,分析的難度較低,分析精度較好。缺點是很多軟件的源代碼難以獲得,商業(yè)軟件的源代碼大多不予公開;有些已經(jīng)長期部署并廣泛應用的軟件已經(jīng)找不到相應的源代碼,這種情況限制了源代碼分析的可用性。
[0004](2)字節(jié)碼分析。C#,java等語言編譯后生成的是字節(jié)碼,而不是二進制的機器碼。如果沒有進行過特殊的字節(jié)碼混淆技術(shù)的處理,從字節(jié)碼可以完整地提升至源代碼,有比較好的結(jié)構(gòu)信息和類型信息,分析難度較低,分析精度較好。但是這種方法適用于分析C#,java等語言的字節(jié)碼,而對于C / C++語言或者已經(jīng)部署了的C語言寫的程序則無能為力。
[0005](3) 二進制代碼分析。這種方法與前兩種不同,直接以部署的二進制代碼為分析對象,結(jié)合反匯編技術(shù)進行安全性分析。由于二進制代碼是作為軟件的最終體現(xiàn)形式,軟件發(fā)布必然會帶有二進制的執(zhí)行程序,即使以源代碼發(fā)布也可以編譯為二進制可執(zhí)行程序,有廣泛的實用性,缺點是二進制程序缺乏低層的結(jié)構(gòu)信息。
[0006]按照是否需要執(zhí)行程序可以分為:
1:靜態(tài)分析。典型的工具是Saturn和Fortify SCA,采用各種靜念的分析方法,流敏感或者路徑敏感的方法對軟件進行分析,其中廣泛用到符號執(zhí)行,約束求解的路徑名敏感分析技術(shù)。二進制分析的工具如Rose,也提供了靜態(tài)分析二進制代碼的功能,但是其分析能力較弱,精確性上存在較大問題。
[0007]2:動態(tài)分析。通過分析程序動態(tài)執(zhí)行信息,獲取可達路徑對輸入數(shù)據(jù)的約束,并在遇到受輸入數(shù)據(jù)控制的分支跳轉(zhuǎn)時將收集到的約束輸出至求解器以判定另一分支路徑是否可達,若可達,求解器則給出覆蓋目標分支路徑的測試用例,并利用生成的測試用例,發(fā)掘目標分支路徑中的軟件缺陷。動態(tài)分析更適合用來進行一些性能方面的分析,典型的二進制工具有Pin, Valgrind等。
[0008]但這兩種分析技術(shù)均存在一定的局限性,主要體現(xiàn)在:靜態(tài)分析技術(shù)只是針對程序的結(jié)構(gòu)進行分析,并沒有將程序進行實際的運行,因此收集到的約束條件不能完全做到對全路徑的覆蓋;動態(tài)分析技術(shù)雖然能夠收集到覆蓋更為全面的約束條件,但由于并沒有對收集到的約束條件進行進一步的處理使得收集的約束條件過于龐大,造成約束求解開銷過大,求解精度不聞等不足。
【發(fā)明內(nèi)容】
[0009]本發(fā)明針對現(xiàn)有技術(shù)的不足,提供了一種面向敏感區(qū)域的嵌入式軟件測試用例生成方法。該方法綜合考慮了兩種分析技術(shù),取它們各自所具有的優(yōu)勢,提出一種動靜結(jié)合的分析技術(shù)。
[0010]本發(fā)明方法具體包括以下步驟:
步驟I)對二進制文件進行分析,對反匯編技術(shù)生成的匯編語言進行中間語言轉(zhuǎn)換,并對轉(zhuǎn)換結(jié)果進行插樁樁處理,得到插樁程序。
[0011]步驟2)利用所得的插樁程序進行敏感區(qū)域分析,確定出污點數(shù)據(jù)。
[0012]步驟3)利用種子測試用例動態(tài)執(zhí)行程序,在運行過程中監(jiān)控輸入符號變量,收集分支路徑約束條件,在遇到分支跳轉(zhuǎn)時,將當前收集到的約束集取反輸出。
[0013]步驟4)分析收集到的約束集中的各個約束是否包含污點數(shù)據(jù)并進行處理,將化簡后的約束集送入約束求解器求解,所得的最終結(jié)果就為測試用例。
[0014]本發(fā)明的有益效果:
1.該技術(shù)綜合考慮了靜態(tài)分析技術(shù)和動態(tài)分析技術(shù)所具有的優(yōu)點與缺點,將兩種技術(shù)的優(yōu)點加以利用,同時避免兩種技術(shù)存在的缺點,實現(xiàn)一種動靜結(jié)合的分析技術(shù),相較單一的靜態(tài)分析技術(shù)或動態(tài)分析技術(shù)有著更高的分析效率。
[0015]2.該技術(shù)對收集到的約束條件進行了化簡,最大程度減少了收集到的約束數(shù)量,減輕了求解器求解的復雜性從而提高了求解的精度。
【專利附圖】
【附圖說明】
[0016]圖1為針對軟件進行分析的系統(tǒng)模塊。
[0017]圖2為程序的分支形成的樹形結(jié)構(gòu)。
【具體實施方式】
[0018]從代碼分析安全性使用的技術(shù)考慮,結(jié)合當前廣泛使用的靜態(tài)分析技術(shù)和動態(tài)分析技術(shù),利用這兩方面技術(shù)既有的優(yōu)勢,靜態(tài)分析程序結(jié)構(gòu),然后動態(tài)執(zhí)行程序并收集路徑約束求解,其具體實現(xiàn)包括以下步驟:
步驟I)對二進制文件進行分析,對反匯編技術(shù)生成的匯編語言進行中間語言轉(zhuǎn)換,并對轉(zhuǎn)換結(jié)果進行插樁樁處理,得到插樁程序。[0019]步驟2)利用所得的插樁程序進行敏感區(qū)域分析,確定出污點數(shù)據(jù)。
[0020]步驟3)利用種子測試用例動態(tài)執(zhí)行程序,在運行過程中監(jiān)控輸入符號變量,收集分支路徑約束條件,在遇到分支跳轉(zhuǎn)時,將當前收集到的約束集取反輸出。
[0021]步驟4)分析收集到的約束集中的各個約束是否包含污點數(shù)據(jù)并進行處理,將化簡后的約束集送入約束求解器求解,所得的最終結(jié)果就為測試用例。
[0022]其中步驟I)具體包括如下步驟:
I)利用反匯編技術(shù)對二進制文件進行反匯編處理,得到二進制文件相應的匯編程序。
[0023]2)利用Valgrind對反匯編得到的匯編程序進行轉(zhuǎn)換,可以將經(jīng)過反匯編生成的匯編程序進一步提升至中間語言。
[0024]3)對中間語言做進一步分析,針對中間語言對變量的輸入、賦值處理,在變量所在相應位置插樁函數(shù),所得到的最終結(jié)果就是插樁程序。
[0025]其中步驟2)具體包括如下步驟:
I)確定敏感區(qū)域:將容易引起緩沖區(qū)溢出的printf、memcpy、memset和strcpy危險函數(shù)的調(diào)用確認為敏感區(qū)域。
[0026]2)將與敏感區(qū)域相關(guān)的輸入數(shù)據(jù)確認為污點數(shù)據(jù)。
[0027]3)然后查看程序變量是否與污點數(shù)據(jù)進行了運算,如果是,則其運算結(jié)果也是污點數(shù)據(jù)。這樣通過該方法確定污染數(shù)據(jù)的流向,實現(xiàn)對污染數(shù)據(jù)的流向分析。
[0028]其中步驟3)包括如下步驟:
I)利用種子測試用例作為輸入動態(tài)驅(qū)動程序執(zhí)行,并對執(zhí)行過程中所遇到的變量進行符號化,用符號變量代替實際變量符號化執(zhí)行程序。
[0029]2)收集符號化執(zhí)行時路徑經(jīng)過的分支條件,收集的全部約束就是該路徑的一組約束條件。
[0030]3)通過將這組約束條件依次求反得到指向其他分支的路徑約束條件,重復執(zhí)行
3-2,3-3步得到程序的全部路徑約束。
[0031]其中步驟4)具體包括如下步驟:
I)對收集到的路徑約束進行分析,遍歷其中的每一個約束條件。
[0032]2)根據(jù)約束條件中的符號變量是否是污點數(shù)據(jù)進行處理,如果該約束條件包含污點數(shù)據(jù)則確定為最終要輸入約束求解器的符號變量,反之則忽略該符號變量。
[0033]3)將收集到的該路徑上的符號變量送入約束求解器求解,最終就可以得到對應路徑上的測試用例。
[0034]以下結(jié)合附圖對本發(fā)明作進一步說明。
[0035]系統(tǒng)主要由兩個模塊構(gòu)成,如附圖1所示,程序分析和執(zhí)行監(jiān)控模塊,約束求解和測試用例生成模塊。
[0036]程序分析和執(zhí)行監(jiān)控模塊
本模塊主要針對二進制程序進行處理,利用反匯編技術(shù)將二進制程序轉(zhuǎn)換成匯編程序,然后對匯編程序進行中間語言處理并插樁相應的函數(shù),獲取敏感區(qū)域信息,并將處理后的程序重新編譯成二進制程序。之后,輸入種子測試用例驅(qū)動重新編譯的二進制程序運行,在運行過程中監(jiān)控輸入符號變量,收集分支路徑約束條件,在遇到分支跳轉(zhuǎn)時,將當前收集到的約束集取反輸出。[0037]約束求解和測試用例生成模塊
由于收集到的路徑可達約束可能不存在污點數(shù)據(jù),所以將其送入約束求解器求解之前,須先對約束進行化簡,并將其轉(zhuǎn)換為約束求解器所需輸入格式,這樣可以減少約束求解器的求解開銷。在對路徑約束求解構(gòu)造測試用例時,采用STP求解器,STP的全稱為SimpleTheorem Prover,由MIT的Vijay Ganesh領(lǐng)導的小組開發(fā),主要用于約束求解類問題。該求解器已比較完善,目前國際上有很多比較成熟路徑生成工具都采用STP solver,比如ΕΧΕ、KLEE、CATCHCONV ;信息記錄器負責記錄靜態(tài)分析生成的敏感區(qū)域信息,提供相關(guān)信息支持基于貪心策略種子測試用例選擇算法。
[0038]基于貪心策略種子測試用例選擇算法
基于動態(tài)測試用例的輸入可控分支路徑遍歷算法如下:
1.使用種子測試用例作為輸入驅(qū)動程序執(zhí)行,在本次執(zhí)行路徑上符號化執(zhí)行目標程
序;
2.分析執(zhí)行路徑并提取依賴于輸入符號變量的路徑約束
3.對各分支約束取反
4.求解約束,構(gòu)建新測試用例
5.重復執(zhí)行上述步驟直到路徑覆蓋完全;
附圖2對算法進行了具體說明。假設程序路徑樹如圖,樹的每個葉結(jié)點到根節(jié)點路徑均形成一條程序執(zhí)行路徑。在第一次執(zhí)行時,執(zhí)行路徑(1,2,4,9),則可以生成執(zhí)行路徑為(1,3,…)(1,2,5), (1,2,4,8)的測試用例,依次將上述3個新用例作為種子用例,直到產(chǎn)生覆蓋到所有葉結(jié)點的測試用例。算法最終將覆蓋到所有輸入可控的分支可達路徑。
`[0039]針對精確可達路徑覆蓋方法的收集到的約束條件過于繁多,我們進一步提出針對敏感區(qū)域覆蓋的路徑生成方法,目標測試用例集僅須覆蓋靜態(tài)分析過程中檢查出的敏感區(qū)域,當敏感區(qū)域完全覆蓋時,即結(jié)束算法迭代。經(jīng)驗證,該方法可在不丟失缺陷覆蓋率的前提下,有效降低算法復雜度。
[0040]敏感區(qū)域分析
敏感區(qū)域分析通過對二進制代碼反編譯行生成的Valgrind中間代碼分析來完成,屬于靜態(tài)分析方法。所謂敏感區(qū)域,指的是軟件漏洞可能發(fā)生的地方,比如printf,memcpy等危險函數(shù)的調(diào)用,或者串指令rep stos的識別。真實軟件的二進制代碼指令數(shù)通常規(guī)模巨大,通過靜態(tài)分析技術(shù)對其中的敏感區(qū)域標識,有助于軟件缺陷發(fā)掘的進一步進行。本文中定義的二進制代碼敏感區(qū)域主要包括以下幾種類型:指針識別、危險函數(shù)識別,特別是緩沖區(qū)操作函數(shù)的的識別,以及內(nèi)存分配與回收系統(tǒng)調(diào)用的識別。
[0041]化簡約束條件
將與敏感區(qū)域相關(guān)的輸入數(shù)據(jù)確認為污點數(shù)據(jù),根據(jù)污點數(shù)據(jù)具有傳播的特性查看程序變量是否與污點數(shù)據(jù)進行了運算,如果是,則其運算結(jié)果也是污點數(shù)據(jù)。這樣通過該方法確定污染數(shù)據(jù)的流向,實現(xiàn)對污染數(shù)據(jù)的流向分析,根據(jù)最終所確定的污點數(shù)據(jù)集去化簡基于貪心策略種子測試用例選擇算法收集到的路徑約束條件,若約束條件中不包含污點數(shù)據(jù)則刪除該分支條件反之則需要送入求解器求解,最終即可得到相應路徑的測試用例。
[0042]本發(fā)明通過分析現(xiàn)有的兩種的分析技術(shù),提出一種基于這兩種方法的改進方法,針對污點數(shù)據(jù)進行處理而忽略非污點數(shù)據(jù),有效減少動態(tài)符號化執(zhí)行過程中收集到的變量,從而減少了求解器的求解開銷,提高了求解的速度與精度。
【權(quán)利要求】
1.一種面向敏感區(qū)域的嵌入式軟件測試用例生成方法,其特征在于該方法包括以下步驟: 步驟I)對二進制文件進行分析,對反匯編技術(shù)生成的匯編語言進行中間語言轉(zhuǎn)換,并對轉(zhuǎn)換結(jié)果進行插樁處理,得到插樁程序; 步驟2)利用所得的插樁程序進行敏感區(qū)域分析,確定出污點數(shù)據(jù); 步驟3)利用種子測試用例動態(tài)執(zhí)行程序,在運行過程中監(jiān)控輸入符號變量,收集分支路徑約束條件,在遇到分支跳轉(zhuǎn)時,將當前收集到的約束集取反輸出; 步驟4)分析收集到的約束集中的各個約束是否包含污點數(shù)據(jù)并進行處理,將化簡后的約束集送入約束求解器求解,所得的最終結(jié)果就為測試用例。
2.根據(jù)權(quán)利要求1所述的一種面向敏感區(qū)域的嵌入式軟件測試用例生成方法,其特征在于:步驟I)具體是: 1-1.利用反匯編技術(shù)對二進制文件進行反匯編處理,得到二進制文件相應的匯編程序; 1-2.利用Valgrind對反匯編得到的匯編程序進行轉(zhuǎn)換,將經(jīng)過反匯編生成的匯編程序進一步提升至中間語言; 1-3.對中間語言做進一步分析,針對中間語言對變量的輸入、賦值處理,在變量所在相應位置插樁函數(shù),所得到的最終結(jié)果就是插樁程序。
3.根據(jù)權(quán)利要求1所述的一種面向敏感區(qū)域的嵌入式軟件測試用例生成方法,其特征在于:步驟2)具體包括如下步驟: 2-1.確定敏感區(qū)域:將容易引起緩沖區(qū)溢出的printf、memcpy、memset和strcpy危險函數(shù)的調(diào)用確認為敏感區(qū)域; 2-2.將與敏感區(qū)域相關(guān)的輸入數(shù)據(jù)確認為污點數(shù)據(jù); 2-3.查看程序變量是否與污點數(shù)據(jù)進行了運算,如果是,則其運算結(jié)果也是污點數(shù)據(jù)。
4.根據(jù)權(quán)利要求1所述的一種面向敏感區(qū)域的嵌入式軟件測試用例生成方法,其特征在于:步驟3)具體包括如下步驟: 3-1.利用種子測試用例作為輸入動態(tài)驅(qū)動程序執(zhí)行,并對執(zhí)行過程中所遇到的變量進行符號化,用符號變量代替實際變量符號化執(zhí)行程序; 3-2.收集符號化執(zhí)行時路徑經(jīng)過的分支條件,收集的全部約束就是該路徑的一組約束條件; 3-3.通過將這組約束條件依次求反得到指向其他分支的路徑約束條件,重復執(zhí)行3-2,3-3步得到程序的全部路徑約束。
5.根據(jù)權(quán)利要求1所述的一種面向敏感區(qū)域的嵌入式軟件測試用例生成方法,其特征在于:步驟4)具體包括如下步驟: 4-1.對收集到的路徑約束進行分析,遍歷其中的每一個約束條件; 4-2.根據(jù)約束條件中的符號變量是否是污點數(shù)據(jù)進行處理,如果該約束條件包含污點數(shù)據(jù)則確定為最終要輸入約束求解器的符號變量,反之則忽略該符號變量; 4-3.將收集到的該路徑上的符號變量送入約束求解器求解,最終得到對應路徑上的測試用例。
【文檔編號】G06F11/36GK103714000SQ201310703581
【公開日】2014年4月9日 申請日期:2013年12月18日 優(yōu)先權(quán)日:2013年12月18日
【發(fā)明者】方景龍, 程攀, 萬季, 王興起, 王大全 申請人:杭州電子科技大學