本發(fā)明涉及計(jì)算機(jī)領(lǐng)域,特別是涉及一種應(yīng)用程序安裝包的漏洞檢測(cè)方法和裝置。
背景技術(shù):
隨著智能終端技術(shù)的發(fā)展,應(yīng)用程序(Application,App)使用越來(lái)越普遍,Android系統(tǒng)、iOS系統(tǒng)甚至Windows系統(tǒng)中都可以安裝App。為了提高系統(tǒng)安全性,在向系統(tǒng)中安裝App之前,需要對(duì)App安裝包進(jìn)行漏洞檢測(cè),以降低系統(tǒng)出現(xiàn)由于安裝App導(dǎo)致被開(kāi)了“后門(mén)”,植入木馬的情況。
由于無(wú)法直接對(duì)App安裝包進(jìn)行漏洞檢測(cè),一般需要先將App安裝包反編譯成一種通用中間語(yǔ)言(Common Intermediate Language,CIL),然后對(duì)其中可能具有漏洞的函數(shù)進(jìn)行漏洞分析,以此實(shí)現(xiàn)漏洞檢測(cè)。
然而,如果一個(gè)漏洞需要多個(gè)函數(shù)共同參與才能造成,例如函數(shù)x需要通過(guò)函數(shù)y對(duì)其賦值后才能造成漏洞出現(xiàn)的情況,使用現(xiàn)有技術(shù)的漏洞檢測(cè)方法無(wú)法檢測(cè)出這種漏洞的存在,導(dǎo)致安裝App為系統(tǒng)帶來(lái)的安全隱患。
技術(shù)實(shí)現(xiàn)要素:
為了解決上述技術(shù)問(wèn)題,本發(fā)明提供了一種應(yīng)用程序安裝包的漏洞檢測(cè)方法和裝置,在待檢測(cè)函數(shù)未發(fā)現(xiàn)漏洞時(shí),繼續(xù)檢測(cè)根據(jù)CFG中函數(shù)之間的調(diào)用關(guān)系確定與所述漏洞形成相關(guān)且調(diào)用順序在調(diào)用所述待檢測(cè)函數(shù)之前的第一函數(shù),以此可以檢測(cè)出需要多個(gè)函數(shù)共同參與才能造成的漏洞,提高了安全性
本發(fā)明實(shí)施例公開(kāi)了如下技術(shù)方案:
一種應(yīng)用程序安裝包的漏洞檢測(cè)方法,所述方法包括:
獲取待檢測(cè)安裝包的通用中間語(yǔ)言CIL,所述CIL包括多個(gè)函數(shù);
對(duì)所述CIL進(jìn)行控制流圖CFG分析,得到所述CIL的CFG,所述CFG包括所述CIL中所述多個(gè)函數(shù)之間的調(diào)用關(guān)系和調(diào)用順序;
通過(guò)預(yù)設(shè)條件分析所述CIL,確定漏洞入口點(diǎn)語(yǔ)句以及包含所述漏洞入口點(diǎn)語(yǔ)句的待檢測(cè)函數(shù),所述漏洞入口點(diǎn)語(yǔ)句為具有漏洞形成條件的語(yǔ)句;
當(dāng)對(duì)所述待檢測(cè)函數(shù)進(jìn)行漏洞檢測(cè)未發(fā)現(xiàn)漏洞,根據(jù)所述CFG中的所述調(diào)用關(guān)系確定與所述漏洞形成相關(guān)且調(diào)用順序在調(diào)用所述待檢測(cè)函數(shù)之前的第一函數(shù),所述第一函數(shù)與所述待檢測(cè)函數(shù)具有直接調(diào)用關(guān)系;
結(jié)合所述待檢測(cè)函數(shù)對(duì)所述第一函數(shù)進(jìn)行漏洞檢測(cè)。
可選的,當(dāng)結(jié)合所述待檢測(cè)函數(shù)對(duì)所述第一函數(shù)進(jìn)行漏洞檢測(cè)未發(fā)現(xiàn)漏洞,還包括:
對(duì)與所述漏洞形成相關(guān)的函數(shù)進(jìn)行回溯遞歸查找,并進(jìn)行漏洞檢測(cè),直到發(fā)現(xiàn)漏洞或遍歷完根據(jù)所述CFG中所述調(diào)用關(guān)系確定的與所述漏洞形成相關(guān)的函數(shù);
其中,對(duì)與所述漏洞形成相關(guān)的函數(shù)進(jìn)行回溯遞歸查找,并進(jìn)行漏洞檢測(cè)具體包括:
結(jié)合所述待檢測(cè)函數(shù)、所述第一函數(shù)以及與所述漏洞形成相關(guān)的,調(diào)用順序在調(diào)用所述第一函數(shù)之前,調(diào)用所述第二函數(shù)之后的函數(shù),對(duì)所述第二函數(shù)進(jìn)行漏洞檢測(cè),所述第二函數(shù)與所述漏洞形成相關(guān),與所述第一函數(shù)具有直接或間接的調(diào)用關(guān)系,調(diào)用順序在調(diào)用所述第一函數(shù)之后;
若未發(fā)現(xiàn)漏洞,根據(jù)所述CFG中的所述調(diào)用關(guān)系確定與所述漏洞形成相關(guān)且調(diào)用順序在調(diào)用所述第二函數(shù)之前的第三函數(shù),所述第三函數(shù)與所述第二函數(shù)具有直接調(diào)用關(guān)系;
結(jié)合所述待檢測(cè)函數(shù)、所述第一函數(shù)、與所述漏洞形成相關(guān)的,調(diào)用順序在調(diào)用所述第一函數(shù)之前,調(diào)用所述第二函數(shù)之后的函數(shù)以及所述第二函數(shù),對(duì)所述第三函數(shù)進(jìn)行漏洞檢測(cè)。
可選的,
若所述對(duì)與所述漏洞形成相關(guān)的函數(shù)進(jìn)行回溯遞歸查找,并進(jìn)行漏洞檢測(cè),遍歷完根據(jù)所述CFG中所述調(diào)用關(guān)系確定的與所述漏洞形成相關(guān)的函數(shù),未發(fā)現(xiàn)漏洞,則判斷所述待檢測(cè)安裝包沒(méi)有漏洞。
可選的,
所述CIL具體為編譯器Smali語(yǔ)言。
可選的,
所述待檢測(cè)安裝包為應(yīng)用于安卓Android系統(tǒng)中的安裝包。
一種應(yīng)用程序安裝包的漏洞檢測(cè)裝置,包括:
獲取單元,用于獲取待檢測(cè)安裝包的通用中間語(yǔ)言CIL,所述CIL包括多個(gè)函數(shù);
分析單元,用于對(duì)所述CIL進(jìn)行控制流圖CFG分析,得到所述CIL的CFG,所述CFG包括所述CIL中所述多個(gè)函數(shù)之間的調(diào)用關(guān)系和調(diào)用順序;
第一確定單元,用于通過(guò)預(yù)設(shè)條件分析所述CIL,確定漏洞入口點(diǎn)語(yǔ)句以及包含所述漏洞入口點(diǎn)語(yǔ)句的待檢測(cè)函數(shù),所述漏洞入口點(diǎn)語(yǔ)句為具有漏洞形成條件的語(yǔ)句;
第二確定單元,用于當(dāng)對(duì)所述待檢測(cè)函數(shù)進(jìn)行漏洞檢測(cè)未發(fā)現(xiàn)漏洞,根據(jù)所述CFG中的所述調(diào)用關(guān)系確定與所述漏洞形成相關(guān)且調(diào)用順序在調(diào)用所述待檢測(cè)函數(shù)之前的第一函數(shù),所述第一函數(shù)與所述待檢測(cè)函數(shù)具有直接調(diào)用關(guān)系;
第一檢測(cè)單元,用于結(jié)合所述待檢測(cè)函數(shù)對(duì)所述第一函數(shù)進(jìn)行漏洞檢測(cè)。
可選的,還包括:
第二檢測(cè)單元,用于當(dāng)所述第一檢測(cè)單元未發(fā)現(xiàn)漏洞,對(duì)與所述漏洞形成相關(guān)的函數(shù)進(jìn)行回溯遞歸查找,并進(jìn)行漏洞檢測(cè),直到發(fā)現(xiàn)漏洞或遍歷完根據(jù)所述CFG中所述調(diào)用關(guān)系確定的與所述漏洞形成相關(guān)的函數(shù);
其中,所述第二檢測(cè)單元對(duì)與所述漏洞形成相關(guān)的函數(shù)進(jìn)行回溯遞歸查找,并進(jìn)行漏洞檢測(cè),具體包括結(jié)合所述待檢測(cè)函數(shù)、所述第一函數(shù)以及與所述漏洞形成相關(guān)的,調(diào)用順序在調(diào)用所述第一函數(shù)之前,調(diào)用所述第二函數(shù)之后的函數(shù),對(duì)所述第二函數(shù)進(jìn)行漏洞檢測(cè),所述第二函數(shù)與所述漏洞形成相關(guān),與所述第一函數(shù)具有直接或間接的調(diào)用關(guān)系,調(diào)用順序在調(diào)用所述第一函數(shù)之后;若未發(fā)現(xiàn)漏洞,根據(jù)所述CFG中的所述調(diào)用關(guān)系確定與所述漏洞形成相關(guān)且調(diào)用順序在調(diào)用所述第二函數(shù)之前的第三函數(shù),所述第三函數(shù)與所述第二函數(shù)具有直接調(diào)用關(guān)系;結(jié)合所述待檢測(cè)函數(shù)、所述第一函數(shù)、與所述漏洞形成相關(guān)的,調(diào)用順序在調(diào)用所述第一函數(shù)之前,調(diào)用所述第二函數(shù)之后的函數(shù)以及所述第二函數(shù),對(duì)所述第三函數(shù)進(jìn)行漏洞檢測(cè)。
可選的,
若所述第二檢測(cè)單元未發(fā)現(xiàn)漏洞,則判斷所述待檢測(cè)安裝包沒(méi)有漏洞。
可選的,
所述CIL具體為編譯器Smali語(yǔ)言。
可選的,
所述待檢測(cè)安裝包為應(yīng)用于安卓Android系統(tǒng)中的安裝包。
由上述技術(shù)方案可以看出,當(dāng)通過(guò)檢測(cè)具有出現(xiàn)漏洞可能性的待檢測(cè)函數(shù)未檢測(cè)出漏洞時(shí),可以根據(jù)通過(guò)對(duì)CIL分析得到對(duì)應(yīng)的CFG,通過(guò)所述調(diào)用關(guān)系確定與所述漏洞形成相關(guān)且調(diào)用順序在調(diào)用所述待檢測(cè)函數(shù)之前的第一函數(shù),并結(jié)合所述待檢測(cè)函數(shù)對(duì)所述第一函數(shù)進(jìn)行漏洞檢測(cè),由此可以檢測(cè)出需要多個(gè)函數(shù)共同參與才能造成的漏洞,提高了確定漏洞的準(zhǔn)確性,降低了通過(guò)安裝包安裝App為系統(tǒng)帶來(lái)的安全隱患的可能。
附圖說(shuō)明
為了更清楚地說(shuō)明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見(jiàn)地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)性的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1為本發(fā)明實(shí)施例提供的一種應(yīng)用程序安裝包的漏洞檢測(cè)方法的方法流程圖;
圖2為本發(fā)明實(shí)施例提供的一種應(yīng)用程序安裝包的CIL的CFG結(jié)構(gòu)示意圖;
圖3為本發(fā)明實(shí)施例提供的一種應(yīng)用程序安裝包的漏洞檢測(cè)裝置的裝置結(jié)構(gòu)圖;
圖4為本發(fā)明實(shí)施例提供的一種應(yīng)用程序安裝包的漏洞檢測(cè)裝置的裝置結(jié)構(gòu)圖。
具體實(shí)施方式
對(duì)App安裝包的漏洞檢測(cè)的現(xiàn)有技術(shù)中,針對(duì)反編譯出來(lái)的CIL,只會(huì) 單獨(dú)檢測(cè)可能出現(xiàn)漏洞的函數(shù),并不會(huì)考慮到需要通過(guò)函數(shù)之間的調(diào)用、賦值等交互情況才能產(chǎn)生的漏洞,這將直接影響到漏洞檢測(cè)的精確程度,使得App安裝包中需要通過(guò)多個(gè)函數(shù)共同參與才能造成的漏洞無(wú)法被現(xiàn)有技術(shù)檢測(cè)出來(lái)。如果系統(tǒng)安裝了這種通過(guò)現(xiàn)有技術(shù)漏洞檢測(cè)為“安全”的App安裝包,系統(tǒng)將不可避免的出現(xiàn)漏洞,給黑客提供了可乘之機(jī),降低了系統(tǒng)安全性,可能會(huì)對(duì)使用者造成不可估量的損失。
為此,本發(fā)明實(shí)施例提供了一種應(yīng)用程序安裝包的漏洞檢測(cè)方法和裝置,當(dāng)通過(guò)檢測(cè)具有出現(xiàn)漏洞可能性的待檢測(cè)函數(shù)未檢測(cè)出漏洞時(shí),可以根據(jù)通過(guò)對(duì)CIL分析得到對(duì)應(yīng)的控制流圖(Control flow graph,CFG),通過(guò)所述調(diào)用關(guān)系確定與所述漏洞形成相關(guān)且調(diào)用順序在調(diào)用所述待檢測(cè)函數(shù)之前的第一函數(shù),并結(jié)合所述待檢測(cè)函數(shù)對(duì)所述第一函數(shù)進(jìn)行漏洞檢測(cè),由此可以提高檢測(cè)出需要多個(gè)函數(shù)共同參與才能造成的漏洞的可能性,提高了發(fā)現(xiàn)漏洞的準(zhǔn)確性,降低了通過(guò)安裝包安裝App為系統(tǒng)帶來(lái)的安全隱患的可能。
并且,當(dāng)通過(guò)檢測(cè)所述第一函數(shù)還不能檢測(cè)出漏洞時(shí),將根據(jù)所述CFG中的調(diào)用關(guān)系和調(diào)用順序,對(duì)與所述漏洞形成相關(guān)的函數(shù)進(jìn)行回溯遞歸查找,直到發(fā)現(xiàn)漏洞或者漏洞查找的函數(shù)為入度函數(shù)為止,入度函數(shù)可以理解為與入度函數(shù)具有調(diào)用關(guān)系的函數(shù)的調(diào)用順序均在調(diào)用所述入度函數(shù)之后。這樣的查找方式可以更加徹底的檢測(cè)出需要多個(gè)函數(shù)共同參與才能造成的漏洞,進(jìn)一步提高了發(fā)現(xiàn)漏洞的準(zhǔn)確性。
為使本發(fā)明實(shí)施例的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚地描述,顯然,所描述的實(shí)施例是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒(méi)有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
實(shí)施例一
圖1為本發(fā)明實(shí)施例提供的一種應(yīng)用程序安裝包的漏洞檢測(cè)方法的方法流程圖,所述方法包括:
S101:獲取待檢測(cè)安裝包的CIL,所述CIL包括多個(gè)函數(shù)。
舉例說(shuō)明。App安裝包可以為不同的文件格式,可以由不同的編譯語(yǔ)言 生成??蛇x的,所述待檢測(cè)安裝包為應(yīng)用于安卓Android系統(tǒng)中的安裝包,也就是安卓安裝包(Android Package,APK)的格式。也可以是其他格式例如可執(zhí)行文件格式等。一般情況下無(wú)法直接獲取App安裝包中的內(nèi)容,故需要對(duì)App安裝包進(jìn)行反編譯得到對(duì)應(yīng)的CIL后,才具有漏洞檢測(cè)的條件。CIL有多種形式,本發(fā)明對(duì)CIL的形式不進(jìn)行限定,不過(guò),可選的,所述CIL具體可以為編譯器(Smali)語(yǔ)言。在本發(fā)明實(shí)施例中,反編譯得到的CIL中至少包括兩個(gè)具有調(diào)用關(guān)系的函數(shù)。
S102:對(duì)所述CIL進(jìn)行CFG分析,得到所述CIL的CFG,所述CFG包括所述CIL中所述多個(gè)函數(shù)之間的調(diào)用關(guān)系和調(diào)用順序。
舉例說(shuō)明,通過(guò)附圖對(duì)CIL的CFG的結(jié)構(gòu)進(jìn)行解釋說(shuō)明,圖2為本發(fā)明實(shí)施例提供的一種應(yīng)用程序安裝包的CIL的CFG結(jié)構(gòu)示意圖。圖2所示的可以為CIL的全部CFG或一部分CFG,其中函數(shù)之間的調(diào)用關(guān)系和調(diào)用順序僅為了方便舉例說(shuō)明。如圖2所示,CFG中具有八個(gè)函數(shù),分別為函數(shù)0至函數(shù)7,其中箭頭相連的函數(shù)之間均具有調(diào)用關(guān)系,調(diào)用順序如箭頭所示,以圖2中最右邊一路為例,可以為先調(diào)用函數(shù)1,再調(diào)用函數(shù)3,再調(diào)用函數(shù)5,再調(diào)用函數(shù)7的調(diào)用順序。
S103:通過(guò)預(yù)設(shè)條件分析所述CIL,確定漏洞入口點(diǎn)語(yǔ)句以及包含所述漏洞入口點(diǎn)語(yǔ)句的待檢測(cè)函數(shù),所述漏洞入口點(diǎn)語(yǔ)句為具有漏洞形成條件的語(yǔ)句。
舉例說(shuō)明,所述預(yù)設(shè)條件可以為具有成為漏洞可能性的條件或特征,例如所述預(yù)設(shè)條件可以包括在本地保存通用格式的文件等可能會(huì)造成漏洞出現(xiàn)的操作。
需要注意的是,本發(fā)明并不限定S102和S103的執(zhí)行順序。
S104:當(dāng)對(duì)所述待檢測(cè)函數(shù)進(jìn)行漏洞檢測(cè)未發(fā)現(xiàn)漏洞,根據(jù)所述CFG中的所述調(diào)用關(guān)系確定與所述漏洞形成相關(guān)且調(diào)用順序在調(diào)用所述待檢測(cè)函數(shù)之前的第一函數(shù),所述第一函數(shù)與所述待檢測(cè)函數(shù)具有直接調(diào)用關(guān)系。
S105:結(jié)合所述待檢測(cè)函數(shù)對(duì)所述第一函數(shù)進(jìn)行漏洞檢測(cè)。
舉例說(shuō)明,若確定出的一條具有漏洞形成可能的語(yǔ)句A屬于如圖2所示的函數(shù)7中的一條語(yǔ)句,那么所述待檢測(cè)函數(shù)就可以為函數(shù)7。在一些需要多 個(gè)函數(shù)參與才能形成漏洞的情況下,例如語(yǔ)句A中具有變量,語(yǔ)句A具體的結(jié)果需要通過(guò)其他函數(shù)對(duì)所述變量的賦值后才能確定時(shí),那么,直接對(duì)所述待檢測(cè)函數(shù)也就是函數(shù)7進(jìn)行漏洞檢測(cè)將無(wú)法發(fā)現(xiàn)漏洞。
故當(dāng)對(duì)函數(shù)7進(jìn)行漏洞檢測(cè)未發(fā)現(xiàn)漏洞時(shí),需要根據(jù)所述CFG確定出所述第一函數(shù),在圖2所示的CFG結(jié)構(gòu)中,函數(shù)4和函數(shù)5均與函數(shù)7具有調(diào)用關(guān)系,且函數(shù)4和函數(shù)5的調(diào)用順序均在調(diào)用函數(shù)7之前。若函數(shù)4和函數(shù)5均與所述漏洞形成相關(guān),則函數(shù)4和函數(shù)5均可以為所述第一函數(shù)。需要注意的是,所述第一函數(shù)與所述待檢測(cè)函數(shù)具有直接調(diào)用關(guān)系,從圖2所示結(jié)構(gòu)中,假設(shè)函數(shù)3和函數(shù)1與所述漏洞形成相關(guān),而且函數(shù)3和函數(shù)1的調(diào)用順序也顯然是在調(diào)用函數(shù)7(待檢測(cè)函數(shù))之前,但是函數(shù)3與函數(shù)7之間并不具備直接調(diào)用關(guān)系,而是通過(guò)函數(shù)5的一種間接調(diào)用關(guān)系,故在函數(shù)7為所述待檢測(cè)函數(shù)的情況下,函數(shù)3并不能作為所述第一函數(shù)。同理函數(shù)1也不能作為所述第一函數(shù)。而只有與函數(shù)7具有直接調(diào)用關(guān)系的函數(shù)4和函數(shù)5可以作為所述第一函數(shù)。
可以結(jié)合函數(shù)7(待檢測(cè)函數(shù))對(duì)函數(shù)4(第一函數(shù))進(jìn)行漏洞檢測(cè),以及也可以結(jié)合函數(shù)7(待檢測(cè)函數(shù))對(duì)函數(shù)5(第一函數(shù))進(jìn)行漏洞檢測(cè)。針對(duì)其中包括函數(shù)5的一支來(lái)說(shuō),由于所述漏洞的形成需要多個(gè)函數(shù)參與,也就是說(shuō)至少需要函數(shù)7和函數(shù)5一起參與才可能形成漏洞,通過(guò)考慮函數(shù)5對(duì)函數(shù)7的影響例如對(duì)函數(shù)7中的語(yǔ)句A的賦值的情況,對(duì)函數(shù)5進(jìn)行漏洞檢測(cè)。由此可以有效檢測(cè)出由兩個(gè)函數(shù)共同參與才能形成的漏洞,提高了檢測(cè)漏洞的能力。
由上述實(shí)施例可以看出,當(dāng)通過(guò)檢測(cè)具有出現(xiàn)漏洞可能性的待檢測(cè)函數(shù)未檢測(cè)出漏洞時(shí),可以根據(jù)通過(guò)對(duì)CIL分析得到對(duì)應(yīng)的CFG,通過(guò)所述調(diào)用關(guān)系確定與所述漏洞形成相關(guān)且調(diào)用順序在調(diào)用所述待檢測(cè)函數(shù)之前的第一函數(shù),并結(jié)合所述待檢測(cè)函數(shù)對(duì)所述第一函數(shù)進(jìn)行漏洞檢測(cè),由此可以提高檢測(cè)出需要多個(gè)函數(shù)共同參與才能造成的漏洞的可能性,提高了發(fā)現(xiàn)漏洞的準(zhǔn)確性,降低了通過(guò)安裝包安裝App為系統(tǒng)帶來(lái)的安全隱患的可能。
實(shí)施例二
在需要多個(gè)函數(shù)共同參與才能造成漏洞的情況下,可能會(huì)出現(xiàn)多于兩個(gè)函數(shù)才能造成漏洞的情況。為此,本實(shí)施例將在圖1所對(duì)應(yīng)實(shí)施例的基礎(chǔ)上,進(jìn)一步解決需要多于兩個(gè)函數(shù)共同參與才能造成漏洞的情況。
在執(zhí)行S105中,若結(jié)合所述待檢測(cè)函數(shù)對(duì)所述第一函數(shù)進(jìn)行漏洞檢測(cè)未發(fā)現(xiàn)漏洞,并不能確定不會(huì)出現(xiàn)所述漏洞,還需要根據(jù)所述CFG的所述調(diào)用關(guān)系確定是否有與所述漏洞形成相關(guān),即與所述第一函數(shù)具有調(diào)用關(guān)系,且調(diào)用順序在調(diào)用所述第一函數(shù)之前的函數(shù),若有,對(duì)與所述漏洞形成相關(guān)的函數(shù)進(jìn)行回溯遞歸查找,并進(jìn)行漏洞檢測(cè),直到發(fā)現(xiàn)漏洞或遍歷完根據(jù)所述CFG中所述調(diào)用關(guān)系確定的與所述漏洞形成相關(guān)的函數(shù)。
其中,對(duì)與所述漏洞形成相關(guān)的函數(shù)進(jìn)行回溯遞歸查找,并進(jìn)行漏洞檢測(cè)具體包括:
結(jié)合所述待檢測(cè)函數(shù)、所述第一函數(shù)以及與所述漏洞形成相關(guān)的,調(diào)用順序在調(diào)用所述第一函數(shù)之前,調(diào)用所述第二函數(shù)之后的函數(shù),對(duì)所述第二函數(shù)進(jìn)行漏洞檢測(cè),所述第二函數(shù)與所述漏洞形成相關(guān),與所述第一函數(shù)具有直接或間接的調(diào)用關(guān)系,調(diào)用順序在調(diào)用所述第一函數(shù)之后;
若未發(fā)現(xiàn)漏洞,根據(jù)所述CFG中的所述調(diào)用關(guān)系確定與所述漏洞形成相關(guān)且調(diào)用順序在調(diào)用所述第二函數(shù)之前的第三函數(shù),所述第三函數(shù)與所述第二函數(shù)具有直接調(diào)用關(guān)系;
結(jié)合所述待檢測(cè)函數(shù)、所述第一函數(shù)、與所述漏洞形成相關(guān)的,調(diào)用順序在調(diào)用所述第一函數(shù)之前,調(diào)用所述第二函數(shù)之后的函數(shù)以及所述第二函數(shù),對(duì)所述第三函數(shù)進(jìn)行漏洞檢測(cè)。
舉例說(shuō)明,所述回溯遞歸查找可以理解為根據(jù)調(diào)用關(guān)系以及調(diào)用順序,反向(與調(diào)用順序相反)的一種查找過(guò)程,同時(shí)還需要注意查找到的函數(shù)需要與所述漏洞形成相關(guān)。以圖2為例,函數(shù)7通過(guò)回溯遞歸查找到的函數(shù)可以為函數(shù)4和函數(shù)5,假設(shè)其中只有函數(shù)5與所述漏洞形成相關(guān),那么通過(guò)對(duì)與所述漏洞形成相關(guān)的函數(shù)進(jìn)行回溯遞歸查找只能查找到函數(shù)5,進(jìn)一步查找到函數(shù)5的上一級(jí)函數(shù):函數(shù)3(假設(shè)函數(shù)3與所述漏洞形成相關(guān)),再進(jìn)一步查找到函數(shù)3的上一級(jí)函數(shù):函數(shù)1(假設(shè)函數(shù)1與所述漏洞形成相關(guān))。這里所說(shuō)的函數(shù)X的上一級(jí)函數(shù)可以理解為與所述漏洞形成相關(guān),調(diào)用順序 在調(diào)用所述函數(shù)X之前,且與所述函數(shù)X具有直接調(diào)用關(guān)系的函數(shù)。
通過(guò)圖2所示的結(jié)構(gòu)圖進(jìn)行舉例說(shuō)明,假設(shè)函數(shù)1、函數(shù)3和函數(shù)5均與所述漏洞形成相關(guān),函數(shù)7為所述待檢測(cè)函數(shù)。在本發(fā)明實(shí)施例中,函數(shù)5可以理解為所述第一函數(shù),若結(jié)合函數(shù)7對(duì)函數(shù)5進(jìn)行漏洞檢測(cè)未發(fā)現(xiàn)漏洞,則對(duì)與所述漏洞形成相關(guān)的函數(shù)進(jìn)行回溯遞歸查找,并進(jìn)行漏洞檢測(cè)的過(guò)程可以為:函數(shù)3可以理解為第二函數(shù),結(jié)合函數(shù)7和函數(shù)5對(duì)函數(shù)3進(jìn)行漏洞檢測(cè),若未發(fā)現(xiàn)漏洞,函數(shù)1可以理解為第三函數(shù),將結(jié)合函數(shù)7、函數(shù)5和函數(shù)3對(duì)函數(shù)1進(jìn)行漏洞分析。若調(diào)用關(guān)系更多,參與的函數(shù)更多,也可以通過(guò)本實(shí)施例中的回溯遞歸的方式依次進(jìn)行漏洞查找,直到發(fā)現(xiàn)漏洞或遍歷完根據(jù)所述CFG中所述調(diào)用關(guān)系確定的與所述漏洞形成相關(guān)的函數(shù),本發(fā)明不再對(duì)具有更多調(diào)用關(guān)系的CFG結(jié)構(gòu)進(jìn)行一一窮舉。
所述遍歷完根據(jù)所述CFG中所述調(diào)用關(guān)系確定的與所述漏洞形成相關(guān)的函數(shù)可以理解為進(jìn)行漏洞檢測(cè)的函數(shù)為入度函數(shù)的情況,所謂入度函數(shù)可以理解為與入度函數(shù)具有調(diào)用關(guān)系的函數(shù)的調(diào)用順序均在調(diào)用所述入度函數(shù)之后,也就是說(shuō)在所處調(diào)用關(guān)系鏈中最先調(diào)用的函數(shù)??蛇x的,若所述對(duì)與所述漏洞形成相關(guān)的函數(shù)進(jìn)行回溯遞歸查找,并進(jìn)行漏洞檢測(cè),遍歷完根據(jù)所述CFG中所述調(diào)用關(guān)系確定的與所述漏洞形成相關(guān)的函數(shù),未發(fā)現(xiàn)漏洞,則判斷所述待檢測(cè)安裝包沒(méi)有漏洞。這種結(jié)束回溯遞歸查找并結(jié)束漏洞檢測(cè)的條件,可以使得在本發(fā)明實(shí)施例中,可以盡可能的查找到由多個(gè)函數(shù)參與形成的漏洞,提高App安裝包的安全性。
通過(guò)本實(shí)施例可以看出,當(dāng)通過(guò)檢測(cè)所述第一函數(shù)還不能檢測(cè)出漏洞時(shí),將根據(jù)所述CFG中的調(diào)用關(guān)系和調(diào)用順序,對(duì)與所述漏洞形成相關(guān)的函數(shù)進(jìn)行回溯遞歸查找,直到發(fā)現(xiàn)漏洞或者漏洞查找的函數(shù)為入度函數(shù)為止。這樣的查找方式可以更加徹底的檢測(cè)出需要多個(gè)函數(shù)共同參與才能造成的漏洞,進(jìn)一步提高了發(fā)現(xiàn)漏洞的準(zhǔn)確性。
實(shí)施例三
圖3為本發(fā)明實(shí)施例提供的一種應(yīng)用程序安裝包的漏洞檢測(cè)裝置的裝置 結(jié)構(gòu)圖,包括:
獲取單元301,用于獲取待檢測(cè)安裝包的CIL,所述CIL包括多個(gè)函數(shù)。
舉例說(shuō)明。App安裝包可以為不同的文件格式,可以由不同的編譯語(yǔ)言生成??蛇x的,所述待檢測(cè)安裝包為應(yīng)用于Android系統(tǒng)中的安裝包,也就是APK的格式。也可以是其他格式例如可執(zhí)行文件格式等。一般情況下無(wú)法直接獲取App安裝包中的內(nèi)容,故需要對(duì)App安裝包進(jìn)行反編譯得到對(duì)應(yīng)的CIL后,才具有漏洞檢測(cè)的條件。CIL有多種形式,本發(fā)明對(duì)CIL的形式不進(jìn)行限定,不過(guò),可選的,所述CIL具體可以為Smali語(yǔ)言。在本發(fā)明實(shí)施例中,反編譯得到的CIL中至少包括兩個(gè)具有調(diào)用關(guān)系的函數(shù)。
分析單元302,用于對(duì)所述CIL進(jìn)行CFG分析,得到所述CIL的CFG,所述CFG包括所述CIL中所述多個(gè)函數(shù)之間的調(diào)用關(guān)系和調(diào)用順序。
第一確定單元303,用于通過(guò)預(yù)設(shè)條件分析所述CIL,確定漏洞入口點(diǎn)語(yǔ)句以及包含所述漏洞入口點(diǎn)語(yǔ)句的待檢測(cè)函數(shù),所述漏洞入口點(diǎn)語(yǔ)句為具有漏洞形成條件的語(yǔ)句。
舉例說(shuō)明,所述預(yù)設(shè)條件可以為具有成為漏洞可能性的條件或特征,例如所述預(yù)設(shè)條件可以包括在本地保存通用格式的文件等可能會(huì)造成漏洞出現(xiàn)的操作。需要注意的是,本發(fā)明并不限定觸發(fā)所述分析單元302和所述第一確定單元303的先后順序。
第二確定單元304,用于當(dāng)對(duì)所述待檢測(cè)函數(shù)進(jìn)行漏洞檢測(cè)未發(fā)現(xiàn)漏洞,根據(jù)所述CFG中的所述調(diào)用關(guān)系確定與所述漏洞形成相關(guān)且調(diào)用順序在調(diào)用所述待檢測(cè)函數(shù)之前的第一函數(shù),所述第一函數(shù)與所述待檢測(cè)函數(shù)具有直接調(diào)用關(guān)系。
第一檢測(cè)單元305,用于結(jié)合所述待檢測(cè)函數(shù)對(duì)所述第一函數(shù)進(jìn)行漏洞檢測(cè)。
舉例說(shuō)明,若所述第一確定單元303確定出的一條具有漏洞形成可能的語(yǔ)句A屬于如圖2所示的函數(shù)7中的一條語(yǔ)句,那么所述待檢測(cè)函數(shù)就可以為函數(shù)7。在一些需要多個(gè)函數(shù)參與才能形成漏洞的情況下,例如語(yǔ)句A中具有變量,語(yǔ)句A具體的結(jié)果需要通過(guò)其他函數(shù)對(duì)所述變量的賦值后才能確定時(shí),那么,直接對(duì)所述待檢測(cè)函數(shù)也就是函數(shù)7進(jìn)行漏洞檢測(cè)將無(wú)法發(fā)現(xiàn) 漏洞。
故當(dāng)對(duì)函數(shù)7進(jìn)行漏洞檢測(cè)未發(fā)現(xiàn)漏洞時(shí),需要根據(jù)所述CFG確定出所述第一函數(shù),在圖2所示的CFG結(jié)構(gòu)中,函數(shù)4和函數(shù)5均與函數(shù)7具有調(diào)用關(guān)系,且函數(shù)4和函數(shù)5的調(diào)用順序均在調(diào)用函數(shù)7之前。若函數(shù)4和函數(shù)5均與所述漏洞形成相關(guān),則函數(shù)4和函數(shù)5均可以為所述第一函數(shù)。需要注意的是,所述第一函數(shù)與所述待檢測(cè)函數(shù)具有直接調(diào)用關(guān)系,從圖2所示結(jié)構(gòu)中,假設(shè)函數(shù)3和函數(shù)1與所述漏洞形成相關(guān),而且函數(shù)3和函數(shù)1的調(diào)用順序也顯然是在調(diào)用函數(shù)7(待檢測(cè)函數(shù))之前,但是函數(shù)3與函數(shù)7之間并不具備直接調(diào)用關(guān)系,而是通過(guò)函數(shù)5的一種間接調(diào)用關(guān)系,故在函數(shù)7為所述待檢測(cè)函數(shù)的情況下,函數(shù)3并不能作為所述第一函數(shù)。同理函數(shù)1也不能作為所述第一函數(shù)。而只有與函數(shù)7具有直接調(diào)用關(guān)系的函數(shù)4和函數(shù)5可以作為所述第一函數(shù)。
可以結(jié)合函數(shù)7(待檢測(cè)函數(shù))對(duì)函數(shù)4(第一函數(shù))進(jìn)行漏洞檢測(cè),以及也可以結(jié)合函數(shù)7(待檢測(cè)函數(shù))對(duì)函數(shù)5(第一函數(shù))進(jìn)行漏洞檢測(cè)。針對(duì)其中包括函數(shù)5的一支來(lái)說(shuō),由于所述漏洞的形成需要多個(gè)函數(shù)參與,也就是說(shuō)至少需要函數(shù)7和函數(shù)5一起參與才可能形成漏洞,通過(guò)考慮函數(shù)5對(duì)函數(shù)7的影響例如對(duì)函數(shù)7中的語(yǔ)句A的賦值的情況,對(duì)函數(shù)5進(jìn)行漏洞檢測(cè)。由此可以有效檢測(cè)出由兩個(gè)函數(shù)共同參與才能形成的漏洞,提高了檢測(cè)漏洞的能力。
由上述實(shí)施例可以看出,當(dāng)通過(guò)檢測(cè)具有出現(xiàn)漏洞可能性的待檢測(cè)函數(shù)未檢測(cè)出漏洞時(shí),可以根據(jù)通過(guò)對(duì)CIL分析得到對(duì)應(yīng)的CFG,通過(guò)所述調(diào)用關(guān)系確定與所述漏洞形成相關(guān)且調(diào)用順序在調(diào)用所述待檢測(cè)函數(shù)之前的第一函數(shù),并結(jié)合所述待檢測(cè)函數(shù)對(duì)所述第一函數(shù)進(jìn)行漏洞檢測(cè),由此可以提高檢測(cè)出需要多個(gè)函數(shù)共同參與才能造成的漏洞的可能性,提高了發(fā)現(xiàn)漏洞的準(zhǔn)確性,降低了通過(guò)安裝包安裝App為系統(tǒng)帶來(lái)的安全隱患的可能。
實(shí)施例四
在需要多個(gè)函數(shù)共同參與才能造成漏洞的情況下,可能會(huì)出現(xiàn)多于兩個(gè)函數(shù)才能造成漏洞的情況。為此,本實(shí)施例將在圖3所對(duì)應(yīng)實(shí)施例的基礎(chǔ)上, 進(jìn)一步解決需要多于兩個(gè)函數(shù)共同參與才能造成漏洞的情況。
圖4為本發(fā)明實(shí)施例提供的一種應(yīng)用程序安裝包的漏洞檢測(cè)裝置的裝置結(jié)構(gòu)圖,還包括:
第二檢測(cè)單元401,用于當(dāng)所述第一檢測(cè)單元305未發(fā)現(xiàn)漏洞,對(duì)與所述漏洞形成相關(guān)的函數(shù)進(jìn)行回溯遞歸查找,并進(jìn)行漏洞檢測(cè),直到發(fā)現(xiàn)漏洞或遍歷完根據(jù)所述CFG中所述調(diào)用關(guān)系確定的與所述漏洞形成相關(guān)的函數(shù);
其中,所述第二檢測(cè)單元401對(duì)與所述漏洞形成相關(guān)的函數(shù)進(jìn)行回溯遞歸查找,并進(jìn)行漏洞檢測(cè),具體包括結(jié)合所述待檢測(cè)函數(shù)、所述第一函數(shù)以及與所述漏洞形成相關(guān)的,調(diào)用順序在調(diào)用所述第一函數(shù)之前,調(diào)用所述第二函數(shù)之后的函數(shù),對(duì)所述第二函數(shù)進(jìn)行漏洞檢測(cè),所述第二函數(shù)與所述漏洞形成相關(guān),與所述第一函數(shù)具有直接或間接的調(diào)用關(guān)系,調(diào)用順序在調(diào)用所述第一函數(shù)之后;若未發(fā)現(xiàn)漏洞,根據(jù)所述CFG中的所述調(diào)用關(guān)系確定與所述漏洞形成相關(guān)且調(diào)用順序在調(diào)用所述第二函數(shù)之前的第三函數(shù),所述第三函數(shù)與所述第二函數(shù)具有直接調(diào)用關(guān)系;結(jié)合所述待檢測(cè)函數(shù)、所述第一函數(shù)、與所述漏洞形成相關(guān)的,調(diào)用順序在調(diào)用所述第一函數(shù)之前,調(diào)用所述第二函數(shù)之后的函數(shù)以及所述第二函數(shù),對(duì)所述第三函數(shù)進(jìn)行漏洞檢測(cè)。
舉例說(shuō)明,所述回溯遞歸查找可以理解為根據(jù)調(diào)用關(guān)系以及調(diào)用順序,反向(與調(diào)用順序相反)的一種查找過(guò)程,同時(shí)還需要注意查找到的函數(shù)需要與所述漏洞形成相關(guān)。以圖2為例,函數(shù)7通過(guò)回溯遞歸查找到的函數(shù)可以為函數(shù)4和函數(shù)5,假設(shè)其中只有函數(shù)5與所述漏洞形成相關(guān),那么通過(guò)對(duì)與所述漏洞形成相關(guān)的函數(shù)進(jìn)行回溯遞歸查找只能查找到函數(shù)5,進(jìn)一步查找到函數(shù)5的上一級(jí)函數(shù):函數(shù)3(假設(shè)函數(shù)3與所述漏洞形成相關(guān)),再進(jìn)一步查找到函數(shù)3的上一級(jí)函數(shù):函數(shù)1(假設(shè)函數(shù)1與所述漏洞形成相關(guān))。這里所說(shuō)的函數(shù)X的上一級(jí)函數(shù)可以理解為與所述漏洞形成相關(guān),調(diào)用順序在調(diào)用所述函數(shù)X之前,且與所述函數(shù)X具有直接調(diào)用關(guān)系的函數(shù)。
通過(guò)圖2所示的結(jié)構(gòu)圖進(jìn)行舉例說(shuō)明,假設(shè)函數(shù)1、函數(shù)3和函數(shù)5均與所述漏洞形成相關(guān),函數(shù)7為所述待檢測(cè)函數(shù)。在本發(fā)明實(shí)施例中,函數(shù)5可以理解為所述第一函數(shù),若結(jié)合函數(shù)7對(duì)函數(shù)5進(jìn)行漏洞檢測(cè)未發(fā)現(xiàn)漏洞,則對(duì)與所述漏洞形成相關(guān)的函數(shù)進(jìn)行回溯遞歸查找,并進(jìn)行漏洞檢測(cè)的過(guò)程 可以為:函數(shù)3可以理解為第二函數(shù),結(jié)合函數(shù)7和函數(shù)5對(duì)函數(shù)3進(jìn)行漏洞檢測(cè),若未發(fā)現(xiàn)漏洞,函數(shù)1可以理解為第三函數(shù),將結(jié)合函數(shù)7、函數(shù)5和函數(shù)3對(duì)函數(shù)1進(jìn)行漏洞分析。若調(diào)用關(guān)系更多,參與的函數(shù)更多,也可以通過(guò)本實(shí)施例中的回溯遞歸的方式依次進(jìn)行漏洞查找,直到發(fā)現(xiàn)漏洞或遍歷完根據(jù)所述CFG中所述調(diào)用關(guān)系確定的與所述漏洞形成相關(guān)的函數(shù),本發(fā)明不再對(duì)具有更多調(diào)用關(guān)系的CFG結(jié)構(gòu)進(jìn)行一一窮舉。
所述遍歷完根據(jù)所述CFG中所述調(diào)用關(guān)系確定的與所述漏洞形成相關(guān)的函數(shù)可以理解為進(jìn)行漏洞檢測(cè)的函數(shù)為入度函數(shù)的情況,所謂入度函數(shù)可以理解為與入度函數(shù)具有調(diào)用關(guān)系的函數(shù)的調(diào)用順序均在調(diào)用所述入度函數(shù)之后,也就是說(shuō)在所處調(diào)用關(guān)系鏈中最先調(diào)用的函數(shù)??蛇x的,若所述對(duì)與所述漏洞形成相關(guān)的函數(shù)進(jìn)行回溯遞歸查找,并進(jìn)行漏洞檢測(cè),遍歷完根據(jù)所述CFG中所述調(diào)用關(guān)系確定的與所述漏洞形成相關(guān)的函數(shù),未發(fā)現(xiàn)漏洞,則判斷所述待檢測(cè)安裝包沒(méi)有漏洞。這種結(jié)束回溯遞歸查找并結(jié)束漏洞檢測(cè)的條件,可以使得在本發(fā)明實(shí)施例中,可以盡可能的查找到由多個(gè)函數(shù)參與形成的漏洞,提高App安裝包的安全性。
通過(guò)本實(shí)施例可以看出,當(dāng)通過(guò)檢測(cè)所述第一函數(shù)還不能檢測(cè)出漏洞時(shí),將根據(jù)所述CFG中的調(diào)用關(guān)系和調(diào)用順序,對(duì)與所述漏洞形成相關(guān)的函數(shù)進(jìn)行回溯遞歸查找,直到發(fā)現(xiàn)漏洞或者漏洞查找的函數(shù)為入度函數(shù)為止。這樣的查找方式可以更加徹底的檢測(cè)出需要多個(gè)函數(shù)共同參與才能造成的漏洞,進(jìn)一步提高了發(fā)現(xiàn)漏洞的準(zhǔn)確性。
通過(guò)以上的實(shí)施方式的描述可知,本領(lǐng)域的技術(shù)人員可以清楚地了解到上述實(shí)施例方法中的全部或部分步驟可借助軟件加通用硬件平臺(tái)的方式來(lái)實(shí)現(xiàn)?;谶@樣的理解,本發(fā)明的技術(shù)方案本質(zhì)上或者說(shuō)對(duì)現(xiàn)有技術(shù)做出貢獻(xiàn)的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來(lái),該計(jì)算機(jī)軟件產(chǎn)品可以存儲(chǔ)在存儲(chǔ)介質(zhì)中,如ROM/RAM、磁碟、光盤(pán)等,包括若干指令用以使得一臺(tái)計(jì)算機(jī)設(shè)備(可以是個(gè)人計(jì)算機(jī),服務(wù)器,或者諸如媒體網(wǎng)關(guān)等網(wǎng)絡(luò)通信設(shè)備)執(zhí)行本發(fā)明各個(gè)實(shí)施例或者實(shí)施例的某些部分所述的方法。
需要說(shuō)明的是,本說(shuō)明書(shū)中的各個(gè)實(shí)施例均采用遞進(jìn)的方式描述,各個(gè) 實(shí)施例之間相同相似的部分互相參見(jiàn)即可,每個(gè)實(shí)施例重點(diǎn)說(shuō)明的都是與其他實(shí)施例的不同之處。尤其,對(duì)于設(shè)備及系統(tǒng)實(shí)施例而言,由于其基本相似于方法實(shí)施例,所以描述得比較簡(jiǎn)單,相關(guān)之處參見(jiàn)方法實(shí)施例的部分說(shuō)明即可。以上所描述的設(shè)備及系統(tǒng)實(shí)施例僅僅是示意性的,其中作為分離部件說(shuō)明的單元可以是或者也可以不是物理上分開(kāi)的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個(gè)地方,或者也可以分布到多個(gè)網(wǎng)絡(luò)單元上??梢愿鶕?jù)實(shí)際的需要選擇其中的部分或者全部模塊來(lái)實(shí)現(xiàn)本實(shí)施例方案的目的。本領(lǐng)域普通技術(shù)人員在不付出創(chuàng)造性勞動(dòng)的情況下,即可以理解并實(shí)施。
以上所述僅是本發(fā)明的優(yōu)選實(shí)施方式,并非用于限定本發(fā)明的保護(hù)范圍。應(yīng)當(dāng)指出,對(duì)于本技術(shù)領(lǐng)域的普通技術(shù)人員來(lái)說(shuō),在不脫離本發(fā)明原理的前提下,還可以做出若干改進(jìn)和潤(rùn)飾,這些改進(jìn)和潤(rùn)飾也應(yīng)視為本發(fā)明的保護(hù)范圍。