本發(fā)明涉及數(shù)據(jù)處理技術(shù)領(lǐng)域,具體涉及一種應用漏洞檢測方法、裝置及計算設備。
背景技術(shù):
隨著Android、IOS等智能操作系統(tǒng)的發(fā)展,終端設備所裝載的應用越來越多,應用的安全問題也愈加受到人們的關(guān)注;應用的安全問題大部分是由于應用所存在的漏洞產(chǎn)生,因此對應用進行漏洞檢測,對于提升應用的安全性顯得尤為重要。
目前主要通過漏洞靜態(tài)檢測方式檢測應用中存在的漏洞,即預先制定漏洞特征,對應用的內(nèi)容數(shù)據(jù)(如方法數(shù)據(jù)等)進行漏洞特征的匹配,若匹配到與漏洞特征相應的內(nèi)容數(shù)據(jù),則該內(nèi)容數(shù)據(jù)的位置為應用中存在漏洞的位置。
本發(fā)明的發(fā)明人在研究過程中發(fā)現(xiàn),通過漏洞靜態(tài)檢測方式檢測應用中存在的漏洞,雖然檢測效率較高,但檢測結(jié)果的準確性并不理想,尤其對于漏洞特征較不突出的應用漏洞,很容易產(chǎn)生誤報。
技術(shù)實現(xiàn)要素:
有鑒于此,本發(fā)明實施例提供一種應用漏洞檢測方法、裝置及計算設備,以解決現(xiàn)有檢測應用漏洞的方式所存在的準確性較低的問題。
為實現(xiàn)上述目的,本發(fā)明實施例提供如下技術(shù)方案:
一種應用漏洞檢測方法,包括:
確定應用的目標組成元素及目標組成元素的組成數(shù)據(jù);
對各目標組成元素的各組成數(shù)據(jù)進行漏洞靜態(tài)檢測;
若檢測到存在漏洞的組成數(shù)據(jù),將所檢測到的組成數(shù)據(jù)作為疑似漏洞數(shù)據(jù),對所述疑似漏洞數(shù)據(jù)的數(shù)據(jù)來源進行回溯跟蹤;
若所回溯跟蹤到的數(shù)據(jù)來源為外部可控的,則確定所述疑似漏洞數(shù)據(jù)為所檢測到的應用漏洞。
本發(fā)明實施例還提供一種應用漏洞檢測裝置,包括:
目標元素數(shù)據(jù)確定模塊,用于確定應用的目標組成元素及目標組成元素的組成數(shù)據(jù);
靜態(tài)檢測模塊,用于對各目標組成元素的各組成數(shù)據(jù)進行漏洞靜態(tài)檢測;
回溯跟蹤模塊,用于若檢測到存在漏洞的組成數(shù)據(jù),將所檢測到的組成數(shù)據(jù)作為疑似漏洞數(shù)據(jù),對所述疑似漏洞數(shù)據(jù)的數(shù)據(jù)來源進行回溯跟蹤;
漏洞確定模塊,用于若所回溯跟蹤到的數(shù)據(jù)來源為外部可控的,則確定所述疑似漏洞數(shù)據(jù)為所檢測到的應用漏洞。
本發(fā)明實施例還提供一種計算設備,包括上述所述的應用漏洞檢測裝置。
基于上述技術(shù)方案,本發(fā)明實施例在進行應用漏洞檢測時,先確定應用中可進行應用漏洞檢測的目標組成元素,及目標組成元素的組成數(shù)據(jù);從而以漏洞靜態(tài)檢測方式對各目標組成元素的各組成數(shù)據(jù)進行漏洞檢測,當檢測到存在漏洞的組成數(shù)據(jù)時,本發(fā)明實施例并不是直接以所檢測的存在漏洞的組成數(shù)據(jù)作為應用漏洞,而是將所檢測到的組成數(shù)據(jù)作為疑似漏洞數(shù)據(jù),繼續(xù)對所述疑似漏洞數(shù)據(jù)的數(shù)據(jù)來源進行回溯跟蹤,在所回溯跟蹤到的數(shù)據(jù)來源為外部可控時,確定所述疑似漏洞數(shù)據(jù)可被外部控制,確定所述疑似漏洞數(shù)據(jù)為所檢測到的應用漏洞。本發(fā)明實施例提供的應用漏洞檢測方法,在通過漏洞靜態(tài)檢測方式檢測到疑似漏洞數(shù)據(jù)時,繼續(xù)對所述疑似漏洞數(shù)據(jù)進行深層次的檢測,即對所述疑似漏洞數(shù)據(jù)的數(shù)據(jù)來源進行回溯跟蹤,只有在所回溯跟蹤到的數(shù)據(jù)來源為外部可控時,才確定所述疑似漏洞數(shù)據(jù)為所檢測到的應用漏洞,從而使得最終的應用漏洞檢測結(jié)果的準確性較高,減少了誤報情況的發(fā)生,提升了檢測結(jié)果的準確性。
附圖說明
為了更清楚地說明本發(fā)明實施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實 施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的實施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)提供的附圖獲得其他的附圖。
圖1為本發(fā)明實施例提供的應用漏洞檢測方法的流程圖;
圖2為本發(fā)明實施例提供的應用漏洞檢測方法的另一流程圖;
圖3為本發(fā)明實施例提供的應用漏洞檢測方法的再一流程圖;
圖4為本發(fā)明實施例提供的應用漏洞檢測方法的又一流程圖;
圖5為本發(fā)明實施例提供的確定應用的類的樹結(jié)構(gòu)的方法流程圖;
圖6為本發(fā)明實施例提供的回溯跟蹤關(guān)鍵參數(shù)的數(shù)據(jù)來源的方法流程圖;
圖7為本發(fā)明實施例提供的應用漏洞檢測裝置的結(jié)構(gòu)框圖;
圖8為本發(fā)明實施例提供的應用漏洞檢測裝置的另一結(jié)構(gòu)框圖;
圖9為本發(fā)明實施例提供的函數(shù)靜態(tài)檢測單元的結(jié)構(gòu)框圖;
圖10為本發(fā)明實施例提供的函數(shù)回溯跟蹤單元的結(jié)構(gòu)框圖;
圖11為本發(fā)明實施例提供的計算設備的硬件結(jié)構(gòu)框圖。
具體實施方式
下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分實施例,而不是全部的實施例。基于本發(fā)明中的實施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本發(fā)明保護的范圍。
圖1為本發(fā)明實施例提供的應用漏洞檢測方法的流程圖,該方法可應用于具體數(shù)據(jù)處理能力的計算設備中,如可應用于手機、平板電腦、筆記本電腦等終端設備,也可應用于服務器等網(wǎng)絡側(cè)設備;參照圖1,該方法可以包括:
步驟S100、確定應用的目標組成元素及目標組成元素的組成數(shù)據(jù);
可選的,此處的組成元素可以指包、類、方法、邏輯單元、字符名及值等編譯應用時所采用的程序元素;目標組成元素可以是從上述組成元素中所選取的一種,通過分析則可實現(xiàn)應用漏洞檢測的元素;如可以漏洞靜態(tài)檢測方式所主要檢測的組成元素作為目標組成元素;目標組成元素的組成數(shù)據(jù)可以為目標組成元素的具體內(nèi)容數(shù)據(jù);
可選的,目標組成元素可選取類,通過對類的分析可實現(xiàn)應用漏洞的檢測,對應的,目標組成元素的組成數(shù)據(jù)可以為類中所封裝的方法等內(nèi)容數(shù)據(jù)。
步驟S110、對各目標組成元素的各組成數(shù)據(jù)進行漏洞靜態(tài)檢測;
可選的,本發(fā)明實施例可設置漏洞規(guī)則文件,所述漏洞規(guī)則文件中注冊有應用的漏洞特征;對于各目標組成元素的各組成數(shù)據(jù),本發(fā)明實施例可將各組成數(shù)據(jù)的內(nèi)容與漏洞規(guī)則文件中注冊的漏洞特征進行匹配;
若存在與漏洞特征相匹配的組成數(shù)據(jù),則該組成數(shù)據(jù)為通過漏洞靜態(tài)檢測方式初步檢測出的疑似存在漏洞的數(shù)據(jù),本發(fā)明實施例稱此類數(shù)據(jù)為疑似漏洞數(shù)據(jù)。
步驟S120、若檢測到存在漏洞的組成數(shù)據(jù),將所檢測到的組成數(shù)據(jù)作為疑似漏洞數(shù)據(jù),對所述疑似漏洞數(shù)據(jù)的數(shù)據(jù)來源進行回溯跟蹤;
可選的,可根據(jù)應用邏輯,模擬所述疑似漏洞數(shù)據(jù)的調(diào)用、產(chǎn)生等相關(guān)邏輯,從而對所述疑似漏洞數(shù)據(jù)的數(shù)據(jù)來源進行回溯跟蹤。
步驟S130、若所回溯跟蹤到的數(shù)據(jù)來源為外部可控的,則確定所述疑似漏洞數(shù)據(jù)為所檢測到的應用漏洞。
可以看出,本發(fā)明實施例在進行應用漏洞檢測時,先確定應用中可進行應用漏洞檢測的目標組成元素,及目標組成元素的組成數(shù)據(jù);從而以漏洞靜態(tài)檢測方式對各目標組成元素的各組成數(shù)據(jù)進行漏洞檢測,當檢測到存在漏洞的組成數(shù)據(jù)時,本發(fā)明實施例并不是直接以所檢測的存在漏洞的組成數(shù)據(jù)作為應用漏洞,而是將所檢測到的組成數(shù)據(jù)作為疑似漏洞數(shù)據(jù),繼續(xù)對所述疑似漏洞數(shù)據(jù)的數(shù)據(jù)來源進行回溯跟蹤,在所回溯跟蹤到的數(shù)據(jù)來源為外部可控時,確定所述疑似漏洞數(shù)據(jù)可被外部控制,確定所述疑似漏洞數(shù)據(jù)為所檢測到的應用漏洞。本發(fā)明實施例提供的應用漏洞檢測方法,在通過漏洞靜態(tài)檢測方式檢測到疑似漏洞數(shù)據(jù)時,繼續(xù)對所述疑似漏洞數(shù)據(jù)進行深層次的檢測,即對所述疑似漏洞數(shù)據(jù)的數(shù)據(jù)來源進行回溯跟蹤,只有在所回溯跟蹤到的數(shù)據(jù)來源為外部可控時,才確定所述疑似漏洞數(shù)據(jù)為所檢測到的應用漏洞,從而使得最終的應用漏洞檢測結(jié)果的準確性較高,減少了誤報情況的發(fā)生,提升了檢測結(jié)果的準確性。
可選的,目標組成元素可以為類,目標組成元素的組成數(shù)據(jù)可以為類的方法數(shù)據(jù);圖2示出了本發(fā)明實施例提供的應用漏洞檢測方法的另一流程圖, 參照圖2,該方法可以包括:
步驟S200、確定應用的類及類的方法數(shù)據(jù);
步驟S210、對各類的各方法數(shù)據(jù)中的各函數(shù)調(diào)用點進行漏洞靜態(tài)檢測;
可選的,本發(fā)明實施例可預設漏洞規(guī)則文件,所述漏洞規(guī)則文件注冊有危險函數(shù)的特征;
在進行漏洞靜態(tài)檢測時,可調(diào)用預設的漏洞規(guī)則文件;將各類的各方法數(shù)據(jù)中的各函數(shù)調(diào)用點對應的函數(shù)的特征,與所述漏洞規(guī)則文件中注冊的危險函數(shù)的特征進行匹配處理;若存在函數(shù)調(diào)用點對應的函數(shù)的特征,與所述漏洞規(guī)則文件中注冊的危險函數(shù)的特征相匹配,則可確定所述函數(shù)調(diào)用點疑似存在漏洞,可將該函數(shù)調(diào)用點作為疑似函數(shù)調(diào)用點。
步驟S220、若檢測到存在漏洞的函數(shù)調(diào)用點,將所檢測到的函數(shù)調(diào)用點作為疑似函數(shù)調(diào)用點;
步驟S230、根據(jù)函數(shù)邏輯對所述疑似函數(shù)調(diào)用點的數(shù)據(jù)來源進行回溯跟蹤;
可選的,本發(fā)明實施例可根據(jù)函數(shù)邏輯,模擬應用在真實環(huán)境中的數(shù)據(jù)流向,從而回溯跟蹤到所述疑似函數(shù)調(diào)用點的數(shù)據(jù)來源。
步驟S240、若回溯跟蹤到所述疑似函數(shù)調(diào)用點的數(shù)據(jù)來源關(guān)聯(lián)至外部輸入,則確定所述疑似函數(shù)調(diào)用點為應用中存在漏洞的函數(shù)調(diào)用點。
顯然,類僅為目標組成元素的一種可選形式,本發(fā)明實施例也可根據(jù)漏洞靜態(tài)檢測實際可檢測的元素類型選取目標組成元素。
可選的,在對所述疑似函數(shù)調(diào)用點的數(shù)據(jù)來源進行回溯跟蹤時,本發(fā)明實施例可僅對所述疑似函數(shù)調(diào)用點的關(guān)鍵參數(shù)的數(shù)據(jù)來源進行回溯跟蹤;該關(guān)鍵參數(shù)可以為設定的能引起函數(shù)調(diào)用點存在漏洞的參數(shù),具體可在所述漏洞規(guī)則文件中進行注冊;對應的,圖3示出了本發(fā)明實施例提供的應用漏洞檢測方法的再一流程圖,參照圖3,該方法可以包括:
步驟S300、確定應用的類及類的方法數(shù)據(jù);
步驟S310、對各類的各方法數(shù)據(jù)中的各函數(shù)調(diào)用點進行漏洞靜態(tài)檢測;
步驟S320、若檢測到存在漏洞的函數(shù)調(diào)用點,將所檢測到的函數(shù)調(diào)用點作為疑似函數(shù)調(diào)用點;
步驟S330、提取所述疑似函數(shù)調(diào)用點對應函數(shù)的關(guān)鍵參數(shù);
可選的,關(guān)鍵參數(shù)可以為函數(shù)調(diào)用點對應函數(shù)的變量、表達式、成員變量等參數(shù)。
步驟S340、根據(jù)函數(shù)邏輯,模擬應用在真實環(huán)境中的數(shù)據(jù)流向,以回溯跟蹤所述關(guān)鍵參數(shù)的數(shù)據(jù)來源;
步驟S350、若回溯跟蹤到所述關(guān)鍵參數(shù)的數(shù)據(jù)來源關(guān)聯(lián)至外部輸入,則確定所述疑似函數(shù)調(diào)用點為應用中存在漏洞的函數(shù)調(diào)用點。
可選的,本發(fā)明實施例可通過構(gòu)建類的樹結(jié)構(gòu)的方式,實現(xiàn)應用的漏洞檢測;圖4示出了本發(fā)明實施例提供的應用漏洞檢測方法的又一流程圖,參照圖4,該方法可以包括:
步驟S400、確定應用的類的樹結(jié)構(gòu),所述樹結(jié)構(gòu)的一個節(jié)點對應一個類,一個節(jié)點下的子節(jié)點對應有類的方法數(shù)據(jù);
可選的,在對一個應用進行漏洞檢測時,一般只能獲取到該應用的安裝文件,因此本發(fā)明實施例可對應用的安裝文件進行反編譯,對反編譯后的結(jié)果進行分析,從而確定應用中的各類,及各類的各方法數(shù)據(jù);從而以樹結(jié)構(gòu)的一個節(jié)點對應一個類,類節(jié)點下的子節(jié)點對應類的方法數(shù)據(jù)的方式,構(gòu)建出應用的類的樹結(jié)構(gòu);顯然,若可獲取到應用的源代碼,則可直接分析應用的源代碼,確定應用中的各類,及各類的方法數(shù)據(jù),從而構(gòu)建出應用的類的樹結(jié)構(gòu);
顯然,在選取其他元素作為目標組成元素時,也可通過構(gòu)建相應的樹結(jié)構(gòu)實現(xiàn)應用的漏洞檢測;具體在構(gòu)建樹結(jié)構(gòu)時,可以樹結(jié)構(gòu)的一個節(jié)點對應一個目標組成元素,目標組成元素節(jié)點下的子節(jié)點對應具體組成數(shù)據(jù)的方式,實現(xiàn)樹結(jié)構(gòu)的構(gòu)建。
步驟S410、針對各節(jié)點,對節(jié)點對應的各方法數(shù)據(jù)中的各函數(shù)調(diào)用點進行漏洞靜態(tài)檢測;
可選的,本發(fā)明實施例可調(diào)用預設的漏洞規(guī)則文件,所述漏洞規(guī)則文件注冊有危險函數(shù)的特征;對于所述樹結(jié)構(gòu)中的各節(jié)點,本發(fā)明實施例可將節(jié)點所對應的類中的各方法數(shù)據(jù)的各函數(shù)調(diào)用點,與漏洞規(guī)則文件中注冊的危險函數(shù)的特征進行匹配;
若存在函數(shù)調(diào)用點對應的函數(shù)的特征,與所述漏洞規(guī)則文件中注冊的危險函數(shù)的特征相匹配,則確定所述函數(shù)調(diào)用點為疑似存在漏洞的疑似函數(shù)調(diào) 用點。
步驟S420、若檢測到存在漏洞的函數(shù)調(diào)用點,將所檢測到的函數(shù)調(diào)用點作為疑似函數(shù)調(diào)用點;
步驟S430、根據(jù)函數(shù)邏輯對所述疑似函數(shù)調(diào)用點的數(shù)據(jù)來源進行回溯跟蹤;
可選的,提取所述疑似函數(shù)調(diào)用點對應函數(shù)的關(guān)鍵參數(shù),根據(jù)函數(shù)邏輯,模擬應用在真實環(huán)境中的數(shù)據(jù)流向,以回溯跟蹤所述關(guān)鍵參數(shù)的數(shù)據(jù)來源,從而實現(xiàn)對所述疑似函數(shù)調(diào)用點的數(shù)據(jù)來源進行回溯跟蹤。
步驟S440、若回溯跟蹤到所述疑似函數(shù)調(diào)用點的數(shù)據(jù)來源關(guān)聯(lián)至外部輸入,則確定所述疑似函數(shù)調(diào)用點為應用中存在漏洞的函數(shù)調(diào)用點。
可選的,在構(gòu)建類的樹結(jié)構(gòu)時,本發(fā)明實施例可先構(gòu)建應用對應的AST(Abstract Syntax Tree,抽象語法樹),再從該AST中讀取類的樹結(jié)構(gòu)。圖5示出了本發(fā)明實施例提供的確定應用的類的樹結(jié)構(gòu)的方法流程圖,參照圖5,該方法可以包括:
步驟500、獲取編譯應用所采用的組成元素;
可選的,本發(fā)明實施例可對應用的安裝文件進行反編譯,從而分析反編譯后的結(jié)果,得到編譯所述應用所采用的組成元素;
可選的,在分析應用的安裝文件的反編譯后的結(jié)果時,本發(fā)明實施例可得到應用的框架結(jié)構(gòu)、語法語句內(nèi)存模型(Treemodel)、字符名集合等信息;其中,Treemodel為臨時內(nèi)存結(jié)構(gòu),包含代碼的詞法語法詳細信息,如控制結(jié)構(gòu)、運算操作等代碼關(guān)鍵信息;字符名是應用中最小的標志單元,代表著數(shù)據(jù)在應用運行到當前節(jié)點時的名稱;應用的框架結(jié)構(gòu)、語法語句內(nèi)存模型(Treemodel)、字符名集合等信息中包括有類、方法、字符名及值等語法元素(treeItem)。
步驟S510、根據(jù)預先設定的AST的節(jié)點位置對應的元素類型,將各所述組成元素填入對應的AST節(jié)點中,得到所述應用對應的AST;
可選的,本發(fā)明實施例可定義各類型的組成元素,在AST中對應的節(jié)點位置(如定義某一類型的組成元素為節(jié)點,某一類型的組成元素為節(jié)點下的子節(jié)點等),從而建立AST的各節(jié)點位置對應的元素類型的映射關(guān)系;在得到應用的組成元素后,可確定應用的各組成元素所對應的在AST中的節(jié)點位置,從 而將各組成元素填入與對應節(jié)點中,得到所述應用對應的AST;
可選的,以組成元素包括應用的包、類、方法、邏輯單元、字符名及值等信息為例,則可定義包對應的AST節(jié)點位置,類對應的AST節(jié)點位置,方法對應的AST節(jié)點位置(如方法可定義為相應類節(jié)點下的子節(jié)點,邏輯單元可定義為相應方法節(jié)點下的子節(jié)點等)等,從而實現(xiàn)AST的樹框架的定義;在得到應用的組成元素后,可從應用的入口開始,逐步確定各組成元素在AST中的節(jié)點位置,最終將整個應用構(gòu)建出一個完整的AST;
步驟S520、讀取所述AST中類的樹結(jié)構(gòu)。
在得到應用對應的AST后,可從AST中分離出類的樹結(jié)構(gòu)。
進一步,AST由于包含了應用的所有組成元素,則AST的框架結(jié)構(gòu)可對應應用的執(zhí)行邏輯,本發(fā)明實施例在進行模擬應用在真實環(huán)境中的數(shù)據(jù)流向,回溯跟蹤所述疑似函數(shù)調(diào)用點對應函數(shù)的關(guān)鍵參時,可通過AST對應的應用執(zhí)行邏輯實現(xiàn)數(shù)據(jù)來源的回溯跟蹤;對應的,圖6示出了本發(fā)明實施例提供的回溯跟蹤關(guān)鍵參數(shù)的數(shù)據(jù)來源的方法流程圖,參照圖6,該方法可以包括:
步驟S600、在確定疑似函數(shù)調(diào)用點后,確定所述疑似函數(shù)調(diào)用點在所述AST的整體樹結(jié)構(gòu)中的位置;
步驟S610、以所確定的位置為起始位置,確定所述AST的整體樹結(jié)構(gòu)中該起始位置可回溯跟蹤的路徑;
步驟S620、以所確定的路徑,對所述疑似函數(shù)調(diào)用點的關(guān)鍵參數(shù)的數(shù)據(jù)來源進行回溯跟蹤。
可選的,在得到類的樹結(jié)構(gòu)后,本發(fā)明實施例也可通過構(gòu)建類對應的符號表的方式,實現(xiàn)對疑似函數(shù)調(diào)用點的關(guān)鍵參數(shù)的數(shù)據(jù)來源的回溯跟蹤;對應的,在確定應用的類的樹結(jié)構(gòu)后,本發(fā)明實施例可構(gòu)建類所對應的符號表;
具體的,本發(fā)明實施例可遍歷AST中的類節(jié)點下的方法子節(jié)點,構(gòu)建每個方法的符號表;再遍歷方法節(jié)點下的形參子節(jié)點,獲取形參類型信息;獲取方法節(jié)點下的聲明、賦值、函數(shù)調(diào)用等子節(jié)點,收集變量類型,構(gòu)建變量賦值、函數(shù)調(diào)用值、New值、形參值及返回結(jié)點值等,并保存到符號表結(jié)構(gòu)中;
其中所述符號表可包括:各類對應的類摘要表、類中每個方法對應函數(shù)摘要表,及函數(shù)摘要表對應的變量信息表;
類摘要表針對AST中的每個類,可收集類名、包名、import引入的類、類 成員變量等基本信息;可選的,可設置import引入的自定義類優(yōu)先于本類分析,類成員變量信息用于類方法的分析中;
函數(shù)摘要表針對類中的每個方法,一個方法可對應一個函數(shù)摘要表,函數(shù)摘要表可包含對應方法的數(shù)據(jù)關(guān)聯(lián)關(guān)系,如賦值關(guān)系、函數(shù)調(diào)用關(guān)系、變量聲明、形參信息、返回語句等信息;通過函數(shù)摘要表可管理變量信息表;
變量信息表由兩個二維映射表組成,分別為變量類型表和變量值表;變量類型表可記錄方法中聲明變量的類型,變量值表可記錄方法中變量的數(shù)據(jù)關(guān)聯(lián);構(gòu)建方式可以為:從AST中獲取方法節(jié)點,提取方法節(jié)點下子節(jié)點的形參變量信息;然后取得方法體的節(jié)點,遞歸地獲取相應子結(jié)點,并提取關(guān)鍵信息;如賦值結(jié)點SetProperty,獲取變量名a,構(gòu)建右值對象b(含所在行、所在方法、AST節(jié)點等信息的對象),并將<a,b>添入變量值表;在遞歸分析過程中,將變量的聲明信息同時添入變量類型表。
在構(gòu)建了類所對應的符號表后,本發(fā)明實施例可基于所述符號表回溯跟蹤疑似函數(shù)調(diào)用點的關(guān)鍵參數(shù)的數(shù)據(jù)來源;如可提取疑似函數(shù)調(diào)用點對應函數(shù)的關(guān)鍵參數(shù)(如函數(shù)的變量、表達式、成員變量等),根據(jù)符號表中的信息迭代查找與所述關(guān)鍵參數(shù)最近的前驅(qū)參數(shù);若查找到的最近前驅(qū)為賦值,則繼續(xù)回溯跟蹤右值;若查找到的最近前驅(qū)為函數(shù)調(diào)用點,則判斷查找到的函數(shù)調(diào)用點對應的函數(shù)是否已被函數(shù)摘要表所記錄,若沒有,則將查找到的函數(shù)調(diào)用點對應的函數(shù)摘要記錄至函數(shù)摘要表中,并獲取該函數(shù)的返回值和關(guān)聯(lián)參數(shù),繼續(xù)回溯跟蹤所獲取的關(guān)聯(lián)參數(shù);若回溯到類成員變量,前驅(qū)可能是該類的其他方法調(diào)用隱式傳遞(方法影響該成員變量的值),則需要回溯與該成員變量的最近關(guān)聯(lián);
需要注意的是,若所述關(guān)鍵參數(shù)關(guān)聯(lián)到該方法的形參,則只要調(diào)用該方法時,此形參為外部可控的,則可確定所述疑似函數(shù)調(diào)用點為應用中存在漏洞的函數(shù)調(diào)用點;并將該方法的函數(shù)特征加入漏洞規(guī)則文件所注冊的危險函數(shù)中。
具體的,在基于所述符號表,回溯跟蹤疑似函數(shù)調(diào)用點的關(guān)鍵參數(shù)的數(shù)據(jù)來源的具體實現(xiàn)可如下:
基于所述符號表,若回溯跟蹤到的數(shù)據(jù)來源為外部輸入變量,則確定回溯跟蹤到所述關(guān)鍵參數(shù)的數(shù)據(jù)來源關(guān)聯(lián)至外部輸入;
基于所述符號表,若回溯跟蹤到的數(shù)據(jù)來源為變量,且變量類型為基本非字符串類型,則確定回溯跟蹤到所述關(guān)鍵參數(shù)的數(shù)據(jù)來源關(guān)聯(lián)至外部輸入;
基于所述符號表,回溯跟蹤到的數(shù)據(jù)來源為變量,但所述變量不為外部輸入變量,且類型不為非字符串類型時,則從所述符號表查找所述變量最近的關(guān)聯(lián)值;若未查找到關(guān)聯(lián)值,且所述變量不為類成員變量,則確定回溯跟蹤到所述關(guān)鍵參數(shù)的數(shù)據(jù)來源關(guān)聯(lián)至外部輸入;
基于所述符號表,若回溯跟蹤到的數(shù)據(jù)來源為變量,但所述變量不為外部輸入變量,且類型不為非字符串類型時,則從所述符號表查找所述變量最近的關(guān)聯(lián)值;若未查找到關(guān)聯(lián)值,且所述變量為類成員變量,則判斷所述類成員變量是否被關(guān)聯(lián)為漏洞標記,若是,則確定回溯跟蹤到所述關(guān)鍵參數(shù)的數(shù)據(jù)來源關(guān)聯(lián)至外部輸入。
進一步,本發(fā)明實施例基于所述符號表,若回溯跟蹤到的數(shù)據(jù)來源為變量,且變量類型為基本非字符串類型,則確定所述關(guān)鍵參數(shù)的數(shù)據(jù)來源未關(guān)聯(lián)至外部輸入;
基于所述符號表,若回溯跟蹤到的數(shù)據(jù)來源為變量,但所述變量不為外部輸入變量,且類型不為非字符串類型時,則從所述符號表查找所述變量最近的關(guān)聯(lián)值;若查找到的關(guān)聯(lián)值為賦值,則追蹤右值對象;若查找到的關(guān)聯(lián)值對應函數(shù)調(diào)用,則通過所述符號表獲取所述函數(shù)摘要,并繼續(xù)追蹤;若未查找到關(guān)聯(lián)值,且所述變量為類成員變量,則追蹤所述類成員變量。
具體的,在上述追蹤過程中,若追蹤到函數(shù)調(diào)用,本發(fā)明實施例可通過所述符號表獲取對應的函數(shù)摘要,追蹤所獲取的函數(shù)摘要所關(guān)聯(lián)的參數(shù)表達式;
若追蹤到常量,可確定所述關(guān)鍵參數(shù)未關(guān)聯(lián)至外部輸入;
若追蹤到二元操作,追蹤對應的操作數(shù)表達式;
若追蹤到其他類型的參數(shù),可追蹤該參數(shù)對應的表達式。
進一步,在涉及到函數(shù)摘要時,若摘要到返回值的關(guān)聯(lián),對符號表中收集的每個返回點,追蹤返回表達式;若追蹤關(guān)聯(lián)到方法形參,記錄返回值與形參所在位置的關(guān)聯(lián),若追蹤關(guān)聯(lián)到成員變量,則記錄返回值與成員變量的關(guān)聯(lián);
若摘要到參數(shù)的關(guān)聯(lián),則對方法中每個形參變量,依次追蹤形參變量在方法中的數(shù)據(jù)關(guān)聯(lián);若追蹤關(guān)聯(lián)到與所述形參變量不同的其他參數(shù),記錄所述形參變量與所述其他參數(shù)的關(guān)聯(lián);若追蹤關(guān)聯(lián)到成員變量,記錄所述形參變量與所述成員變量的關(guān)聯(lián);
若摘要到類成員變量的關(guān)聯(lián),則對每個類成員變量進行追蹤;若追蹤到形參,則記錄所述類成員變量與所述形參的關(guān)聯(lián),且繼續(xù)追蹤與所述類成員變量不同的其他類成員變量,記錄所述形參與所述其他類成員變量的關(guān)聯(lián)。
可選的,在通過上述方法確定了應用漏洞后,本發(fā)明實施例可以存在應用漏洞的函數(shù)調(diào)用點所對應的類型、觸發(fā)點和數(shù)據(jù)流軌跡構(gòu)成應用漏洞結(jié)果數(shù)據(jù),其中觸發(fā)點和軌跡中的值由函數(shù)名和行數(shù)定位在代碼中位置;將應用漏洞結(jié)果數(shù)據(jù)添加到統(tǒng)一列表保存并輸出。
下面基于Android虛擬機,對本發(fā)明實施例提供的Android(安卓)應用的漏洞檢測測流程進行說明:
S10、載入Android應用的APK(AndroidPackage,Android安裝包)文件;
S11、反編譯該APK文件,得到Android應用的框架結(jié)構(gòu)、語法語句內(nèi)存模型(treemodel)及字符名集合等信息;并將其中每個類的信息將統(tǒng)一轉(zhuǎn)換為smali文件(Android虛擬機所能識別的語言),smali文件存儲著一個類里完整的邏輯;
S12、獲取Android應用的AST和Android虛擬機語言smali源碼;具體的,可將S11所得到的程序結(jié)構(gòu)、treemodel、字符名等信息轉(zhuǎn)換成AST;如可將Android應用分為包、類、方法、邏輯單元、字符名及值等信息,并將這些信息分別定義為AST的各節(jié)點;然后,從應用入口開始,逐步將每種語法元素(treeItem)分別翻譯轉(zhuǎn)換為AST的節(jié)點,填入AST,最終將整個應用構(gòu)建出一個完整的AST;
進一步,還可將AST最終輸出為一個結(jié)構(gòu)化XML文檔,可以讓后續(xù)的漏洞檢測更快捷,簡易;同時可保存AST與smali源碼的映射關(guān)系,方便于信息準確迅速的查找;
S13、遍歷AST中的import節(jié)點,優(yōu)先迭代分析引入的類;
S14、遍歷AST中的類節(jié)點,分析其下的成員變量子節(jié)點,取得成員變量信息;
S15、遍歷AST中的類節(jié)點下的方法子節(jié)點,構(gòu)建每個方法的符號表;
具體的,可遍歷方法節(jié)點下的形參子節(jié)點,獲取形參類型信息;獲取方法節(jié)點下的聲明、賦值、函數(shù)調(diào)用等子節(jié)點,收集變量類型,構(gòu)建變量賦值、函數(shù)調(diào)用值、New值、形參值及返回結(jié)點值等,并保存到符號表結(jié)構(gòu)中;
S16、基于所得到的符號表進行應用漏洞檢測,具體為:
S16.1、基于S15得到的符號表,循環(huán)檢查每個函數(shù)調(diào)用點,先判斷是否為危險函數(shù),若是,則提取關(guān)鍵參數(shù),跳至S16.2;
S16.2、追蹤關(guān)鍵參數(shù)的表達式,根據(jù)節(jié)點類型不同追蹤不同值;若節(jié)點為變量,跳到S16.3;若節(jié)點為函數(shù)調(diào)用,則獲取函數(shù)摘要,追蹤摘要關(guān)聯(lián)的參數(shù)的表達式,跳到S16.2;若節(jié)點為常量值,則返回安全(表示函數(shù)不存在漏洞);若節(jié)點為二元操作,分別追蹤操作數(shù)的表達式,跳到S16.2;若為其他節(jié)點類型,直接追蹤對應子節(jié)點的表達式,跳到S16.2;
S16.3、追蹤變量;判定變量是否為外部輸入變量,若是外部輸入變量,返回危險,若不是外部輸入變量,則判斷變量的類型是否為基本非字符串類型;若變量的類型是基本非字符串類型,則返回安全,若變量的類型不是基本非字符串類型,則從符號表查找變量最近的關(guān)聯(lián)值;若存在該最近的關(guān)聯(lián)值,則根據(jù)關(guān)聯(lián)值的不同類型作相應的不同處理,具體的,如果該最近的關(guān)聯(lián)值為賦值,則跳到S16.2追蹤右值對象,如果該最近的關(guān)聯(lián)值為函數(shù)調(diào)用,則通過函數(shù)摘要獲取該函數(shù)調(diào)用的關(guān)聯(lián)并繼續(xù)追蹤;若不存在該最近的關(guān)聯(lián)值,而且變量是類成員變量,則追蹤該類成員變量,跳到S16.4;若不存在該最近的關(guān)聯(lián)值,且該變量找不到任何關(guān)聯(lián)和定義,則返回危險;
S16.4、追蹤類成員變量,獲取類成員變量最近的關(guān)聯(lián)值或函數(shù)調(diào)用;若獲取到關(guān)聯(lián)值,則根據(jù)關(guān)聯(lián)值的不同類型作相應的不同處理;若獲取到函數(shù)調(diào)用,且該函數(shù)調(diào)用影響該類成員變量,則通過函數(shù)摘要獲取關(guān)聯(lián)關(guān)系,并繼續(xù)追蹤;如果未獲取到關(guān)聯(lián)值也未獲取到函數(shù)調(diào)用,則判斷該類成員變量是否在構(gòu)造函數(shù)或其他方法中被關(guān)聯(lián)為危險,若是返回危險,否則,說明此次追蹤最終關(guān)聯(lián)到該類成員變量;
S17、在通過函數(shù)摘要獲取關(guān)聯(lián)關(guān)系,并追蹤時,執(zhí)行如下流程:
S17.1、摘要到返回值的關(guān)聯(lián),對符號表中收集的每個返回點,追蹤返回表達式,跳到S16.2;若關(guān)聯(lián)到方法形參,則記錄返回值與形參所在位置的關(guān) 聯(lián);若關(guān)聯(lián)到類成員變量,則記錄返回值與類成員變量的關(guān)聯(lián);
S17.2、摘要到參數(shù)的關(guān)聯(lián),則對方法中每個形參變量,依次追蹤其在方法中的數(shù)據(jù)關(guān)聯(lián),對每個形參變量,按照S16.3分析;若關(guān)聯(lián)到其他參數(shù),記錄此參數(shù)與其他參數(shù)的關(guān)聯(lián);若關(guān)聯(lián)到類成員變量,則記錄參數(shù)與類成員變量的關(guān)聯(lián);
S17.3、摘要到類成員變量的關(guān)聯(lián),對每個類成員變量,按照S16.4分析,若追蹤到形參,記錄該類成員變量與形參的關(guān)聯(lián);若關(guān)聯(lián)到其他類成員變量,則記錄該形參與其他類成員變量的關(guān)聯(lián);
S18、跳到S15繼續(xù)分析類的其他方法。
本發(fā)明提升了應用漏洞檢測結(jié)果的準確性,減少了誤報情況的發(fā)生。
下面對本發(fā)明實施例提供的應用漏洞檢測裝置進行介紹,下文描述的應用漏洞檢測裝置可與上文描述的應用漏洞檢測方法相互對應參照。
圖7為本發(fā)明實施例提供的應用漏洞檢測裝置的結(jié)構(gòu)框圖,該裝置可應用于具體數(shù)據(jù)處理能力的計算設備中,如可應用于手機、平板電腦、筆記本電腦等終端設備,也可應用于服務器等網(wǎng)絡側(cè)設備;參照圖7,該裝置可以包括:
目標元素數(shù)據(jù)確定模塊100,用于確定應用的目標組成元素及目標組成元素的組成數(shù)據(jù);
靜態(tài)檢測模塊200,用于對各目標組成元素的各組成數(shù)據(jù)進行漏洞靜態(tài)檢測;
回溯跟蹤模塊300,用于若檢測到存在漏洞的組成數(shù)據(jù),將所檢測到的組成數(shù)據(jù)作為疑似漏洞數(shù)據(jù),對所述疑似漏洞數(shù)據(jù)的數(shù)據(jù)來源進行回溯跟蹤;
漏洞確定模塊400,用于若所回溯跟蹤到的數(shù)據(jù)來源為外部可控的,則確定所述疑似漏洞數(shù)據(jù)為所檢測到的應用漏洞。
可選的,所述目標組成元素可以為類,所述組成數(shù)據(jù)可以為類的方法數(shù)據(jù);對應的,圖8示出了本發(fā)明實施例提供的應用漏洞檢測裝置的另一結(jié)構(gòu)框圖,結(jié)合圖7和圖8所示,目標元素數(shù)據(jù)確定模塊100可以包括:
類數(shù)據(jù)確定單元110,用于確定應用的類及類的方法數(shù)據(jù);
靜態(tài)檢測模塊200可以包括:
函數(shù)靜態(tài)檢測單元210,用于對各類的各方法數(shù)據(jù)中的各函數(shù)調(diào)用點進行 漏洞靜態(tài)檢測;
回溯跟蹤模塊300可以包括:
函數(shù)回溯跟蹤單元310,用于若檢測到存在漏洞的函數(shù)調(diào)用點,將所檢測到的函數(shù)調(diào)用點作為疑似函數(shù)調(diào)用點,根據(jù)函數(shù)邏輯對所述疑似函數(shù)調(diào)用點的數(shù)據(jù)來源進行回溯跟蹤;
漏洞確定模塊400可以包括:
漏洞函數(shù)確定單元410,用于若回溯跟蹤到所述疑似函數(shù)調(diào)用點的數(shù)據(jù)來源關(guān)聯(lián)至外部輸入,則確定所述疑似函數(shù)調(diào)用點為應用中存在漏洞的函數(shù)調(diào)用點。
可選的,圖9示出了本發(fā)明實施例提供的函數(shù)靜態(tài)檢測單元210的一種可選結(jié)構(gòu),參照圖9,函數(shù)靜態(tài)檢測單元210可以包括:
調(diào)用子單元211,用于調(diào)用預設的漏洞規(guī)則文件,所述漏洞規(guī)則文件注冊有危險函數(shù)的特征;
檢測執(zhí)行子單元212,用于將各類的各方法數(shù)據(jù)中的各函數(shù)調(diào)用點對應的函數(shù)的特征,與所述漏洞規(guī)則文件中注冊的危險函數(shù)的特征進行匹配處理;若存在函數(shù)調(diào)用點對應的函數(shù)的特征,與所述漏洞規(guī)則文件中注冊的危險函數(shù)的特征相匹配,則確定所述函數(shù)調(diào)用點為疑似存在漏洞的疑似函數(shù)調(diào)用點。
可選的,圖10示出了本發(fā)明實施例提供的函數(shù)回溯跟蹤單元310的一種可選結(jié)構(gòu),參照圖10,函數(shù)回溯跟蹤單元310可以包括:
提取子單元311,用于提取所述疑似函數(shù)調(diào)用點對應函數(shù)的關(guān)鍵參數(shù);
回溯跟蹤執(zhí)行子單元312,用于根據(jù)函數(shù)邏輯,模擬應用在真實環(huán)境中的數(shù)據(jù)流向,以回溯跟蹤所述關(guān)鍵參數(shù)的數(shù)據(jù)來源。
可選的,本發(fā)明實施例還可以類的樹結(jié)構(gòu)的方式,實現(xiàn)應用漏洞檢測;具體的,可通過構(gòu)建類對應的符號表實現(xiàn)應用漏洞檢測;也在通過應用的AST中讀取類的數(shù)結(jié)構(gòu)的基礎(chǔ)上,以AST的整體樹結(jié)構(gòu)中疑似函數(shù)調(diào)用點可回溯跟蹤的路徑,實現(xiàn)應用漏洞檢測;具體內(nèi)容,可參照上文應用漏洞檢測方法部分的描述,此處不再贅述。
本發(fā)明實施例還提供一種計算設備,該計算設備可以包括上述所述的應用漏洞檢測裝置。具體的,該計算設備可以如手機、平板電腦、筆記本電腦等終端設備,也可如服務器等網(wǎng)絡側(cè)設備。
在本發(fā)明實施例中,計算設備在進行應用漏洞檢測時,先通過漏洞靜態(tài)檢測方式進行疑似漏洞數(shù)據(jù)的檢測,當檢測到疑似漏洞數(shù)據(jù)時,繼續(xù)對所述疑似漏洞數(shù)據(jù)進行深層次的檢測,即對所述疑似漏洞數(shù)據(jù)的數(shù)據(jù)來源進行回溯跟蹤,只有在所回溯跟蹤到的數(shù)據(jù)來源為外部可控時,才確定所述疑似漏洞數(shù)據(jù)為所檢測到的應用漏洞,從而使得最終的應用漏洞檢測結(jié)果的準確性較高,減少了誤報情況的發(fā)生,提升了檢測結(jié)果的準確性。
圖11示出了本發(fā)明實施例提供的計算設備的硬件結(jié)構(gòu)框圖,參照圖11,該計算設備可以包括:處理器1,通信接口2,存儲器3和通信總線4;
其中處理器1、通信接口2、存儲器3通過通信總線4完成相互間的通信;
可選的,通信接口2可以為通信模塊的接口,如GSM模塊的接口;
處理器1,用于執(zhí)行程序;
存儲器3,用于存放程序;
程序可以包括程序代碼,所述程序代碼包括計算機操作指令。
處理器1可能是一個中央處理器CPU,或者是特定集成電路ASIC(Application Specific Integrated Circuit),或者是被配置成實施本發(fā)明實施例的一個或多個集成電路。
存儲器3可能包含高速RAM存儲器,也可能還包括非易失性存儲器(non-volatile memory),例如至少一個磁盤存儲器。
其中,程序可具體用于:
確定應用的目標組成元素及目標組成元素的組成數(shù)據(jù);
對各目標組成元素的各組成數(shù)據(jù)進行漏洞靜態(tài)檢測;
若檢測到存在漏洞的組成數(shù)據(jù),將所檢測到的組成數(shù)據(jù)作為疑似漏洞數(shù)據(jù),對所述疑似漏洞數(shù)據(jù)的數(shù)據(jù)來源進行回溯跟蹤;
若所回溯跟蹤到的數(shù)據(jù)來源為外部可控的,則確定所述疑似漏洞數(shù)據(jù)為所檢測到的應用漏洞。
本說明書中各個實施例采用遞進的方式描述,每個實施例重點說明的都是與其他實施例的不同之處,各個實施例之間相同相似部分互相參見即可。對于實施例公開的裝置而言,由于其與實施例公開的方法相對應,所以描述的比較簡單,相關(guān)之處參見方法部分說明即可。
專業(yè)人員還可以進一步意識到,結(jié)合本文中所公開的實施例描述的各示例的單元及算法步驟,能夠以電子硬件、計算機軟件或者二者的結(jié)合來實現(xiàn),為了清楚地說明硬件和軟件的可互換性,在上述說明中已經(jīng)按照功能一般性地描述了各示例的組成及步驟。這些功能究竟以硬件還是軟件方式來執(zhí)行,取決于技術(shù)方案的特定應用和設計約束條件。專業(yè)技術(shù)人員可以對每個特定的應用來使用不同方法來實現(xiàn)所描述的功能,但是這種實現(xiàn)不應認為超出本發(fā)明的范圍。
結(jié)合本文中所公開的實施例描述的方法或算法的步驟可以直接用硬件、處理器執(zhí)行的軟件模塊,或者二者的結(jié)合來實施。軟件模塊可以置于隨機存儲器(RAM)、內(nèi)存、只讀存儲器(ROM)、電可編程ROM、電可擦除可編程ROM、寄存器、硬盤、可移動磁盤、CD-ROM、或技術(shù)領(lǐng)域內(nèi)所公知的任意其它形式的存儲介質(zhì)中。
對所公開的實施例的上述說明,使本領(lǐng)域?qū)I(yè)技術(shù)人員能夠?qū)崿F(xiàn)或使用本發(fā)明。對這些實施例的多種修改對本領(lǐng)域的專業(yè)技術(shù)人員來說將是顯而易見的,本文中所定義的一般原理可以在不脫離本發(fā)明的精神或范圍的情況下,在其它實施例中實現(xiàn)。因此,本發(fā)明將不會被限制于本文所示的這些實施例,而是要符合與本文所公開的原理和新穎特點相一致的最寬的范圍。