專利名稱:一種基于中間語言分析的軟件脆弱性測試方法
技術(shù)領(lǐng)域:
本發(fā)明涉及軟件測試技術(shù)領(lǐng)域,具體涉及到虛擬化技術(shù)、動(dòng)態(tài)二進(jìn)制插樁技術(shù)、中間語言分析技術(shù)、符號(hào)執(zhí)行技術(shù)。
背景技術(shù):
在軟件生命周期中,軟件測試是非常重要的一個(gè)環(huán)節(jié),高效完備的測試是保證軟件質(zhì)量的重要手段。基于測試的粒度,軟件測試可以分為系統(tǒng)測試、模塊測試、策略級(jí)測試。 基于測試收集數(shù)據(jù)的類型,軟件測試可以分為性能測試、功能測試、穩(wěn)定性測試等。此外,根據(jù)測試過程是否依賴于程序內(nèi)部結(jié)構(gòu),軟件測試可以分為白盒測試、黑盒測試、灰盒測試。
基于分層和抽象的原則,計(jì)算機(jī)系統(tǒng)在不同層面上實(shí)現(xiàn)虛擬化技術(shù),以提供多個(gè)同構(gòu)或異構(gòu)的平臺(tái)。在硬件、系統(tǒng)以及應(yīng)用程序各個(gè)層次上,虛擬化提供很好的物理隔離和邏輯隔離,并提供細(xì)粒度的運(yùn)行時(shí)信息,在程序分析領(lǐng)域有廣泛的應(yīng)用。
動(dòng)態(tài)二進(jìn)制插樁是指在程序運(yùn)行時(shí),除了正常執(zhí)行原始程序外,在相關(guān)位置插入執(zhí)行其他代碼,用于完成程序運(yùn)行時(shí)信息收集、分析、優(yōu)化等工作。根據(jù)是否對(duì)原始程序執(zhí)行邏輯產(chǎn)生影響,插樁可以分為有損插樁和無損插樁。
中間語言分析和優(yōu)化在編譯技術(shù)領(lǐng)域有著廣泛的應(yīng)用。通過對(duì)程序源代碼或機(jī)器指令進(jìn)行翻譯,轉(zhuǎn)換為中間語言形式,導(dǎo)出某些隱含信息,從而方便程序的分析和優(yōu)化。
與實(shí)際執(zhí)行不同,在符號(hào)執(zhí)行中,程序的輸入數(shù)據(jù)是一個(gè)符號(hào),這個(gè)符號(hào)代表任何可能的輸入,而不是局限某個(gè)特定的輸入。程序在執(zhí)行計(jì)算、拷貝、比較、分支跳轉(zhuǎn)等語句時(shí),都可以表達(dá)為對(duì)應(yīng)的符號(hào)操作。符號(hào)執(zhí)行在軟件測試和程序證明中有著廣泛的應(yīng)用。發(fā)明內(nèi)容
在傳統(tǒng)測試方法中,普遍存在著代碼覆蓋率較低、測試效率低下的缺陷,無法根據(jù)實(shí)際需求,對(duì)特定的代碼路徑進(jìn)行高效測試。有鑒于此,本發(fā)明提供了一種基于中間語言分析的軟件脆弱性測試方法,用于發(fā)現(xiàn)程序潛在的設(shè)計(jì)缺陷。
該基于中間語言分析的軟件脆弱性測試方法是這樣實(shí)現(xiàn)的
第一步運(yùn)行目標(biāo)測試程序,采用基于動(dòng)態(tài)二進(jìn)制插樁方法將程序執(zhí)行中的上下文信息記錄到trace文件中;
其中上下文信息包括指令機(jī)器碼、寄存器、訪存數(shù)據(jù)。
第二步對(duì)程序trace進(jìn)行離線分析,順次讀取每一條指令,并將上下文信息保存到對(duì)應(yīng)數(shù)據(jù)結(jié)構(gòu)中,將指令機(jī)器碼轉(zhuǎn)換為中間語言表示;
其中中間語言包括7種基本操作,分別如下
IRStmt_Mark 標(biāo)記原始指令信息;臨時(shí)變量向寄存器寫數(shù)據(jù)
IRStmt_ffrTmp 寄存器向臨時(shí)變量寫數(shù)據(jù)
IRStmtJtore 臨時(shí)變量向內(nèi)存寫數(shù)據(jù)
IRStmt_Exit 退出中間語言某個(gè)代碼塊
IRStmt_PutE 臨時(shí)變量向寄存器寫浮點(diǎn)數(shù)據(jù)空操作,無實(shí)際意義
將中間語言分成3個(gè)層次,即超級(jí)塊、語句、表達(dá)式;一個(gè)Trace映射多個(gè)超級(jí)塊, 每個(gè)超級(jí)塊包括多條語句,每條語句由多個(gè)表達(dá)式構(gòu)成。
第三步針對(duì)中間語言進(jìn)行污點(diǎn)分析,包括污點(diǎn)標(biāo)記和污點(diǎn)傳播兩個(gè)方面;污點(diǎn)標(biāo)記通過分析Trace中的系統(tǒng)調(diào)用,將從外部設(shè)備讀進(jìn)內(nèi)存的數(shù)據(jù)標(biāo)記為污染源;污點(diǎn)傳播通過分析中間語句,通過判斷語句和源操作數(shù)類型,判定操作是否會(huì)引起污點(diǎn)傳播;
第四步約束條件收集程序發(fā)生分支跳轉(zhuǎn)時(shí),污點(diǎn)對(duì)分支條件的影響即為約束條件;在中間語言中,如果分支跳轉(zhuǎn)語句的條件被污染,那么收集對(duì)應(yīng)的約束條件;
第五步基于上述中間語言分析,某一條路徑對(duì)應(yīng)多個(gè)約束條件PC,對(duì)各個(gè)約束條件進(jìn)行邏輯合取,生成布爾方程F = PC1 η PC2 η…η PCn ;
第六步依據(jù)路徑搜索策略對(duì)布爾方程進(jìn)行變換,不同的方程對(duì)應(yīng)程序所走的不同路徑,如果方程有解,則存在輸入使程序走對(duì)應(yīng)路徑,否則該路徑不可達(dá);
第七步通過約束求解,得到各個(gè)路徑對(duì)應(yīng)輸入值,基于輸入模板,通過在相關(guān)位置上修改數(shù)據(jù),生成新的測試用例,驅(qū)動(dòng)程序繼續(xù)執(zhí)行。
本發(fā)明的有益效果為
基于中間語言進(jìn)行測試用例的自動(dòng)化生成,使得在測試過程中,污點(diǎn)分析和符號(hào)執(zhí)行的對(duì)象不再局限于某一個(gè)固定指令集,而是支持包括x86、arm等多種體系架構(gòu)。因此, 基于中間語言進(jìn)行自動(dòng)化測試,測試對(duì)象的運(yùn)行平臺(tái)即可以為PC或服務(wù)器,也可以為嵌入式系統(tǒng)。
圖1為基于中間語言進(jìn)行自動(dòng)化測試的系統(tǒng)框架;
圖2為中間語言的翻譯機(jī)制;
圖3為中間語言的內(nèi)部操作機(jī)制。
具體實(shí)施方式
下面結(jié)合附圖對(duì)本發(fā)明作進(jìn)一步介紹。
圖1為基于中間語言進(jìn)行自動(dòng)化測試的系統(tǒng)框架。系統(tǒng)分模擬器和離線分析模塊兩大部分,前者主要完成對(duì)目標(biāo)程序運(yùn)行時(shí)信息的捕獲,后者主要完成測試用例的自動(dòng)化生成。
圖2為中間語言的翻譯機(jī)制。中間語言分析模塊將每一條機(jī)器指令翻譯成等價(jià)的中間代碼,并對(duì)中間代碼解釋執(zhí)行。在解釋過程中,維護(hù)程序的上下文信息,并進(jìn)行污點(diǎn)傳播分析。
圖3為中間語言的內(nèi)部操作機(jī)制。中間語言內(nèi)部維護(hù)三個(gè)對(duì)象,即寄存器、臨時(shí)變量以及內(nèi)存數(shù)據(jù),其中臨時(shí)變量是對(duì)象之間傳遞數(shù)據(jù)的媒介,任何數(shù)據(jù)操作必須通過對(duì)中間變量的讀寫來實(shí)現(xiàn)。
一、收集目標(biāo)程序運(yùn)行時(shí)信息
1、虛擬機(jī)啟動(dòng)操作系統(tǒng)啟動(dòng)操作系統(tǒng)。測試目標(biāo)可以是運(yùn)行在PC平臺(tái)下的 Windows程序,也可以是運(yùn)行在嵌入式平臺(tái)下的Linux程序。模擬器根據(jù)目標(biāo)程序所在的硬件平臺(tái)和軟件平臺(tái)的不同,加載對(duì)應(yīng)的配置,并啟動(dòng)操作系統(tǒng)。
2、啟動(dòng)二進(jìn)制插樁工具二進(jìn)制插樁工具用于在二進(jìn)制級(jí)別對(duì)目標(biāo)進(jìn)程進(jìn)行追蹤和監(jiān)控。記錄程序的運(yùn)行時(shí)信息,用于后續(xù)的進(jìn)一步分析。運(yùn)行時(shí)信息,具體包括程序指令的機(jī)器碼、寄存器數(shù)據(jù)、內(nèi)存讀寫數(shù)據(jù)、線程信息、加載的模塊信息等。
3、初始化目標(biāo)程序命令行或圖形界面啟動(dòng)目標(biāo)程序,根據(jù)程序的輸入類型(網(wǎng)絡(luò)報(bào)文、磁盤文件或終端輸入),向程序輸入初始數(shù)據(jù),驅(qū)動(dòng)程序執(zhí)行,并收集目標(biāo)程序運(yùn)行時(shí)上下文信息。如圖1所示,系統(tǒng)框架左半部分是模擬器部分,用于加載操作系統(tǒng)和測試對(duì)象。
以上三個(gè)部分,完成程序運(yùn)行時(shí)上下文信息的收集,并將對(duì)應(yīng)數(shù)據(jù)轉(zhuǎn)儲(chǔ)到Trace 文件中。
二、中間語言分析
1、指令回放=Trace文件記錄程序運(yùn)行時(shí)的指令上下文信息,包括指令機(jī)器碼、寄存器、訪存數(shù)據(jù)等。如圖1所示,離線分析模塊順次讀取每一條指令,并將上下文信息保存到對(duì)應(yīng)數(shù)據(jù)結(jié)構(gòu)中。
2、中間語言分析在PC、服務(wù)器以及嵌入式平臺(tái)存在各種各樣的指令集,包括 x86, ppc, spare, arm等。各種指令集在語法和語義上存在著很大差異,加之指令集本身存在隱含信息,使得指令分析存在較大困難。
如圖3所示,本發(fā)明設(shè)計(jì)三種變量,即寄存器,中間變量,內(nèi)存變量。三種變量順次編號(hào),并依次映射對(duì)應(yīng)資源。為了將原指令集操作進(jìn)行等價(jià)轉(zhuǎn)換,中間語言引入7種基本操作,分別如下
IRStmt_Mark 標(biāo)記原始指令信息(機(jī)器碼,內(nèi)存地址)臨時(shí)變量向寄存器寫數(shù)據(jù)
IRStmt_ffrTmp 寄存器(臨時(shí)變量、內(nèi)存)向臨時(shí)變量寫數(shù)據(jù)
IRStmtJtore 臨時(shí)變量向內(nèi)存寫數(shù)據(jù)
IRStmt_Exit 退出中間語言某個(gè)代碼塊
IRStmt_PutE 臨時(shí)變量向寄存器寫浮點(diǎn)數(shù)據(jù)
II tmt_Nop 空操作,無實(shí)際意義
同時(shí),本方案將中間語言分成3個(gè)層次,即超級(jí)塊(SuperBlock)、語句(IRStmt)、 表達(dá)式(IRExpr),并維護(hù)一個(gè)中間語言上下文。一個(gè)原始的Trace可以映射多個(gè)超級(jí)塊,每個(gè)超級(jí)塊包括多條語句,每條語句又有多個(gè)表達(dá)式構(gòu)成。分層設(shè)計(jì)和實(shí)現(xiàn),便于中間語言根據(jù)需求,在各個(gè)層次上進(jìn)行分析和優(yōu)化。
3、污點(diǎn)分析及約束條件收集針對(duì)中間語言進(jìn)行污點(diǎn)分析,包括污點(diǎn)標(biāo)記和污點(diǎn)傳播兩個(gè)方面。污點(diǎn)標(biāo)記主要是通過分析Trace中某些系統(tǒng)調(diào)用(如讀取文件數(shù)據(jù)、接受網(wǎng)絡(luò)報(bào)文),將某些內(nèi)存區(qū)域或寄存器標(biāo)記為污染源。污點(diǎn)傳播主要是通過分析中間語句, 根據(jù)語句類型來判斷是否引起污點(diǎn)傳播。例如,^Mmt Dest, Src;如果Src變量已被污染,并且中間語句能夠引起數(shù)據(jù)傳播,那么Dest變量亦會(huì)被污染。在本方案設(shè)計(jì)的中間語言中,可能引起污點(diǎn)傳播的有II tmt_Put,IRStmt_ffrTmp, IRStmt_Store三種類型語句。程序在執(zhí)行過程中,會(huì)通過系統(tǒng)調(diào)用(read、receive等)從磁盤或網(wǎng)絡(luò)中讀取數(shù)據(jù),并放入內(nèi)存。這些讀進(jìn)內(nèi)存的數(shù)據(jù),即可認(rèn)定程序的初始輸入,通過將這些從外部設(shè)備讀進(jìn)內(nèi)存的數(shù)據(jù)標(biāo)記為污染源,即可以開始監(jiān)控輸入數(shù)據(jù)對(duì)程序狀態(tài)的影響。在中間語言中,賦值、計(jì)算、條件判斷等操作會(huì)引起值的直接或間接傳播,通過判斷語句和源操作數(shù)類型,判定操作是否會(huì)引起污點(diǎn)傳播。
約束條件收集程序發(fā)生分支跳轉(zhuǎn)時(shí),污點(diǎn)對(duì)分支條件的影響即為約束條件。在中間語言中,如果分支跳轉(zhuǎn)語句的條件被污染,那么需要收集對(duì)應(yīng)的約束條件。約束條件是一個(gè)布爾表達(dá)式,例如下面語句。
If (REG (0)eq 0) THEN
IRStmt ;
ELSE
IRStmt ;
如果REG(O)被污染,那么此分支的約束條件即為PC = REG(O)eq 0。
三、程序路徑探測及測試用例生成
1、程序路徑探測基于上述中間語言分析,某一條路徑對(duì)應(yīng)多個(gè)約束條件(PC), 對(duì)各個(gè)約束條件進(jìn)行邏輯合取,生成布爾方程F。路徑搜索包括深度優(yōu)先、寬度優(yōu)先等策略。 依據(jù)具體的搜索策略,本方案對(duì)布爾方程采用不同的變換策略。例如基于深度優(yōu)先,對(duì)方程 F = PC1 η PC2 η…η PCn可以生成η個(gè)新的方程,如下所示。
Fn = PC1 η PC2 η …η "pen
Flri = PC1 η PC2 η …η "PClri
.........
F2 = PC1 η "PC2
F1 = "PC1
通過對(duì)方程η個(gè)條件逐個(gè)取反,生成η個(gè)新的布爾方程,這η個(gè)布爾方程分別對(duì)應(yīng)著η個(gè)不同的程序路徑。
依據(jù)路徑搜索策略,對(duì)布爾方程進(jìn)行變換,不同的方程對(duì)應(yīng)程序所走的不同路徑。 如果方程有解,則存在輸入使程序走對(duì)應(yīng)路徑,否則該路徑不可達(dá)。
2、測試用例生成通過符號(hào)執(zhí)行和約束求解,路徑探測空間探測模塊會(huì)得到各個(gè)路徑對(duì)應(yīng)輸入值?;谳斎肽0?,通過在相關(guān)位置上修改數(shù)據(jù),生成新的測試用例,驅(qū)動(dòng)程序繼續(xù)執(zhí)行。布爾方程是否有解,是通過求解器來驗(yàn)證的。如果某個(gè)布爾方程存在解,則求解器會(huì)返回方程的某個(gè)輸入值,否則求解器會(huì)告知無解。由于不同的布爾方程對(duì)應(yīng)不同的程序路徑,所以方程解即對(duì)應(yīng)路徑的輸入。
權(quán)利要求
1.基于中間語言分析的軟件脆弱性測試方法,其特征在于,包括以下步驟第一步運(yùn)行目標(biāo)測試程序,采用基于動(dòng)態(tài)二進(jìn)制插樁方法將程序執(zhí)行中的上下文信息記錄到trace文件中;第二步對(duì)程序trace進(jìn)行離線分析,順次讀取每一條指令,并將上下文信息保存到對(duì)應(yīng)數(shù)據(jù)結(jié)構(gòu)中,將指令機(jī)器碼轉(zhuǎn)換為中間語言表示;第三步針對(duì)中間語言進(jìn)行污點(diǎn)分析,包括污點(diǎn)標(biāo)記和污點(diǎn)傳播兩個(gè)方面;污點(diǎn)標(biāo)記通過分析Trace中的系統(tǒng)調(diào)用,將從外部設(shè)備讀進(jìn)內(nèi)存的數(shù)據(jù)標(biāo)記為污染源;污點(diǎn)傳播通過分析中間語句,通過判斷語句和源操作數(shù)類型,判定操作是否會(huì)引起污點(diǎn)傳播;第四步約束條件收集程序發(fā)生分支跳轉(zhuǎn)時(shí),污點(diǎn)對(duì)分支條件的影響即為約束條件; 在中間語言中,如果分支跳轉(zhuǎn)語句的條件被污染,那么收集對(duì)應(yīng)的約束條件;第五步基于上述中間語言分析,某一條路徑對(duì)應(yīng)多個(gè)約束條件PC,對(duì)各個(gè)約束條件進(jìn)行邏輯合取,生成布爾方程F = PC1 η PC2 η…η PCn ;第六步依據(jù)路徑搜索策略對(duì)布爾方程進(jìn)行變換,不同的方程對(duì)應(yīng)程序所走的不同路徑,如果方程有解,則存在輸入使程序走對(duì)應(yīng)路徑,否則該路徑不可達(dá);第七步通過約束求解,得到各個(gè)路徑對(duì)應(yīng)輸入值,基于輸入模板,通過在相關(guān)位置上修改數(shù)據(jù),生成新的測試用例,驅(qū)動(dòng)程序繼續(xù)執(zhí)行。
2.如權(quán)利要求1所述的基于中間語言分析的軟件脆弱性測試方法,其特征在于,其中上下文信息包括指令機(jī)器碼、寄存器、訪存數(shù)據(jù)。
3.如權(quán)利要求1或2所述的基于中間語言分析的軟件脆弱性測試方法,其特征在于,其中中間語言包括7種基本操作,分別如下IRStmt_Mark 標(biāo)記原始指令信息; IRStmt_Put 臨時(shí)變量向寄存器寫數(shù)據(jù) IRStmt_ffrTmp 寄存器向臨時(shí)變量寫數(shù)據(jù) IRStmt_Store 臨時(shí)變量向內(nèi)存寫數(shù)據(jù) IRStmt_Exit 退出中間語言某個(gè)代碼塊 IRStmt_PutE 臨時(shí)變量向寄存器寫浮點(diǎn)數(shù)據(jù) IRStmt_Nop 空操作,無實(shí)際意義將中間語言分成3個(gè)層次,即超級(jí)塊、語句、表達(dá)式;一個(gè)Trace映射多個(gè)超級(jí)塊,每個(gè)超級(jí)塊包括多條語句,每條語句由多個(gè)表達(dá)式構(gòu)成。
全文摘要
本發(fā)明為一種基于中間語言分析的軟件脆弱性測試方法,首先采用基于動(dòng)態(tài)二進(jìn)制插樁方法將程序執(zhí)行中的上下文信息記錄到trace文件中;其次對(duì)程序trace進(jìn)行離線分析,順次讀取每一條指令,并將上下文信息保存到對(duì)應(yīng)數(shù)據(jù)結(jié)構(gòu)中,將指令機(jī)器碼轉(zhuǎn)換為中間語言表示;然后針對(duì)中間語言進(jìn)行污點(diǎn)分析,通過分析中間語句,通過判斷語句和源操作數(shù)類型,判定操作是否會(huì)引起污點(diǎn)傳播;約束條件收集,基于上述中間語言分析,依據(jù)路徑搜索策略對(duì)布爾方程進(jìn)行變換,通過約束求解,得到各個(gè)路徑對(duì)應(yīng)輸入值。本發(fā)明測試對(duì)象的運(yùn)行平臺(tái)即可以為PC或服務(wù)器,也可以為嵌入式系統(tǒng)。
文檔編號(hào)G06F9/45GK102495795SQ20111038023
公開日2012年6月13日 申請(qǐng)日期2011年11月25日 優(yōu)先權(quán)日2011年11月25日
發(fā)明者吳志勇, 房珊瑤, 施凡, 曹鼎, 楊威, 牛偉, 王嘯天, 肖奇學(xué), 趙建芝, 趙靜, 郭世澤, 陳哲, 陳渝 申請(qǐng)人:中國人民解放軍總參謀部第五十四研究所