基于控制流分析和數(shù)據(jù)流分析的Java程序靜態(tài)分析方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計(jì)算機(jī)安全領(lǐng)域,更進(jìn)一步涉及一種檢測分析方法,可用于對Java語言環(huán)境中的程序靜態(tài)檢測,實(shí)現(xiàn)對Java程序的分析。
【背景技術(shù)】
[0002]Java語言,作為軟件開發(fā)的代表性語言,以它獨(dú)特的優(yōu)勢占據(jù)著市場的主要份額。Java語言是由美國SUN公司開發(fā)的一種面向?qū)ο蟮某绦蛟O(shè)計(jì)語言,它比C和C++語言有著更好的通用性、高效性、跨平臺性以及安全性。開發(fā)者使用Java語言可大大提高軟件開發(fā)的效率,但同時,隨著軟件程序代碼規(guī)模的逐步增加,復(fù)雜度的提高,程序代碼的檢測就會變得越來越困難,這也使得人們在查找漏洞過程中面臨更大的挑戰(zhàn)。
[0003]基于Java源程序的漏洞分析和檢測現(xiàn)有的方法有很多種,從大的分類來看,其可分為程序執(zhí)行過程中進(jìn)行的檢測即動態(tài)檢測和程序源代碼的分析檢測即靜態(tài)檢測。國內(nèi)外對Java程序的靜態(tài)分析和動態(tài)分析已經(jīng)有相當(dāng)?shù)慕?jīng)驗(yàn)和成果。其中主要針對Java程序語言的幾種相對典型的問題,例如內(nèi)存溢出、Java并行程序、Java applets、數(shù)組越界等都是人們在編寫Java程序時常常出現(xiàn)或者遺漏在代碼中的問題。
[0004]動態(tài)分析最常用的是插粧技術(shù),在程序運(yùn)行過程中對被檢測的代碼段插入具有一定功能的檢測代碼,然后運(yùn)行程序,收集程序運(yùn)行過程中的相關(guān)信息,以發(fā)現(xiàn)程序運(yùn)行的錯誤,從而達(dá)到檢測代碼中存在的漏洞的目標(biāo)。動態(tài)分析的難點(diǎn)是有一定的盲目性,在無法預(yù)計(jì)程序功能塊的前提下,盲目的插入檢測代碼到程序的邏輯塊中,影響代碼的時間復(fù)雜度和空間復(fù)雜度。
[0005]靜態(tài)分析不同于動態(tài)分析,它是在不運(yùn)行程序的前提下,對程序的執(zhí)行邏輯逐步分析,生成語法樹和流程圖,在對程序中某個功能塊的分析已經(jīng)完備的前提下,對程序的運(yùn)行結(jié)果的可能性進(jìn)行分析,得出結(jié)論。但這種靜態(tài)分析有一定的限制,它只是在分析中去推測程序運(yùn)行的結(jié)果中可能出現(xiàn)的問題,會出現(xiàn)誤報(bào)或者漏報(bào)的情況,影響分析結(jié)果的準(zhǔn)確性。
【發(fā)明內(nèi)容】
[0006]本發(fā)明在目的在于針對上述現(xiàn)有靜態(tài)分析的不足,提出一種基于控制流分析和數(shù)據(jù)流分析的Java程序靜態(tài)檢測方法,減小誤報(bào)或者漏報(bào),提高分析結(jié)果的準(zhǔn)確性。
[0007]為實(shí)現(xiàn)上述目的,本發(fā)明的技術(shù)方案包括:
[0008](I)使用開源工具Soot,將Java源程序轉(zhuǎn)化為Jimple語言的中間表示形式,并對中間表示形式進(jìn)行數(shù)據(jù)結(jié)構(gòu)的拆分,建立抽象語法樹,生成控制流圖;
[0009](2)將Java程序靜態(tài)分析問題抽象為過程間分布式子集問題IFDS,并以過程間分布式子集問題IFDS求解器的方式表示該過程間分布式子集問題IFDS;
[0010](3)定義過程間分布式子集問題IFDS求解器的接口類:
[0011]3a)規(guī)定過程間分布式子集問題IFDS求解器接口類參數(shù)的形式,即用字母N表示節(jié)點(diǎn)參數(shù),用字母D表示數(shù)據(jù)參數(shù),用字母M表示方法參數(shù),用字母V表示值參數(shù),用字母G表示控制流圖參數(shù);
[0012]3b)規(guī)定過程間分布式子集問題IFDS求解器的類接口的名稱為:iroSSl0Ver〈N,D,M,V,G>;
[0013]3c)規(guī)定過程間分布式子集問題IFDS求解器的類接口 IFDSSlover〈N,D,M,V,G>中包含有如下四個功能函數(shù):數(shù)據(jù)流函數(shù)FlowFunc t i ons〈N,D,M>,控制流圖函數(shù)interproceduralCFG(),初始化種子函數(shù)initialSeeds(),零值表不函數(shù)zeroValue();
[0014 ] (4)在數(shù)據(jù)流函數(shù)FI οwFunc t i ons〈N,D,M>中設(shè)置數(shù)據(jù)流分析規(guī)則:
[0015]4a)規(guī)定控制流圖上節(jié)點(diǎn)的類型包括:普通節(jié)點(diǎn),調(diào)用節(jié)點(diǎn)及返回節(jié)點(diǎn);
[0016]4b)根據(jù)節(jié)點(diǎn)的類型規(guī)定節(jié)點(diǎn)之間邊的類型:
[0017]若當(dāng)前節(jié)點(diǎn)為普通節(jié)點(diǎn),且當(dāng)前節(jié)點(diǎn)的下一個節(jié)點(diǎn)為普通節(jié)點(diǎn),則規(guī)定這兩個節(jié)點(diǎn)之間邊的類型為普通邊;
[0018]若當(dāng)前節(jié)點(diǎn)為調(diào)用節(jié)點(diǎn),且當(dāng)前節(jié)點(diǎn)的下一個節(jié)點(diǎn)為普通節(jié)點(diǎn),則規(guī)定這兩個節(jié)點(diǎn)之間邊的類型為調(diào)用邊;
[0019]若當(dāng)前節(jié)點(diǎn)為返回節(jié)點(diǎn),且當(dāng)前節(jié)點(diǎn)的下一個節(jié)點(diǎn)為普通節(jié)點(diǎn),則規(guī)定這兩個節(jié)點(diǎn)之間邊的類型為返回邊;
[0020]若當(dāng)前節(jié)點(diǎn)為調(diào)用節(jié)點(diǎn),且當(dāng)前節(jié)點(diǎn)的下一個節(jié)點(diǎn)為返回節(jié)點(diǎn),則規(guī)定這兩個節(jié)點(diǎn)之間邊的類型為調(diào)用返回邊;
[0021]4c)根據(jù)邊的類型確定邊上數(shù)據(jù)流分析的不同操作規(guī)程:
[0022]對于普通邊的操作是:先執(zhí)行對應(yīng)的控制流圖邊上的程序,再以數(shù)據(jù)等量賦值或數(shù)據(jù)空值截流的方式,將當(dāng)前節(jié)點(diǎn)的數(shù)據(jù)傳遞給當(dāng)前普通節(jié)點(diǎn)的下一個普通節(jié)點(diǎn);
[0023]對于調(diào)用邊的操作是:先執(zhí)行對應(yīng)的控制流圖邊上的程序,再以變量名稱替換和數(shù)據(jù)等量賦值的方式,將當(dāng)前節(jié)點(diǎn)的數(shù)據(jù)傳遞給當(dāng)前調(diào)用節(jié)點(diǎn)的下一個普通節(jié)點(diǎn);
[0024]對于返回邊的操作是:先執(zhí)行對應(yīng)的控制流圖邊上的程序,再以變量名稱替回和數(shù)據(jù)等量賦值或數(shù)據(jù)空值截流的方式,將當(dāng)前節(jié)點(diǎn)的數(shù)據(jù)傳遞給當(dāng)前返回節(jié)點(diǎn)的下一個普通節(jié)點(diǎn);
[0025]對于調(diào)用返回邊的操作是:先執(zhí)行對應(yīng)的控制流圖邊上的程序,再以數(shù)據(jù)等量賦值或數(shù)據(jù)空值截流的方式,將當(dāng)前節(jié)點(diǎn)的數(shù)據(jù)傳遞給返回節(jié)點(diǎn)。
[0026](5)運(yùn)行過程間分布式子集問題IFDS求解器接口類IFDSSlover〈N,D,M,V,G>,在控制流圖的基礎(chǔ)上進(jìn)行數(shù)據(jù)流分析:
[0027]5a)將控制流圖傳遞給過程間分布式子集問題IFDS求解器接口類IFDSSloveKN,D,M,V,G>中的控制流圖參數(shù)G,再通過控制流圖參數(shù)G將控制流圖填充到控制流圖函數(shù)interproceduralCFG()中;
[0028]5b)初始化種子函數(shù)initialSeedsO,即以控制流圖的第一個節(jié)點(diǎn)為起始節(jié)點(diǎn),生成初始化種子,從初始化種子節(jié)點(diǎn)開始按照控制流圖的執(zhí)行邏輯,應(yīng)用數(shù)據(jù)流分析規(guī)則,進(jìn)行數(shù)據(jù)流分析;
[0029]5c)執(zhí)行(4)數(shù)據(jù)流規(guī)則,根據(jù)步驟4c)數(shù)據(jù)流操作規(guī)程中的數(shù)據(jù)傳遞方式,確定具體的值傳遞操作方式:
[0030]若傳遞方式為數(shù)據(jù)等量賦值,則直接將該值傳遞給下一個節(jié)點(diǎn);
[0031]若傳遞方式為數(shù)據(jù)空值截流,則先調(diào)用零值表示函數(shù)zeroValueO將空值轉(zhuǎn)化為空值符號NULL,再將該空值符號NULL傳遞給下一個節(jié)點(diǎn);
[0032]5d)判斷當(dāng)前節(jié)點(diǎn)傳遞給下一個節(jié)點(diǎn)是否成功:
[0033]若當(dāng)前節(jié)點(diǎn)的下一個節(jié)點(diǎn)正確接收當(dāng)前節(jié)點(diǎn)傳遞的等量值或空值符號NULL,則當(dāng)前節(jié)點(diǎn)傳遞給下一個節(jié)點(diǎn)成功,跳轉(zhuǎn)到步驟5e);
[0034]若當(dāng)前節(jié)點(diǎn)的下一個節(jié)點(diǎn)不能正確接收當(dāng)前節(jié)點(diǎn)傳遞的等量值或空值符號NULL,則當(dāng)前節(jié)點(diǎn)傳遞給下一個節(jié)點(diǎn)失敗,退出數(shù)據(jù)流分析;
[0035]5e)判斷當(dāng)前節(jié)點(diǎn)的下一個節(jié)點(diǎn)是否為最后一個節(jié)點(diǎn):
[0036]若當(dāng)前節(jié)點(diǎn)的下一個節(jié)點(diǎn)不是最后一個節(jié)點(diǎn),則從當(dāng)前節(jié)點(diǎn)的下一個節(jié)點(diǎn)開始,返回5c);
[0037]若果當(dāng)前節(jié)點(diǎn)的下一個節(jié)點(diǎn)是最后一個節(jié)點(diǎn),則數(shù)據(jù)流分析完成,輸出最終結(jié)果。
[0038]本發(fā)明與現(xiàn)有技術(shù)相比具有以下優(yōu)點(diǎn):
[0039]1.分析效率高。
[0040]本發(fā)明將Java源程序轉(zhuǎn)化為Jimple語言形式,既沒有破壞Java語言基本結(jié)構(gòu)特點(diǎn),又直接對類Java字節(jié)碼執(zhí)行了分析,跳過了對Java源碼的解析成Java字節(jié)碼的階段,執(zhí)行速度快,分析效率高。
[0041 ] 2.提高了數(shù)據(jù)流分析的完整性和準(zhǔn)確性。
[0042]本發(fā)明在控制流圖的基礎(chǔ)上,采用功能函數(shù)的方式定義數(shù)據(jù)流分析規(guī)則,依次規(guī)定了控制流圖中的節(jié)點(diǎn)類型、邊類型和對應(yīng)不同邊類型的數(shù)據(jù)流操作方式,克服了現(xiàn)有技術(shù)數(shù)據(jù)流分析單一化的模式,使數(shù)據(jù)流的分析更加完整和準(zhǔn)確。
[0043]3.擴(kuò)展性強(qiáng),易于應(yīng)用。
[0044]本發(fā)明采用功能函數(shù)的定義方式定義數(shù)據(jù)流分析規(guī)則,提供給用戶一套完整的模板,用戶可以將該模板擴(kuò)展成針對具體問題的分析,在模板的基礎(chǔ)上進(jìn)行代碼的填充,達(dá)到特定的分析效果,易于用戶應(yīng)用。
【附圖說明】
[0045]圖1為本發(fā)明的實(shí)現(xiàn)總流程圖;
[0046]圖2為本發(fā)明過程間分布式子集問題IFDS接口類定義流程圖;
[0047]圖3為本