本發(fā)明涉及代碼分析技術(shù)領(lǐng)域,尤其涉及一種基于分析目標驅(qū)動的代碼分析方法和系統(tǒng)。
背景技術(shù):
傳統(tǒng)的代碼分析,是對所有程序代碼進行分析,抽取出程序的靜態(tài)數(shù)據(jù)模型,然后才根據(jù)具體的代碼掃描目標規(guī)則,對靜態(tài)數(shù)據(jù)模型進行檢索,得到想掃描出的安全漏洞或者其他類型問題,并沒有針對性的對某一個目標進行分析。
代碼分析以及數(shù)據(jù)流、控制流數(shù)據(jù)結(jié)構(gòu),都是中立的、一般的,并未專門為了特定分析目的進行數(shù)據(jù)收集,從而無法準確高效的實現(xiàn)特定的目的,比如代碼安全缺陷查找。
技術(shù)實現(xiàn)要素:
基于背景技術(shù)存在的技術(shù)問題,本發(fā)明提出了一種基于分析目標驅(qū)動的代碼分析方法和系統(tǒng),基于代碼分析目標,有針對性對代碼進行分析,實現(xiàn)快速高效的代碼分析,提高代碼分析的準確性和代碼分析效率。
本發(fā)明提出的一種基于分析目標驅(qū)動的代碼分析方法,所述方法包括以下步驟:
S1、獲取待分析代碼;
S2、根據(jù)預設(shè)的代碼分析目標,在所述待分析代碼中尋找符合代碼分析目標的數(shù)據(jù)通道;
S3、對所述數(shù)據(jù)通道所在的方法代碼進行代碼分析,得到流出所述數(shù)據(jù)通道所在的方法代碼的目標數(shù)據(jù);
S4、檢測所述目標數(shù)據(jù)中是否包含不定數(shù)據(jù);若所述目標數(shù)據(jù)中包含不定數(shù)據(jù),執(zhí)行S5;若所述目標數(shù)據(jù)中不包含不定數(shù)據(jù),則執(zhí)行S6;
S5、對所述不定數(shù)據(jù)所在的方法代碼進行代碼分析,將流出所述不定數(shù)據(jù)所在的方法代碼的數(shù)據(jù)替代所述目標數(shù)據(jù)中不定數(shù)據(jù)后,執(zhí)行S4;
S6、輸出所述目標數(shù)據(jù)。
其中,在S2中,所述數(shù)據(jù)通道為數(shù)據(jù)在程序內(nèi)部傳遞的通道。
其中,在S3中,對所述數(shù)據(jù)通道所在的方法代碼進行代碼分析時,通過數(shù)據(jù)流分析技術(shù)對所述數(shù)據(jù)通道所在的方法代碼進行分析;
和/或,對所述數(shù)據(jù)通道所在的方法代碼進行代碼分析時,通過控制流分析技術(shù)對所述數(shù)據(jù)通道所在的方法代碼進行分析。
其中,在S4中,所述不定數(shù)據(jù)為所述目標數(shù)據(jù)流出的數(shù)據(jù)通道的子數(shù)據(jù)通道。
一種基于分析目標驅(qū)動的代碼分析系統(tǒng),所述系統(tǒng)包括:
獲取模塊,用于獲取待分析代碼;
搜索模塊,用于根據(jù)預設(shè)的代碼分析目標,在所述待分析代碼中搜索符合代碼分析目標的數(shù)據(jù)通道;
分析模塊,用于對所述符合代碼分析目標的數(shù)據(jù)通道所在的方法代碼進行代碼分析,得到流出所述數(shù)據(jù)通道所在的方法代碼的目標數(shù)據(jù),將所述目標數(shù)據(jù)發(fā)送給檢測模塊;
檢測模塊,用于接收并檢測分析模塊得到的目標數(shù)據(jù)或重分析模塊得到的目標數(shù)據(jù)中是否包含不定數(shù)據(jù);若所述目標數(shù)據(jù)中包含不定數(shù)據(jù),將目標數(shù)據(jù)發(fā)送給重分析模塊;若所述目標數(shù)據(jù)中不包含不定數(shù)據(jù),將目標數(shù)據(jù)發(fā)送輸出模塊;
重分析模塊,用于接收檢測模塊發(fā)送的目標數(shù)據(jù),對所述目標數(shù)據(jù)中不定數(shù)據(jù)所在的方法代碼進行代碼分析,將流出所述不定數(shù)據(jù)所在的方法代碼的數(shù)據(jù)替代所述目標數(shù)據(jù)中不定數(shù)據(jù)后,將所述目標數(shù)據(jù)發(fā)送給檢測模塊;
輸出模塊,用于接收檢測模塊發(fā)送的目標數(shù)據(jù)并輸出。
其中,所述搜索模塊,具體用于:所述數(shù)據(jù)通道為數(shù)據(jù)在程序內(nèi)部傳遞的通道。
其中,所述分析模塊具體用于:通過數(shù)據(jù)流分析技術(shù)對所述數(shù)據(jù)通道所在的方法代碼進行分析;
和/或,所述分析模塊具體用于:通過控制流分析技術(shù)對所述數(shù)據(jù)通道所在的方法代碼進行分析。
其中,所述重分析模塊,具體用于:所述不定數(shù)據(jù)為所述目標數(shù)據(jù)流出的數(shù)據(jù)通道的子數(shù)據(jù)通道。
本發(fā)明中,基于代碼分析的目標,在有明確的目標下啟動對代碼進行分析,在代碼分析過程中,根據(jù)代碼分析的目標做針對性的數(shù)據(jù)流信息收集和分析,提高代碼分析的準確性;同時,在代碼分析過程中,只針對特定目標代碼以及相關(guān)的數(shù)據(jù)流進行代碼分析實現(xiàn)快速高效的代碼分析,節(jié)省了無關(guān)代碼分析的時間耗費,提高代碼分析效率。
附圖說明
圖1是本發(fā)明提出的一種基于分析目標驅(qū)動的代碼分析方法的流程圖。
圖2是本發(fā)明提出的一種基于分析目標驅(qū)動的代碼分析系統(tǒng)的結(jié)構(gòu)圖。
具體實施方式
如圖1所示,圖1為本發(fā)明提出的一種基于分析目標驅(qū)動的代碼分析方法的流程圖;
參照圖1,本發(fā)明提出的一種基于分析目標驅(qū)動的代碼分析方法,所述方法包括以下步驟:
步驟S1,獲取待分析代碼;
在本發(fā)明實施例中,待分析代碼支持各種不同的語言,比如:Java、C、C++等;同時支持不同的形式,比如:源代碼、字節(jié)碼、二進制可執(zhí)行代碼等。
步驟S2,根據(jù)預設(shè)的代碼分析目標,在所述待分析代碼中尋找符合代碼分析目標的數(shù)據(jù)通道。
在本發(fā)明實施例中,預設(shè)的代碼分析目標,就是代碼分析的具體目的,數(shù)據(jù)離開程序的出口;比如:如果要分析代碼中的SQL注入漏洞,那么需要關(guān)注的代碼分析目標就是所有類似java.sql.Statement.execute(String sql)這樣的方法的sql參數(shù),凡是最終流向相關(guān)參數(shù)的數(shù)據(jù)值,都會作為SQL語句來執(zhí)行,從而有引起SQL注入問題的可能性。
在本發(fā)明實施例中,所述數(shù)據(jù)通道為數(shù)據(jù)在程序內(nèi)部傳遞的通道;具體地,方法的輸入?yún)?shù),就是最常見的數(shù)據(jù)通道;方法的返回值,也是一種數(shù)據(jù)通道;本發(fā)明實施例中,所述不定數(shù)據(jù)和所述數(shù)據(jù)通道,是同一個概念從不同角度的稱呼,從方法內(nèi)部使用數(shù)據(jù)的角度而言,方法的輸入?yún)?shù)是個不定數(shù)據(jù),它的值或者來源,都還不可知;而從方法調(diào)用者和被調(diào)用者二者之間的數(shù)據(jù)傳遞角度而言,方法的參數(shù)就是傳遞數(shù)據(jù)的一個數(shù)據(jù)通道。
步驟S3,對所述數(shù)據(jù)通道所在的方法代碼進行代碼分析,得到流出所述數(shù)據(jù)通道所在的方法代碼的目標數(shù)據(jù);具體地,當前數(shù)據(jù)通道所在的方法代碼包含了方法的調(diào)用,所以在代碼分析當前數(shù)據(jù)通道所在的方法代碼方法的過程中,會揭示可能流向代碼分析目標或數(shù)據(jù)通道的值。
在本步驟中,對所述數(shù)據(jù)通道所在的方法代碼進行代碼分析時,通過數(shù)據(jù)流分析技術(shù)對所述數(shù)據(jù)通道所在的方法代碼進行分析,和/或,對所述數(shù)據(jù)通道所在的方法代碼進行代碼分析時,通過控制流分析技術(shù)對所述數(shù)據(jù)通道所在的方法代碼進行分析。
其中,數(shù)據(jù)流分析技術(shù)是一項代碼分析技術(shù),它能從程序代碼中收集程序的語義信息,并通過代數(shù)的方法在編譯時確定變量的定義和使用,通過數(shù)據(jù)流分析,可以不必實際運行程序就能夠發(fā)現(xiàn)程序運行時的行為,這樣可以幫助大家理解程序。
其中,控制流分析技術(shù)就是用來獲取程序控制結(jié)構(gòu)信息的形式化分析方法,它是數(shù)據(jù)流分析,依賴分析的基礎(chǔ),優(yōu)化需要從程序中獲得足夠多的信息。
步驟S4,檢測所述目標數(shù)據(jù)中是否包含不定數(shù)據(jù);若所述目標數(shù)據(jù)中包含不定數(shù)據(jù),執(zhí)行S5;若所述目標數(shù)據(jù)中不包含不定數(shù)據(jù),則執(zhí)行S6;
具體地,代碼分析的目標數(shù)據(jù)可能是確定數(shù)據(jù)或不定數(shù)據(jù),本發(fā)明實施例中,所述確定數(shù)據(jù)包括具體數(shù)據(jù)和未知來源數(shù)據(jù),本發(fā)明實施例中的收集和分析的目標數(shù)據(jù)是確定數(shù)據(jù);所述不定數(shù)據(jù)和所述數(shù)據(jù)通道,是同一個概念從不同角度的稱呼,從方法內(nèi)部使用數(shù)據(jù)的角度而言,方法的輸入?yún)?shù)是個不定數(shù)據(jù),它的值或者來源,都還不可知;而從方法調(diào)用者和被調(diào)用者二者之間的數(shù)據(jù)傳遞角度而言,方法的參數(shù)就是傳遞數(shù)據(jù)的一個數(shù)據(jù)通道。
步驟S5,對所述不定數(shù)據(jù)所在的方法代碼進行代碼分析,將流出所述不定數(shù)據(jù)所在的方法代碼的數(shù)據(jù)替代所述目標數(shù)據(jù)中不定數(shù)據(jù)后,執(zhí)行S4;
具體地,因為目標數(shù)據(jù)中包含了不定數(shù)據(jù),也就是目標數(shù)據(jù)中還有數(shù)據(jù)通道,還有方法的調(diào)用,于是,需要對不定數(shù)據(jù)進行數(shù)據(jù)分析,得到流出不定數(shù)據(jù)對應(yīng)數(shù)據(jù)通的數(shù)據(jù)來替代不定數(shù)據(jù),進一步,在流出不定數(shù)據(jù)對應(yīng)數(shù)據(jù)通道的數(shù)據(jù)中也可能依然有不定數(shù)據(jù),所以對替代不定數(shù)據(jù)后的目標數(shù)據(jù)重新檢測是否包含不定數(shù)據(jù),重復執(zhí)行S4、S5,直到所述目標數(shù)據(jù)中不包含不定數(shù)據(jù),所有數(shù)據(jù)均為確定數(shù)據(jù),執(zhí)行S6;
具體地,一個完整的數(shù)據(jù)流,從數(shù)據(jù)分析開始,往往經(jīng)過多個數(shù)據(jù)通道,多層方法調(diào)用,最后才能得到目標數(shù)據(jù),所以步驟S4、S5這里的一個小循環(huán),可能會執(zhí)行多次,把上不定數(shù)據(jù)待碼分析所得到的值,逐步往目標數(shù)據(jù)中不定數(shù)據(jù)中帶,最終確定目標數(shù)據(jù)無不定數(shù)據(jù),每次小循環(huán),會把不定數(shù)據(jù)替代一層,所以循環(huán)次數(shù)是有限的,一定會終結(jié)。
步驟S6,輸出所述目標數(shù)據(jù);
具體地,根據(jù)代碼分析目標,可以得到代碼分析所關(guān)心的目標數(shù)據(jù),將得到的目標數(shù)據(jù)進行輸出、收集和分析。
如圖2所示,圖2為本發(fā)明提出的一種基于分析目標驅(qū)動的代碼分析系統(tǒng)的結(jié)構(gòu)圖;
參照圖2,本發(fā)明提出的一種基于分析目標驅(qū)動的代碼分析系統(tǒng),所述系統(tǒng)包括:
獲取模塊201,用于獲取待分析代碼;
在本發(fā)明實施例中,待分析代碼支持各種不同的語言,比如:Java、C、C++等;同時支持不同的形式,比如:源代碼、字節(jié)碼、二進制可執(zhí)行代碼等。
搜索模塊202,與獲取模塊201連接,用于根據(jù)預設(shè)的代碼分析目標,在所述待分析代碼中搜索符合代碼分析目標的數(shù)據(jù)通道;
在本發(fā)明實施例中,搜索模塊具體用于:預設(shè)的代碼分析目標,就是代碼分析的具體目的,數(shù)據(jù)離開程序的出口;比如:如果要分析代碼中的SQL注入漏洞,那么需要關(guān)注的代碼分析目標就是所有類似java.sql.Statement.execute(String sql)這樣的方法的sql參數(shù),凡是最終流向相關(guān)參數(shù)的數(shù)據(jù)值,都會作為SQL語句來執(zhí)行,從而有引起SQL注入問題的可能性。
在本發(fā)明實施例中,搜索模塊具體用于:所述數(shù)據(jù)通道為數(shù)據(jù)在程序內(nèi)部傳遞的通道;具體地,方法的輸入?yún)?shù),就是最常見的數(shù)據(jù)通道;方法的返回值,也是一種數(shù)據(jù)通道;本發(fā)明實施例中,所述不定數(shù)據(jù)和所述數(shù)據(jù)通道,是同一個概念從不同角度的稱呼,從方法內(nèi)部使用數(shù)據(jù)的角度而言,方法的輸入?yún)?shù)是個不定數(shù)據(jù),它的值或者來源,都還不可知;而從方法調(diào)用者和被調(diào)用者二者之間的數(shù)據(jù)傳遞角度而言,方法的參數(shù)就是傳遞數(shù)據(jù)的一個數(shù)據(jù)通道。
分析模塊203,與搜索模塊202和檢測模塊204連接,用于對所述符合代碼分析目標的數(shù)據(jù)通道所在的方法代碼進行代碼分析,得到流出所述數(shù)據(jù)通道所在的方法代碼的目標數(shù)據(jù),將所述目標數(shù)據(jù)發(fā)送給檢測模塊;具體地,當前數(shù)據(jù)通道所在的方法代碼包含了方法的調(diào)用,所以在代碼分析數(shù)據(jù)通道所在的方法代碼的過程中,會揭示可能流向代碼分析目標或數(shù)據(jù)通道的值。
具體的,所述分析模塊具體用于:通過數(shù)據(jù)流分析技術(shù)對所述數(shù)據(jù)通道所在的方法代碼進行分析;
和/或,所述分析模塊具體用于:通過控制流分析技術(shù)對所述數(shù)據(jù)通道所在的方法代碼進行分析。
其中,數(shù)據(jù)流分析技術(shù)是一項代碼分析技術(shù),它能從程序代碼中收集程序的語義信息,并通過代數(shù)的方法在編譯時確定變量的定義和使用,通過數(shù)據(jù)流分析,可以不必實際運行程序就能夠發(fā)現(xiàn)程序運行時的行為,這樣可以幫助大家理解程序。
其中,控制流分析技術(shù)就是用來獲取程序控制結(jié)構(gòu)信息的形式化分析方法,它是數(shù)據(jù)流分析,依賴分析的基礎(chǔ),優(yōu)化需要從程序中獲得足夠多的信息。
檢測模塊204,分別與分析模塊203、重分析模塊205、輸出模塊206連接,用于接收并檢測分析模塊得到的目標數(shù)據(jù)或重分析模塊得到的目標數(shù)據(jù)中是否包含不定數(shù)據(jù);若所述目標數(shù)據(jù)中包含不定數(shù)據(jù),將目標數(shù)據(jù)發(fā)送給重分析模塊;若所述目標數(shù)據(jù)中不包含不定數(shù)據(jù),將目標數(shù)據(jù)發(fā)送輸出模塊;
具體地,檢測模塊用于:代碼分析的目標數(shù)據(jù)可能是確定數(shù)據(jù)或不定數(shù)據(jù),本發(fā)明實施例中,所述確定數(shù)據(jù)包括具體數(shù)據(jù)和未知來源數(shù)據(jù),本發(fā)明實施例中的收集和分析的目標數(shù)據(jù)是確定數(shù)據(jù);所述不定數(shù)據(jù)和所述數(shù)據(jù)通道,是同一個概念從不同角度的稱呼,從方法內(nèi)部使用數(shù)據(jù)的角度而言,方法的輸入?yún)?shù)是個不定數(shù)據(jù),它的值或者來源,都還不可知;而從方法調(diào)用者和被調(diào)用者二者之間的數(shù)據(jù)傳遞角度而言,方法的參數(shù)就是傳遞數(shù)據(jù)的一個數(shù)據(jù)通道。
重分析模塊205,與檢測模塊204連接,用于接收檢測模塊發(fā)送的目標數(shù)據(jù),對所述目標數(shù)據(jù)中不定數(shù)據(jù)所在的方法代碼進行代碼分析,將流出所述不定數(shù)據(jù)所在的方法代碼的數(shù)據(jù)替代所述目標數(shù)據(jù)中不定數(shù)據(jù)后,將所述目標數(shù)據(jù)發(fā)送給檢測模塊;
具體地,重分析模塊用于:因為目標數(shù)據(jù)中包含了不定數(shù)據(jù),也就是目標數(shù)據(jù)中還有數(shù)據(jù)通道,還有方法的調(diào)用,于是,需要對不定數(shù)據(jù)進行數(shù)據(jù)分析,得到流出不定數(shù)據(jù)對應(yīng)數(shù)據(jù)通的數(shù)據(jù)來替代不定數(shù)據(jù),進一步,在流出不定數(shù)據(jù)對應(yīng)數(shù)據(jù)通道的數(shù)據(jù)中也可能依然有不定數(shù)據(jù),所以對替代不定數(shù)據(jù)后的目標數(shù)據(jù)重新檢測是否包含不定數(shù)據(jù),目標數(shù)據(jù)會在重分析模塊和檢測模塊中來回傳送,直到所述目標數(shù)據(jù)中不包含不定數(shù)據(jù),所有數(shù)據(jù)均為確定數(shù)據(jù),將目標數(shù)據(jù)發(fā)送給輸出模塊;
具體地,一個完整的數(shù)據(jù)流,從數(shù)據(jù)分析開始,往往經(jīng)過多個數(shù)據(jù)通道,多層方法調(diào)用,最后才能得到目標數(shù)據(jù),所以步驟S4、S5這里的一個小循環(huán),可能會執(zhí)行多次,把上不定數(shù)據(jù)待碼分析所得到的值,逐步往目標數(shù)據(jù)中不定數(shù)據(jù)中帶,最終確定目標數(shù)據(jù)無不定數(shù)據(jù),每次小循環(huán),會把不定數(shù)據(jù)替代一層,所以循環(huán)次數(shù)是有限的,一定會終結(jié)。
輸出模塊206,與檢測模塊204連接,用于接收檢測模塊發(fā)送的目標數(shù)據(jù)并輸出。
舉例:如果以SQL注入漏洞分析為例,那么需要關(guān)注的代碼分析目標就是所有類似java.sql.Statement.execute(String sql)這樣的方法的sql參數(shù),凡是最終流向相關(guān)參數(shù)的數(shù)據(jù)值,都會作為SQL語句來執(zhí)行,從而有引起SQL注入問題的可能性,等所有代碼都分析完,那么流向所有代碼分析目標的所有可能的值都將已經(jīng)存儲并輸出,代碼分析完成,意味著所有的SQL查詢的SQL值都已經(jīng)確定,每個含有被污染的數(shù)據(jù)的SQL值,都對應(yīng)著潛在的SQL注入漏洞,其中本實例中,被污染的數(shù)據(jù)指的是系統(tǒng)外部來的數(shù)據(jù),比如從網(wǎng)絡(luò)連接讀取的數(shù)據(jù),從DB讀取的數(shù)據(jù)等,對于當前的代碼分析而言,外部來的數(shù)據(jù)都是不可信的,或者說被污染的。
通過本發(fā)明的技術(shù)方案,基于代碼分析的目標,在有明確的目標下啟動對代碼進行分析,在代碼分析過程中,根據(jù)代碼分析的目標做針對性的數(shù)據(jù)流信息收集和分析,提高代碼分析的準確性,同時只針對特定目標代碼以及相關(guān)的數(shù)據(jù)流進行代碼分析實現(xiàn)快速高效的代碼分析,提高代碼分析效率。
以上所述,僅為本發(fā)明較佳的具體實施方式,但本發(fā)明的保護范圍并不局限于此,任何熟悉本技術(shù)領(lǐng)域的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),根據(jù)本發(fā)明的技術(shù)方案及其發(fā)明構(gòu)思加以等同替換或改變,都應(yīng)涵蓋在本發(fā)明的保護范圍之內(nèi)。