本發(fā)明涉及移動終端應用安全技術(shù)領(lǐng)域,更具體地涉及一種快速定位android應用軟件中惡意代碼或漏洞的方法。
背景技術(shù):
隨著移動互聯(lián)網(wǎng)的發(fā)展和智能終端設(shè)備的普及,針對手機病毒、盜版應用、垃圾短信、騷擾電話、移動支付等安全問題不斷出現(xiàn)。隨著移動應用數(shù)量的爆發(fā)式增長,應用漏洞層出不窮,應用的重打包更是降低了惡意代碼傳播的技術(shù)門檻,手機病毒、惡意軟件等現(xiàn)象越來越普遍,遭受手機病毒侵害的用戶群體也在逐漸擴大,由于手機病毒具備不易被用戶察覺的特性,導致大多數(shù)用戶即便遭受手機病毒侵害也毫不知情,給智能終端用戶帶來了極大的困擾。
由于安卓應用程序容易逆向,惡意軟件呈現(xiàn)爬坡式增長態(tài)勢。黑客可以通過反編譯合法的應用程序,植入自己的惡意代碼或廣告信息,之后重新打包發(fā)布在第三方android應用市場中牟取利益。這些惡意軟件既擾亂了android應用市場的正常秩序,又給用戶和開發(fā)人員帶來很大的威脅。
針對android平臺的惡意軟件和漏洞帶來了很多負面影響,包括:
1)大多數(shù)惡意軟件植入了大量的廣告影響了用戶的正常使用,有些惡意軟件甚至植入了一些隱藏的惡意代碼,對用戶的隱私和安全造成了威脅;
2)惡意仿冒應用剽竊了原創(chuàng)作者的勞動成果,侵犯了對應合法應用開發(fā)單位(開發(fā)人員)的知識產(chǎn)權(quán),使其損失了廣告收益和用戶口碑;
3)惡意使用者利用廣泛存在的應用漏洞,編寫惡意腳本達到其斂財或隱私竊取目的,對用戶的日常生活和財產(chǎn)安全帶來威脅。
技術(shù)實現(xiàn)要素:
針對上述問題,本發(fā)明提供一種快速定位android應用軟件中惡意代碼或漏洞的方法,能夠?qū)崿F(xiàn)對android平臺上軟件中存在的惡意代碼或漏洞快速定位的高精準性和可擴展性。
根據(jù)以上目的,實現(xiàn)本發(fā)明的技術(shù)方案是:
一種快速定位android應用軟件中惡意代碼或漏洞的方法,其步驟包括:
1)對已知存在惡意代碼或漏洞的android應用軟件進行特征抽取,將已知存在惡意代碼或漏洞的android應用軟件中每個函數(shù)生成一個特征向量,利用得到的特征向量構(gòu)建惡意代碼和漏洞特征庫;
2)對待檢測的目標android應用軟件進行特征提取,將得到的特征向量在惡意代碼和漏洞特征庫中進行相似性比對,當根據(jù)設(shè)定閾值判定二者相似時,則認為該目標android應用軟件存在惡意代碼或漏洞;
3)通過將步驟2)檢測到存在惡意代碼或漏洞的目標android應用軟件與惡意代碼和漏洞特征庫做進一步比對,定位目標android應用軟件中惡意代碼或漏洞存在的具體位置。
進一步地,步驟1)中,通過對已知存在惡意代碼或漏洞的android應用軟件的smali代碼控制流進行抽取并提取每個函數(shù)中指令片段的特征,為下一步函數(shù)特征的提取做好準備。
進一步地,步驟1)中,提取各已知存在惡意代碼或漏洞的android應用軟件的安裝包中存在惡意代碼或漏洞的具體函數(shù)的方法,生成對應的控制流程圖,然后計算每個控制流程圖對應的特征向量。
進一步地,所述控制流程圖中的每一個節(jié)點用一個矢量<v1,v2,v3,v4,v5>及w,n來表示,v1是控制流程圖中節(jié)點的序號,保證每一個節(jié)點只計算一次,v2是節(jié)點內(nèi)函數(shù)的調(diào)用數(shù)量,v3是節(jié)點內(nèi)api的調(diào)用數(shù)量,v4標識節(jié)點內(nèi)是否存在文件讀寫操作,v5標識節(jié)點內(nèi)是否存在網(wǎng)絡(luò)請求,w是節(jié)點內(nèi)指令的數(shù)量,n為節(jié)點個數(shù)。
進一步地,矢量<v1,v2,v3,v4,v5>中分別按照以下規(guī)則一對一的映射到其控制流程圖中:
1)v1的編碼按照如下規(guī)則:第一個節(jié)點的起始值為1。為保證節(jié)點編號的唯一性,如果一個節(jié)點有多個分支,優(yōu)先給子節(jié)點更多的分支節(jié)點編號;如果兩個分支有相同數(shù)量的子節(jié)點,優(yōu)先給含有更多語句的分支節(jié)點編號;依次標注序號后直到cfg的最后一個節(jié)點。最后,我們手動添加一個終止節(jié)點到cfg的末尾。
2)v2的編碼規(guī)則如下:計算節(jié)點內(nèi)函數(shù)的調(diào)用數(shù)量(如節(jié)點內(nèi)不存在函數(shù)調(diào)用,則v2的值置為0)。
3)v3的編碼規(guī)則如下:計算節(jié)點內(nèi)api的調(diào)用數(shù)量(如節(jié)點內(nèi)不存在api調(diào)用,則值為0)。
4)v4的編碼規(guī)則如下:判斷節(jié)點內(nèi)是否存在文件讀寫操作,如存在,則v4=1;如不存在,則v4=0。
5)v5的編碼規(guī)則如下:判斷節(jié)點內(nèi)是否存在文件讀寫操作,如存在,則v5=1,如不存在,則v5=0。
進一步地,用特征向量
cv1的計算方式為:將圖中所有節(jié)點v1的值經(jīng)過權(quán)重運算后求和,最后求其平均值;
cv2的計算方式為:將圖中所有節(jié)點v2的值經(jīng)過權(quán)重運算后求和,最后求其平均值;
cv3的計算方式為:將圖中所有節(jié)點v3的值經(jīng)過權(quán)重運算后求和,最后求其平均值;
cv4的計算方式為:將圖中所有節(jié)點v4的值經(jīng)過權(quán)重運算后求和,最后求其平均值;
cv5的計算方式為:將圖中所有節(jié)點v5的值經(jīng)過權(quán)重運算后求和,最后求其平均值。
進一步地,cv1計算公式如下:
其中,n為控制流程圖中節(jié)點的個數(shù),x和y為圖中任意兩個節(jié)點,wx,wy分別為x節(jié)點,y節(jié)點內(nèi)指令的數(shù)量,v1x和v1y分別為對應節(jié)點的值,e(x,y)標識從x節(jié)點到y(tǒng)節(jié)點存在一條邊,cfg表示該控制流程圖;cv2,cv3,cv4,cv5通過分別將其對應節(jié)點的值代入上述公式中計算。
進一步地,步驟2)中通過計算待檢測的目標android應用軟件的特征向量與惡意代碼和漏洞特征庫中的特征向量的歐氏距離進行相似性比對,當計算得到的兩個特征向量的差異值小于設(shè)定閾值時則判定二者相似。
進一步地,兩個特征向量
其中
n,n’表示節(jié)點個數(shù),w,w’表示節(jié)點內(nèi)指令的數(shù)量,diff值越大,表示兩個特征向量的差異越大,diff值為0是表示兩個特征向量完全相同。
進一步地,步驟1)中,所述惡意代碼和漏洞特征庫中包含惡意代碼和漏洞的存在形式。
進一步地,步驟3)中,根據(jù)目標android應用軟件中與惡意代碼和漏洞特征庫中相似的代碼的位置,定位目標android應用軟件中惡意代碼或漏洞存在的具體位置。
進一步地,步驟3)中定位到目標軟件存在相似惡意代碼或漏洞的情況包括:
(a)惡意代碼和漏洞庫中存在完全一樣的惡意代碼或漏洞;
(b)功能完全相同的惡意代碼,但是目標應用軟件中加入了檢測躲避技術(shù);
(c)相似的漏洞存在于同一個應用軟件的多個不同版本之中;
(d)使用了被已知惡意代碼感染的框架或第三方庫;
(e)使用了存在相似漏洞的框架或第三方庫。
本發(fā)明的有益效果如下:
本發(fā)明提出了一種自底向上的惡意代碼或漏洞的快速定位技術(shù),通過結(jié)合android應用程序的控制流程圖的特點,設(shè)計了一套判定體系來判斷某個應用是否存在特定的惡意代碼或漏洞,從而實現(xiàn)對android應用程序種惡意代碼或漏洞定位的高精準性和可擴展性。
附圖說明
圖1為本發(fā)明中android軟件惡意代碼或漏洞定位的整體流程圖。
圖2為本發(fā)明中一個.smali代碼函數(shù)特征提取流程圖。
圖3為本發(fā)明中一個函數(shù)cfg生成流程圖。
具體實施方式
下面通過具體實施例和附圖,對本發(fā)明做進一步詳細說明。
圖1為本發(fā)明的android軟件惡意代碼或漏洞定位的整體流程圖,具體包括如下步驟:
一、首先是搜集市場上的已出現(xiàn)的惡意代碼應用程序和存在漏洞的應用程序,提取安裝包中的存在惡意代碼或漏洞部分函數(shù)的方法,生成對應的控制流程圖,對于每一個圖形,采用本發(fā)明提出的方法計算其特征向量。
對于android市場上惡意代碼應用程序和存在漏洞的應用程序的搜集以及安裝包中方法的提取和控制流程圖的生成,均可使用現(xiàn)有的工具和技術(shù)完成,此處不再贅述,本發(fā)明主要提出一種以控制流程圖為基礎(chǔ),對程序特征進行提取后抽象為一種可表示的向量的方法,以此為基礎(chǔ)構(gòu)建出惡意代碼和漏洞特征庫。
控制流程圖(controlflowgraph,cfg)表現(xiàn)了程序中各語句之間的控制依賴關(guān)系,本發(fā)明主要從控制依賴方面來抽取控制流程圖的特征。
控制流程圖中每一個節(jié)點對應程序中的一個語句塊,當在節(jié)點n1和n2之間存在一條執(zhí)行路徑時,即存在一條從結(jié)點n1到n2的有向弧。如圖3所示,圖中實線部分表示了示例程序內(nèi)在的控制依賴關(guān)系。
對于控制流程圖(以下簡稱cfg)中的每一個節(jié)點,本發(fā)明定義一個矢量<v1,v2,v3,v4,v5>來表示。其中v1是cfg中的節(jié)點的序號,序號可以保證每一個節(jié)點只計算1次,v2是節(jié)點內(nèi)函數(shù)的調(diào)用數(shù)量,v3是節(jié)點內(nèi)api的調(diào)用數(shù)量,v4標識節(jié)點內(nèi)是否存在文件讀寫操作,v5標識節(jié)點內(nèi)是否存在網(wǎng)絡(luò)請求。其中:
1)v1的編碼按照如下規(guī)則:第一個節(jié)點的起始值為1。為保證節(jié)點編號的唯一性,如果一個節(jié)點有多個分支,優(yōu)先給子節(jié)點更多的分支節(jié)點編號;如果兩個分支有相同數(shù)量的子節(jié)點,優(yōu)先給含有更多語句的分支節(jié)點編號;依次標注序號后直到cfg的最后一個節(jié)點。最后,我們手動添加一個終止節(jié)點到cfg的末尾。
2)v2的編碼規(guī)則如下:計算節(jié)點內(nèi)函數(shù)的調(diào)用數(shù)量(如節(jié)點內(nèi)不存在函數(shù)調(diào)用,則v2的值置為0)。
3)v3的編碼規(guī)則如下:計算節(jié)點內(nèi)api的調(diào)用數(shù)量(如節(jié)點內(nèi)不存在api調(diào)用,則值為0)。
4)v4的編碼規(guī)則如下:判斷節(jié)點內(nèi)是否存在文件讀寫操作,如存在,則v4=1;如不存在,則v4=0。
5)v5的編碼規(guī)則如下:判斷節(jié)點內(nèi)是否存在文件讀寫操作,如存在,則v5=1,如不存在,則v5=0。
通過以上的定義方法,可以把一個cfg中所有節(jié)點一對一的映射到其控制流程圖中。
對函數(shù)特征的提取基于函數(shù)的控制流進行,通過對已知存在惡意代碼或漏洞的android應用軟件的smali代碼控制流進行抽取并提取每個函數(shù)中指令片段特征,進而為下一步函數(shù)特征的提取做好準備。如圖2所示,從.smali文件的入口開始依次按行讀取,在遇到“.class”、“.method”等關(guān)鍵詞時,進行歸類,以函數(shù)為單位得到每個函數(shù)的代碼片段。對于得到的函數(shù)代碼片段,需要對每一條指令進行掃描,構(gòu)建其控制流程圖。
圖3為函數(shù)cfg生成流程圖,虛線框中為smali代碼片段,通過對其分析,將其拆分為2,3,4三個基本塊,cfg中的每個節(jié)點是一個基本塊。下面以圖3為例對該方法進行說明,基于本發(fā)明提出的算法可以得到應用程序中每個函數(shù)的特征向量,將圖中2,3,4節(jié)點經(jīng)過編碼后的節(jié)點坐標為:
節(jié)點2:節(jié)點2內(nèi)函數(shù)的調(diào)用數(shù)量為0,api的調(diào)用數(shù)量為1,存在文件讀寫操作,不存在網(wǎng)絡(luò)請求,則其對應的特征向量為<2,0,1,1,0>
節(jié)點3:略
節(jié)點4:節(jié)點4內(nèi)函數(shù)的調(diào)用數(shù)量為1,api的調(diào)用數(shù)量為0,不存在文件讀寫操作,存在網(wǎng)絡(luò)請求,則其對應的特征向量為<4,1,0,0,1>
cfg中的每個點都是一對一映射,且由上述定義可知其映射方法唯一,故能準確、有效反映出程序cfg的特征,即不同的cfg對應不同的變形圖。由于變形圖的表示形式比較復雜,故本發(fā)明又提出了一種用向量來表示cfg特征的方法:
本發(fā)明用一個向量
1)cv1的計算方式為:將圖中所有節(jié)點v1的值經(jīng)過權(quán)重運算后求和,最后求其平均值,
計算公式如下:
其中,n為控制流程圖中節(jié)點的個數(shù)(下同),x和y為圖中任意兩個節(jié)點,wx,wy分別為x節(jié)點,y節(jié)點內(nèi)指令的數(shù)量,v1x和v1y分別為對應節(jié)點的值,e(x,y)標識從x節(jié)點到y(tǒng)節(jié)點存在一條邊,cfg表示該控制流程圖。
用偽代碼形式表示如下:
2)cv2的計算方式為:將圖中所有的節(jié)點v2的值經(jīng)過權(quán)重運算后求和,最后求其平均值,計算公式如下:
x和y為圖中任意兩個節(jié)點,v2x和v2y分別為對應節(jié)點的值,e(x,y)標識從x節(jié)點到y(tǒng)節(jié)點存在一條邊,cfg表示該控制流程圖。偽代碼形式表示與cv1類似,此處就不再進行偽代碼描述。
3)cv3的計算方式為:將圖中所有的節(jié)點v3的值經(jīng)過權(quán)重運算后求和,最后求其平均值,計算公式如下:
x和y為圖中任意兩個節(jié)點,v3x和v3y分別為對應節(jié)點的值,e(x,y)標識從x節(jié)點到y(tǒng)節(jié)點存在一條邊,cfg表示該控制流程圖。偽代碼形式標識形式與cv1類似。
在上述運算過程中,wx表示控制流程圖中節(jié)點x內(nèi)指令的數(shù)量,圖中的所有節(jié)點都參與了運算,故而向量
cv4,cv5的計算方式與cv1,cv2,cv3類似,此處就不再贅述
對于所有方法的控制流程圖,采用上述方法將其進行特征抽取,再計算其對應的特征向量。又因控制流程圖代表一個方法對應的控制依賴關(guān)系,故每一個特征向量可以代表一個特定的方法的特征。
二、采用上述方法計算出待檢測目標android應用軟件的所有方法的特征向量,然后與惡意代碼與漏洞特征庫中的特征向量進行相似性比對,計算特征之間的差異度,找出差異度低于一定閾值的特征向量,然后即可快速定位出其存在問題的代碼片段(所謂存在問題,指代該待檢測目標應用程序中存在惡意代碼或漏洞)。
本發(fā)明利用特征向量來描述一個方法(即一段問題程序)的特征,這些向量有以下特征:
(a)兩個相同的方法具有相同的特征向量;
(b)兩個不相關(guān)的方法,其cfg圖之間差異也十分明顯,故其特征向量也隨之會存在較大的差別;
(c)兩個相似的方法,其各自的特征向量是在其對應的cfg圖中的每個節(jié)點都參與運算的情形下得到的,當一個方法改變很少時,其特征向量的變化也不會太大。
為區(qū)分兩個方法的相似度,本發(fā)明定義對于兩個方法產(chǎn)生的控制流程圖的特征向量
其中
n,n’表示節(jié)點個數(shù),w,w’表示節(jié)點內(nèi)指令的數(shù)量,diff是用兩個向量之間的歐式距離來表示其差異,diff值越大,表示兩個特征向量的差異越大,即它們所代表的方法差異度越大。diff值為0是表示兩個方法基本完全相同。
通過設(shè)定一個diff閾值,定義低于這一閾值的兩個方法為相似方法,值越小說明兩個方法越相似,在實際的測試當中,我們設(shè)定diff閾值為10%,當兩個方法的差異值小于10%的時候,認為這兩個方法是相似的,進而可由上述算法檢測到存在惡意代碼或漏洞的方法,從而為進一步快速定位惡意代碼或漏洞代碼片段提供了有效篩選和有力保障。
同時,發(fā)明人亦通過實驗驗證了這種方法的準確率,當兩個方法完全一樣,算出的兩個方法的diff值為0;當修改兩個相同方法中的任意一個,在任意位置加入個別語句,算出的兩個方法的diff值在10%之內(nèi);當選擇兩個不相同的方法進行測試,算出的兩個方法的diff值在30%以上。在大量的測試后發(fā)現(xiàn),當兩個方法的diff值在10%以內(nèi)時,兩個方法相似的可能性在99%以上。在方法相似性比較能達到99%準確率的基礎(chǔ)上,應用程序的相似性比較理論上也能達到95%以上。
通過以上方法,如目標應用軟件存在惡意代碼或漏洞,則可實現(xiàn)對惡意代碼或漏洞代碼片段位置的快速定位。
以上對本發(fā)明所提供的快速定位android應用惡意代碼或漏洞的方法進行了詳細介紹,應用具體個例對本發(fā)明的原理及實施方式進行了闡述,以上實施例的說明只是用于幫助理解本發(fā)明的方法及其核心思想,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進等,均應包含在本發(fā)明的保護范圍之內(nèi)。