許慶富,談文蓉,王彩霞
(1.西南民族大學計算機科學與技術(shù)學院,四川 成都 610041;2.西南民族大學計算機系統(tǒng)國家民委重點實驗室,四川 成都 610041)
隨著Android系統(tǒng)在手機、TV、物聯(lián)網(wǎng)等領(lǐng)域占有率的日益增長,吸引了大量的應(yīng)用開發(fā)者上線自己的應(yīng)用程序.由于許多應(yīng)用開發(fā)者缺乏安全編碼意識以及國內(nèi)應(yīng)用商店大多沒有進行有效的漏洞檢測措施,導(dǎo)致應(yīng)用程序的漏洞從開發(fā)到上線一直得不到修復(fù),從而容易受到攻擊者破壞給平臺及用戶帶來難以預(yù)估的損失.因此,如何有效的檢測出APK安全風險漏洞成為移動平臺漏洞檢測技術(shù)的重要研究方向[1],結(jié)合漏洞特征分析后利用有效的檢測技術(shù)挖掘已公布的或Zero-day漏洞.
研究漏洞檢測技術(shù)前需要先探究漏洞的成因,由于漏洞形成的復(fù)雜性,實際的漏洞成因都不是僅僅由于Android平臺的開放性或碎片化形成的,通常都是應(yīng)用開發(fā)者安全意識淡薄和用戶的不當使用造成的[2].通過逆向工程對大量的應(yīng)用進行代碼審計分析發(fā)現(xiàn),應(yīng)用開發(fā)者普遍存在對SDK API不合理使用的現(xiàn)象,容易導(dǎo)致AndroidManifest配置有誤、組件暴露等漏洞.即使知曉信息安全意識,卻對密碼學技術(shù)結(jié)構(gòu)的誤解濫用,甚至把MD5消息摘要都理解成加密算法使用,導(dǎo)致開發(fā)出的應(yīng)用程序漏洞百出.盡管Android系統(tǒng)本身也提供了多種機制來保障應(yīng)用程序的安全,譬如sandbox機制大大降低了應(yīng)用本身的攻擊面,系統(tǒng)為每個應(yīng)用程序開辟了一個獨立的Dalvik虛擬機實例,保障了應(yīng)用本身的資源數(shù)據(jù)無法被其它應(yīng)用程序訪問.但是程序運行在用戶未知的系統(tǒng)環(huán)境下,android系統(tǒng)繼承Linux內(nèi)核的UID/GID(用戶組ID)的權(quán)限模型將可能被ROOT超級用戶所修改,再結(jié)合Hook技術(shù)便可對程序進行攻擊,Android應(yīng)用程序的安全性自然就無法保障.同時,AndroidManifest存在很多默認配置,都會導(dǎo)致應(yīng)用漏洞的產(chǎn)生.例如,系統(tǒng)默認將Activity的export屬性置為true,那么很有可能被惡意攻擊者通過其它應(yīng)用調(diào)用,導(dǎo)致用戶隱私數(shù)據(jù)泄露.因此,應(yīng)用開發(fā)者編碼過程的疏忽又缺少對APK包安全隱患的檢測,導(dǎo)致很多應(yīng)用漏洞得不到及時修復(fù),可能直到黑客利用攻擊才被發(fā)現(xiàn).
針對Android應(yīng)用的漏洞檢測問題,國內(nèi)外學者及科研機構(gòu)進行了大量的應(yīng)用安全漏洞檢測技術(shù)相關(guān)的深入研究,普遍采用圖1所示的相關(guān)檢測技術(shù)[3-5].最近國外一名安全研究人員利用路徑可達性發(fā)現(xiàn)微信支付SDK存在XXE漏洞,黑客可竊取賣家的關(guān)鍵安全密鑰,購買東西時通過發(fā)送偽造信息來欺騙賣家而無需付費[6].B.Min等人[7]通過對支持向量機SVM的權(quán)限模型和函數(shù)調(diào)用關(guān)系分析,研究了一種基于機器學習的漏洞檢測模型.P.R.K.Varma等人[8]利用K-means算法對1000個應(yīng)用程序進行聚類分析,實現(xiàn)最小權(quán)限化靜態(tài)漏洞檢測分析框架,待檢測應(yīng)用程序申請的權(quán)值越大,則出現(xiàn)漏洞的可能性越大.P.Faruki等人[9]設(shè)計了檢測工具MimeoDroid,采集程序運行的內(nèi)存使用、網(wǎng)絡(luò)交互、Manifest權(quán)限,來識別應(yīng)用的安全風險.O.S.Adebayo等人[10]使用Apriori算法建立程序代碼調(diào)用API的關(guān)聯(lián)規(guī)則,將組建的函數(shù)調(diào)用關(guān)聯(lián)規(guī)則與待檢測Android程序進行比較,識別應(yīng)用程序中潛在的漏洞.
圖1 應(yīng)用安全漏洞常用檢測方法Fig.1 Common methods of detecting security vulnerabilities
以上研究針對Android應(yīng)用的安全問題提出了各種檢測算法和工具,反映出移動平臺漏洞檢測的技術(shù)正不斷提高,但現(xiàn)有漏洞檢測工具大多只對逆向代碼進行簡單的掃描,缺少涉及深層次的smali關(guān)鍵函數(shù)代碼分析,造成部分漏洞不能有效地被檢測出,尤其是面對著不斷的Android版本迭代更新和漏洞變異,這些漏洞檢測機制的覆蓋面和適用范圍變得不太令人滿意.根據(jù)多家安全檢測廠商(如MWR Labs、騰訊御安全等)調(diào)查報告[11]顯示,Android應(yīng)用程序潛在漏洞數(shù)量大、種類多等特點,單靠安全人員手動分析是不太現(xiàn)實的.而目前有效的Android應(yīng)用漏洞檢測工具極度缺乏,漏洞檢測遠遠不足以滿足市場需求.
為了解決現(xiàn)有檢測方法的漏檢和效率問題,本文提出了一種基于逆向工程的CFG控制流圖模型化特征提取算法和改進ReliefF特征選擇算法相結(jié)合的Android應(yīng)用漏洞檢測技術(shù).從反編譯的smali靜態(tài)代碼段中采集原始特征集合,該特征集合要盡可能的提取待檢測程序中所有有效特征,對漏洞檢測的準確性有直接影響.再通過特征選擇算法對原始特征碼集進行降維處理以提高檢測效率,得到漏洞特征向量集.另外整理分析漏洞呈現(xiàn)的特征和形式,構(gòu)建漏洞特征匹配庫,這樣便可與漏洞特征向量集進行快速匹配,以匹配的相似度來判定應(yīng)用中是否潛在安全問題.
很多應(yīng)用程序通過加固來防止APK包被逆向反編譯,而目前的漏洞檢測技術(shù)大都采用反編譯的靜態(tài)代碼中進行漏洞掃描,沒有脫殼的APK包顯然不能有效的被漏洞掃描檢測,故要先脫殼獲取原始DEX文件.
針對已有的各種DEX文件脫殼技術(shù)[12]進行研究發(fā)現(xiàn),脫殼方案要么只針對Dalvik虛擬機或ART虛擬機上的加固DEX文件,要么脫殼數(shù)據(jù)丟失不足.為了適配大多數(shù)加固的脫殼方案,本文設(shè)計研究了一種內(nèi)存Dump的解決方案.APP程序運行時殼程序都會先脫殼加載原始DEX字節(jié)碼文件,故在當前進程中必然保存著可推斷出原始信息的DEX數(shù)據(jù),只要利用Hook技術(shù)注入到目標程序的運行進程,監(jiān)聽到殼程序的動態(tài)脫殼過程時,運用Memory Dump或重建的技術(shù)手段,從內(nèi)存中攔截提取原始DEX字節(jié)碼文件.
依此原理研究Android系統(tǒng)源代碼尋找Hook入口點,發(fā)現(xiàn)在ClassLoader類加載器中dexFindClass方法動態(tài)傳入脫殼后的DexFile對象,故一旦在內(nèi)存中Hook到該方法,就可以攔截被加固的原DEX字節(jié)碼文件.如圖2所示,利用Hook技術(shù)攔截ClassLoader的dexFindClass函數(shù)調(diào)用轉(zhuǎn)換過程,在DexExtracter類中即可加載被加固DEX字節(jié)碼文件.
圖2 ClassLoader鉤掛脫殼前后函數(shù)調(diào)用過程Fig.2 ClassLoader hook to intercept function call procedure
經(jīng)過上面使用掛鉤獲取APP動態(tài)運行脫殼的DEX文件后,接著就可以針對該DEX文件進行逆向反編譯,需要對DEX文件的編譯打包過程和文件格式有深入的研究[13-15].本文使用shell腳本封裝Apk-Tool、BakSmali和 AXMLPrinter進行自動化反編譯APK包,各逆向工具反編譯的狀態(tài)流程如圖3所示.將Dalvik可執(zhí)行字節(jié)碼反匯編為一種被稱為smali的中間代碼和Manifest文件,進而才能進行后續(xù)的安全性分析.
圖3 APK逆向反編譯轉(zhuǎn)換Fig.3 APK reverse decompile transformation
由上階段將DEX文件反編譯得到smali靜態(tài)代碼段后,需要通過還原smali靜態(tài)代碼的邏輯關(guān)系來充分提取特征之間的屬性值,從中提取漏洞檢測的原始特征碼集是后續(xù)處理的基礎(chǔ).
假設(shè)在AndroidManifest文件和smali靜態(tài)代碼段中,把函數(shù)看成一個節(jié)點,函數(shù)之間的調(diào)用關(guān)系看成節(jié)點連接的有向邊,這樣就可以把函數(shù)調(diào)用關(guān)系及數(shù)據(jù)流抽象成CFG控制流圖的數(shù)據(jù)模型[16].在數(shù)據(jù)模型中的函數(shù)調(diào)用關(guān)系能夠反映程序內(nèi)函數(shù)間的依賴關(guān)系,完整的函數(shù)調(diào)用關(guān)系可以更全面的提取漏洞特征數(shù)據(jù).為此本文針對漏洞特征提取模塊設(shè)計研究出一種基于CFG控制流圖的特征提取模型.
將特征提取的CFG控制流圖存儲為一種抽象的數(shù)據(jù)結(jié)構(gòu):
定義1 函數(shù)(即CFG控制流圖中的節(jié)點)fi的數(shù)據(jù)結(jié)構(gòu)為三元組 fi,j= < fin,fout,feature > ,其中 i表示第i個函數(shù),j表示第j個fi函數(shù)流,即一個函數(shù)節(jié)點同時關(guān)聯(lián)j個函數(shù);fin表示fi節(jié)點的入度;fout表示fi節(jié)點的出度;feature表示函數(shù)fi中提取的特征串.
定義2 漏洞特征碼集D ={<x1,s,w >,<x2,s,w >,..., < xn,s,w >} ,其中 xn表示特征所屬位置;s表示特征串.當漏洞特征為函數(shù)關(guān)系時,s=fi,j, fi,j即定義 1 中的 CFG 節(jié)點;特征提取按照一定的漏洞特征敏感值,賦予每個特征對應(yīng)的權(quán)值w,特征權(quán)值越大,引起漏洞的可能性越大.
圖4是一個Android應(yīng)用程序的部分簡化函數(shù)調(diào)用圖,其中函數(shù)f4有和f5兩個父節(jié)點,一個子節(jié)點f8,故 f4可提取的特征有 f4,1= < f2,f8,null > 和 f4,2= <f5,f8,null > ,則漏洞特征碼集 D = { < f4,1,null,0>, < f4,2,null,0 >} ,其中 null表示當前節(jié)點沒有提取到特征數(shù)據(jù).
圖4 CFG函數(shù)控制流跟蹤Fig.4 CFG function control flow tracking
特征提取采用中斷遞歸遍歷所有可能執(zhí)行的路徑.從程序入口依次深度遍歷,直到遇到多函數(shù)交互的時候,隨機選取被調(diào)函數(shù)的一條執(zhí)行路徑,當該條可執(zhí)行路徑被完全的分析完后,回溯提取分叉路徑上被調(diào)函數(shù)的其它未分析路徑.將遍歷的所有路徑信息存儲到樹結(jié)構(gòu)容器中,提取逆向還原的執(zhí)行邏輯相關(guān)特征,構(gòu)建APK包的漏洞特征碼集D,便于后續(xù)特征選擇的漏洞特征篩選.該模塊的具體原理如算法1所示,首先提取APK包中的Manifest文件來初始化算法入口(第1-3行),取出啟動Activity的分析路徑節(jié)點;然后逐條分析節(jié)點上的語句(第5行),判斷語句類型處理相應(yīng)的邏輯操作(第7-9行).完成一條路徑逆向分析后回溯到該條路徑上被調(diào)函數(shù)的其它未分析語句代碼(第12行);將Node函數(shù)的遍歷過程提取相關(guān)特征更新到整個CFG樹中,繼續(xù)取下一個待分析路徑節(jié)點分析(第13行).
輸入:APK的Manifest配置文件以及入口節(jié)點函數(shù)
輸出:漏洞原始特征碼集D
1)methodAnalysis(entryNodes[]){
2)entryClassList = entryNodes.traversal();
3)curNode = entryClassList.firstNode;
4)parentNode = null;
5)while(entryClassList)
6) for each clazz in entryClassList do
7) switch(clazz.info)
8) case “iput-object”:賦值處理;break;
9) case “invoke-direct”:解析被調(diào)函數(shù);break;
10) case “return”:函數(shù)返回;break;
11) end switch;
12) backtrace(); //回溯分析
13) parentNode.add(curNode);
14)end while
15)}
由特征提取階段得到的原始特征碼集中特征數(shù)量過大,但只有一部分特征數(shù)據(jù)之間的屬性參數(shù)和關(guān)聯(lián)規(guī)則對于最終的漏洞判定有決定作用,因此在原始特征碼集中篩選具有分類能力的特征子集構(gòu)成特征空間,降低特征空間的復(fù)雜度對于提高漏洞檢測的精確性具有明顯效果.還有如果不對原始特征碼集進行特征選擇,原始特征空間就會比較龐大,易造成特征空間維度爆炸問題,從而造成檢測算法效率低下.
針對漏洞特征子集的提取問題,典型有效的策略是采用支持向量機(SVM)檢測算法[17],但原始特征碼集高維的特性,對SVM的分類效率有很大影響.故對檢測模型進行優(yōu)化,本文通過對漏洞特征數(shù)據(jù)相關(guān)性與特征權(quán)值的分析,提出了一種針對多特征數(shù)據(jù)的改進ReliefF算法進行降維匹配.ReliefF算法[18]的基本思想是利用特征提取階段給原始特征碼集的每一個特征賦予特征的敏感權(quán)值,根據(jù)特定規(guī)則迭代數(shù)次更新權(quán)值,最后按權(quán)值大小選擇漏洞特征子集,使得敏感性較強的特征聚類到一個樣本集中,而離散不易出現(xiàn)漏洞的特征樣本.
假定漏洞原始特征碼集D ={<x1,s,w >,<x2,s,w >,…, < xn,s,w >} 中的樣本來自 y 個漏洞類別,其中 xi屬于第 k類( k∈ {1,2,…,|y|} ).則ReliefF算法每次從原始特征碼集D中隨機取出一個特征xi,再從和xi同類的漏洞類別集中選擇k個近鄰特征Hj,其中0<j≤k,接著從y-1個不同漏洞類別集中均選擇k個近鄰特征Mj,其中0<j≤k.根據(jù)以下特征聚類規(guī)則修改Hj和Mj中特征權(quán)值:
dis(xi,Hj) < dis(xi,Mj) ,則該特征 xi對區(qū)分該漏洞類別和y-1類的最近鄰是有用的,增加xi的敏感權(quán)值;
dis(xi,Hj) ≥ dis(xi,Mj) ,則該特征 xi對區(qū)分所屬漏洞類別和y-1個漏洞類別的最近鄰起干擾作用,降低xi的敏感權(quán)值.
上述過程迭代n次,求出原始特征碼集D中各個特征的平均權(quán)值.通過設(shè)定閾值,當特征的平均權(quán)值大于閾值,說明該特征很大可能引發(fā)漏洞,則加入到新的特征子集中,從而起到降維的作用.
然而,上述特征選擇過程并未考慮一個特征屬于多個漏洞類別的情況,所以增加以下兩個選擇條件:
1)增加了權(quán)值更新影響因子 w1,t和 w2,t,表示特征xi對每個漏洞類別的關(guān)聯(lián)關(guān)系,即多個API同時調(diào)用的概率,而無需檢測某API調(diào)用后,其它相關(guān)API被調(diào)用的概率問題;
2)增加了最近鄰多漏洞特征,針對樣本xi所屬k個漏洞類別,用h = {h1,h2,…,hk}表示,遍歷h檢索其類內(nèi)最近鄰Hj和類外最近鄰Mj(C).
注:Mj(C)表示類C?class(H)中第j個最近鄰樣本.
假設(shè)特征xi所屬的各漏洞類別對其影響因子是相等的,將影響因子加入到ReliefF特征敏感權(quán)值修改公式中.在查找最近鄰時,首先找到樣本擁有的t個漏洞類別,記 l= (l1,l2,…,lt) ,然后依次遍歷每個漏洞類別 li(i∈ {1,2,…,t}) ,查找其漏洞類別內(nèi)最近鄰H和類外最近鄰M.這樣就適配了一個特征屬于多個漏洞類別的問題,偽代碼漏洞特征選擇過程描述如下:
輸入:原始特征碼集D,迭代次數(shù)m,漏洞類別數(shù)t,最近鄰特征個數(shù)k.
輸出:最優(yōu)的漏洞特征子集S.
1)初始化特征權(quán)值影響因子 w1,t= 1 , w2,t=1/k,特征權(quán)向量W 置0,即W(A) = 0,A∈{1,2,…,n},n為特征權(quán)向量維數(shù);
2)for i=1 to m do
在原始特征碼集D中隨機選擇特征Ri,記該特征所屬的漏洞類別 class(Ri) = h = {l1,l2,…,lt} ;
3)for j=1 to t do
4)在與特征Ri同類的集合中,遍歷查找k個最近鄰 Hj, j= 1,2,…,k;
5)對每個類C≠hj,計算與Ri不同類lj的k個最近鄰 Mj(C) , j = 1,2,…,k;
6)for A=1 to n do //更新每個特征權(quán)值
7) end for //轉(zhuǎn)步驟 6
8) end for //轉(zhuǎn)步驟 3
9)end for //轉(zhuǎn)步驟 2
10)產(chǎn)生最優(yōu)特征子集S,S=generate(D)
通過改進后ReliefF算法去除原始特征碼集的冗余特征得到漏洞特征子集,后續(xù)與漏洞特征庫進行正則匹配便可挖掘出應(yīng)用中潛在的漏洞信息.
依據(jù)上文研究設(shè)計的核心漏洞檢測算法與技術(shù),實現(xiàn)了基于逆向技術(shù)的Android應(yīng)用漏洞檢測模型以驗證算法的可行性與正確性.該模型由自動化脫殼反編譯、漏洞特征提取、漏洞特征選擇、漏洞庫匹配等主要模塊組成,其系統(tǒng)架構(gòu)如圖5所示.算法由Python語言實現(xiàn),并集成Django框架開發(fā)APK漏洞云檢測平臺.
圖5 基于逆向工程的漏洞檢測模型Fig.5 Vulnerability detection model based on reverse engineering
檢測模型由各個功能模塊層層遞進協(xié)同分析處理.自動化脫殼反編譯模塊是漏洞檢測的預(yù)處理階段,為上層核心的漏洞特征向量化表達提供靜態(tài)代碼段,輸入到特征提取模塊進行分詞截取出原始特征碼集,得到的原始特征碼集經(jīng)特征選擇模塊進一步算法篩選關(guān)聯(lián)后,使漏洞特征向量化構(gòu)成特征空間.最后特征向量化數(shù)據(jù)與AVD漏洞庫進行靜態(tài)正則匹配,發(fā)現(xiàn)相似性高的特征向量化數(shù)據(jù)則可以判定該特征向量化代碼單元存在漏洞,查找AVD漏洞庫相應(yīng)漏洞信息和修復(fù)方案,并從特征向量化數(shù)據(jù)中獲取該漏洞所處的代碼段位置.其中AVD(Android Vulnerabilities Database)漏洞庫由人工分類整理已發(fā)現(xiàn)的Android應(yīng)用漏洞信息,收錄的漏洞按漏洞出現(xiàn)的機制歸類,例如:組件暴露風險攻擊、API誤用、Intent注入等.
各主要模塊的功能如下:
1)逆向反編譯模塊:漏洞檢測模型的最初階段,輸入為APK包文件,對APK進行脫殼反編譯出Manifest文件、資源文件、簽名文件和smali靜態(tài)代碼,輸出該APK包的反編譯逆向數(shù)據(jù).
2)特征提取模塊:將逆向數(shù)據(jù)解析抽象為CFG控制流圖的函數(shù)調(diào)用關(guān)系,分析應(yīng)用內(nèi)部邏輯和程序流程,提取函數(shù)API的相關(guān)屬性特征,輸出漏洞的原始特征碼集.
3)特征選擇模塊:代碼實現(xiàn)特征選擇算法,從原始特征碼集中篩選得到關(guān)鍵特征,降低特征維度數(shù)量,進而構(gòu)建特征空間,輸出特征向量化數(shù)據(jù).
4)AVD漏洞庫和CVE更新模塊:收錄了已公開發(fā)現(xiàn)的Android漏洞特征數(shù)據(jù),并從各大漏洞共享平臺獲取更新漏洞庫數(shù)據(jù).
5)系統(tǒng)匹配模塊:正則對比特征選擇模塊輸出的特征向量化數(shù)據(jù)和AVD漏洞庫提供的漏洞特征信息,判斷應(yīng)用是否存在漏洞,輸出挖掘出的漏洞信息和對應(yīng)的修復(fù)方案.
6)漏洞評估模塊:依據(jù)檢測出的漏洞信息分析該應(yīng)用的風險等級,生成相關(guān)漏洞修復(fù)意見的應(yīng)用漏洞檢測報告,供APK提交者下載.
為了驗證本文研究的漏洞檢測機制的有效性,實驗采用對比策略對檢測模型進行實驗,以客觀反映系統(tǒng)性能和漏洞的檢測精度,檢測精度包括檢測加固dex、SQL注入、日志泄露風險等多漏洞類別驗證.
檢測模型程序部署在2.26GHz主頻的32核數(shù)Intel Xeon處理器和32GB內(nèi)存的工作站,軟件環(huán)境:Windows Server 2012 R2,Python3.5,JDK8.
實驗的測試樣本集包括150個從Google應(yīng)用商店爬取的榜單應(yīng)用和針對漏洞類別構(gòu)造的100個含有漏洞的缺陷應(yīng)用.批量上傳到檢測模型上掃描,對其檢測日志進行統(tǒng)計分析,結(jié)果顯示150個榜單應(yīng)用中出現(xiàn)8個應(yīng)用在掃描過程中出現(xiàn)異常,實際有效檢測樣本數(shù)為142個,主要由于開發(fā)者對APK程序進行保護,導(dǎo)致Python XML DOM庫不能解析異常文件格式.
為驗證檢測模型的系統(tǒng)性能,圖6右側(cè)散點圖統(tǒng)計了應(yīng)用掃描所需的時間,數(shù)據(jù)表明應(yīng)用大小與掃描時間成正相關(guān)的關(guān)系,且市面上應(yīng)用大小普遍在20M-60M之間.靜態(tài)逆向解析過程中,平均掃描時間在10min左右,最慢掃描時間需要20.2min,最快掃描時間也要2.8min,其中掃描加固程序還要加上動態(tài)脫殼耗時,掃描時間比普通程序更長.
為驗證檢測模型的檢測精度,漏洞檢測100個構(gòu)造的缺陷應(yīng)用樣本,然后對所有樣本檢測到的漏洞數(shù)進行統(tǒng)計,統(tǒng)計結(jié)果如表1所示,檢測精度由檢測出的漏洞數(shù)與應(yīng)用中實際存在的漏洞數(shù)的比值.分析原始特征碼集的數(shù)量級與檢測精度的關(guān)系,如圖6左子圖,當特征數(shù)量在一定范圍內(nèi)時,漏洞檢測的精度隨特征數(shù)量的增加而提高,但當特征數(shù)量超過檢測模型的閾值后,漏洞檢測的精度隨特征數(shù)量的增加而變得不太理想.
圖6 實驗樣本漏掃結(jié)果Fig.6 Experimental sample vulnerability scan results
表1 缺陷應(yīng)用檢測結(jié)果Table 1 Vulnerability application scan results
漏洞類型 缺陷應(yīng)用 工具檢測 檢測精度隱式Intent風險 6 6 100%PendingIntent誤用風險 11 10 90.9%Intent Scheme URL攻擊漏洞 13 11 84.6%WebView密碼明文保存漏洞 1 1 100%WebView組件遠程代碼執(zhí)行漏洞 8 7 87.5%WebView忽略SSL證書錯誤 1 1 100%WebView XSS攻擊風險 13 11 84.6%SSL允許所有域名漏洞 12 12 100%信任任意證書漏洞 2 1 50%未使用HTTPS協(xié)議的數(shù)據(jù)傳輸風險 1 1 100%AES/DES弱加密風險 5 5 100%Hash算法不安全 1 1 100%隨機數(shù)使用不當風險 2 2 100%Native動態(tài)調(diào)試漏洞 3 2 66.7%Shell命令風險 10 10 100%Root權(quán)限風險 5 5 100%Zip文件遍歷漏洞 7 6 85.7%
構(gòu)造的缺陷應(yīng)用樣本通過市面上的加固平臺加固保護處理后,檢測程序依然能掃描被加固程序中包含的漏洞,故具有自動化脫殼和掃描隱藏dex文件的能力.從表1可以看出,檢測模型對各漏洞類別所構(gòu)造的缺陷應(yīng)用的平均漏洞檢出率達91%,對于一些較復(fù)雜漏洞檢測需要多特征關(guān)聯(lián)起來判定,當特征數(shù)量級較大時,存在不同特征互相干擾影響檢測結(jié)果,導(dǎo)致漏洞檢測出現(xiàn)漏檢誤報的現(xiàn)象.
實驗總結(jié):檢測模型總體的漏洞檢測性能符合預(yù)期目標,對于大部分常見漏洞都能很好的檢測出來.但對于漏洞庫中沒有的漏洞信息,檢測模型便很難檢測出來,需要及時更新漏洞庫數(shù)據(jù),對于檢測率的提高影響很大.
本文在研究總結(jié)了Android應(yīng)用漏洞檢測技術(shù)的優(yōu)點和不足的基礎(chǔ)上,提出了一種基于逆向工程的應(yīng)用程序漏洞檢測方案,運用內(nèi)存掛鉤技術(shù)實現(xiàn)加固APK脫殼,設(shè)計了CFG控制流圖的特征提取策略并改進ReliefF算法的漏洞特征選擇方法,最后與AVD漏洞庫進行正則匹配便找出對應(yīng)漏洞位置.實驗結(jié)果表明該檢測技術(shù)的漏洞挖掘能力符合預(yù)期要求.下一步針對漏洞庫未知漏洞出現(xiàn)漏檢問題,將通過結(jié)合深度學習的相關(guān)技術(shù),使檢測平臺能夠?qū)崿F(xiàn)對部分未知的漏洞做出預(yù)測.