趙躍華,劉 佳
(江蘇大學(xué) 計(jì)算機(jī)科學(xué)與通信工程學(xué)院,江蘇 鎮(zhèn)江 212013)
隨著手機(jī)平臺(tái)技術(shù)的不斷發(fā)展,針對(duì)各類手機(jī)平臺(tái)的惡意軟件層出不窮,這些惡意軟件已經(jīng)威脅到了手機(jī)用戶的隱私及財(cái)產(chǎn)安全[1]。據(jù)中科院最新調(diào)研報(bào)告顯示,當(dāng)前68.6%的安卓手機(jī)用戶正面臨移動(dòng)安全威脅[2]。
針對(duì)當(dāng)前Android手機(jī)存在的安全威脅,文獻(xiàn)[3]提出了使用代碼混淆的方式對(duì)Dalvik字節(jié)碼程序進(jìn)行保護(hù)的方法,該方法對(duì)代碼的靜態(tài)保護(hù)效果好,但不能防御攻擊者的動(dòng)態(tài)篡改,其防御功能單一,綜合性不足。文獻(xiàn)[4]提出一種Android平臺(tái)代碼保護(hù)方案,該方案對(duì)加密算法的依賴性較強(qiáng),若密鑰被泄露,則該保護(hù)手段能夠被輕松破解。文獻(xiàn)[5]提出一種利用Android本地代碼來產(chǎn)生自修改Dalvik字節(jié)碼的方法,該方法能夠使軟件的破解難度上升,但要是攻擊者直接破解本地代碼,那么仍然無法保證軟件的安全性。
隨著技術(shù)的發(fā)展,各種加固技術(shù)層出不窮,若僅使用一種加固技術(shù)難以抵御各種攻擊,難以保證Android應(yīng)用的安全性。因此,本文考慮采用多種加固技術(shù)組合的方式對(duì)Android應(yīng)用進(jìn)行加固。但是加固技術(shù)多種多樣,不同Android應(yīng)用的特點(diǎn)和加固需求各不相同,怎樣合理地選取加固技術(shù),既能滿足APP的安全加固需求,又能最大限度保證APP的運(yùn)行效率,這對(duì)開發(fā)者及使用者都具有較好的實(shí)際價(jià)值。
未加固的原始APP易遭受逆向、篡改等各種攻擊,手機(jī)中用戶隱私數(shù)據(jù)(通訊錄、個(gè)人信息數(shù)據(jù)、電子郵件等)的泄露問題也更加突出[6]。在對(duì)當(dāng)前APP面臨的攻擊、相應(yīng)加固技術(shù)和文檔自動(dòng)識(shí)別技術(shù)研究分析的基礎(chǔ)上,提出并實(shí)現(xiàn)一種自動(dòng)化的、高效的安卓應(yīng)用加固系統(tǒng)。該系統(tǒng)能夠自動(dòng)識(shí)別APP說明文檔,確定APP加固安全需求,根據(jù)安全需求高效地組合加固技術(shù),實(shí)現(xiàn)對(duì)APP的安全加固,攻擊及其安全加固示意圖如圖1所示。
針對(duì)APP遭受的不同攻擊,分析其對(duì)應(yīng)的加固技術(shù),如表1所示。根據(jù)各加固技術(shù)的攻擊全覆蓋、安全性、效率等因素,以加固安全性高且加固后APP運(yùn)行效率高為目標(biāo),對(duì)加固技術(shù)進(jìn)行篩選、歸類,得到能覆蓋主要攻擊的加固技術(shù)最小集,即加殼、代碼混淆、軟件水印、調(diào)試狀態(tài)監(jiān)測(cè)4種加固技術(shù)。
表1 攻擊及其對(duì)應(yīng)的加固技術(shù)
加殼:將源程序嵌套到殼程序中,這樣源程序就很難被非法修改或反編譯。加殼技術(shù)能有效保護(hù)軟件版權(quán),防止軟件被破解。
代碼混淆:通過插入與功能無關(guān)的代碼和使用晦澀名字重命名類、字段和方法,對(duì)代碼進(jìn)行優(yōu)化和混淆。混淆不影響軟件的正常功能,但是使源碼的可閱讀性大大下降,從而有效保護(hù)軟件源碼。
軟件水印:將版權(quán)保護(hù)信息和身份認(rèn)證信息隱藏在軟件產(chǎn)品中,以鑒別出非法復(fù)制和盜用的軟件產(chǎn)品,達(dá)到有效保護(hù)軟件產(chǎn)品合法傳播的目的。軟件水印技術(shù)主要特點(diǎn)是秘密性、可復(fù)制性、隱藏信息量。
調(diào)試狀態(tài)檢測(cè)法:該技術(shù)原理是檢測(cè)當(dāng)前APP的調(diào)試狀態(tài)是否開啟,是否有進(jìn)程在監(jiān)測(cè)程序的運(yùn)行。其主要作用是防止動(dòng)態(tài)分析、動(dòng)態(tài)調(diào)試攻擊。
APP的說明文檔中包含了豐富的信息,其中的關(guān)鍵詞能反映出該APP的加固需求,如:若有“支付”“購物”等關(guān)鍵詞,說明該APP與支付交易等業(yè)務(wù)相關(guān),則該APP對(duì)安全性要求高,APP對(duì)加固強(qiáng)度的需求也高。本文將關(guān)鍵詞作為紐帶,連接攻擊與對(duì)應(yīng)的加固技術(shù),其關(guān)系如圖2所示。
圖2 常見攻擊、關(guān)鍵詞、加固技術(shù)對(duì)應(yīng)關(guān)系
研究表明,不同種類的APP受到的攻擊及強(qiáng)度不同,因此加固需求也存在一定的差別[7]。首先根據(jù)APP的用途對(duì)APP進(jìn)行分類,根據(jù)以往經(jīng)驗(yàn),可將APP分為金融類、社交類、影音類、游戲類、信息類、其他類[8]。
使用具有公信力且加固技術(shù)已知的APP說明文檔,通過人工統(tǒng)計(jì)的方法,得到每種類型APP的關(guān)鍵詞與其所用的加固技術(shù)和加固強(qiáng)度的對(duì)應(yīng)表,這也是本文在進(jìn)行APP安全級(jí)別判斷及加固技術(shù)選擇時(shí)的依據(jù)。后期在使用的過程中,也將會(huì)根據(jù)新的APP說明文檔不斷完善和更新關(guān)鍵詞表。
需要設(shè)計(jì)關(guān)鍵詞提取算法,對(duì)不同種類的APP分別使用該種APP的說明文檔樣本進(jìn)行訓(xùn)練學(xué)習(xí),訓(xùn)練出針對(duì)不同APP種類的提取模型。在對(duì)APP進(jìn)行加固時(shí),首先使用該APP的提取模型提取出APP說明文檔中的關(guān)鍵詞,然后查詢上述關(guān)鍵詞表,最終確定APP的加固方案。
系統(tǒng)方案如圖3所示,通過提取說明文檔中的關(guān)鍵詞,與1.3節(jié)中的關(guān)鍵詞表相匹配,進(jìn)而得出APP的加固方案,本文的工作重點(diǎn)是APP說明文檔的關(guān)鍵詞提取。
圖3 系統(tǒng)方案圖
對(duì)當(dāng)前流行的關(guān)鍵詞提取技術(shù)進(jìn)行了分類研究,最終確定采用候選詞權(quán)重排序自學(xué)習(xí)的方法進(jìn)行關(guān)鍵詞提取。首先選取APP說明文檔,進(jìn)行分詞處理,之后進(jìn)行關(guān)鍵詞提取算法的訓(xùn)練,最終得出關(guān)鍵詞提取模型。關(guān)鍵詞提取步驟如圖4所示。
圖4 關(guān)鍵詞提取步驟
經(jīng)過分詞,將APP說明文檔原始樣本轉(zhuǎn)化為關(guān)鍵詞提取訓(xùn)練樣本,過程如圖5所示。
圖5 分詞處理過程
weighti=a×tfi+β×loci+γ×disi
(1)
其中,weighti表示候選詞sum的權(quán)重,α、β、γ為3個(gè)調(diào)節(jié)因子。
3.2.1 詞頻
3.2.2 區(qū)域位置
經(jīng)研究發(fā)現(xiàn)[10],詞語出現(xiàn)在首段中比出現(xiàn)在其他段落更能反映文檔主題,摘要中的詞語比正文中的詞語對(duì)文檔主題的貢獻(xiàn)大,而標(biāo)題中的詞語對(duì)文獻(xiàn)主題的貢獻(xiàn)最大。因此,對(duì)于區(qū)域位置loci的計(jì)算,設(shè)wi為根據(jù)分詞位置標(biāo)記的位置值,本文將文本位置區(qū)別為3種情況:標(biāo)題中wi設(shè)置為10.0;摘要或首個(gè)段落wi設(shè)為5.0;其他段落wi設(shè)置為3.0。若詞語在各個(gè)位置都出現(xiàn),則取其最高值。在分詞處理時(shí),就可標(biāo)記詞語的位置值,然后使用規(guī)約化公式式(2)進(jìn)行處理,歸約化是使數(shù)值在(0,1]范圍內(nèi),能夠消除指標(biāo)之間的量綱影響,解決數(shù)據(jù)指標(biāo)之間的可比性。位置值wi經(jīng)過數(shù)據(jù)歸約化處理后,該指標(biāo)處于同一數(shù)量級(jí),適合進(jìn)行綜合對(duì)比評(píng)價(jià)。
(2)
3.2.3 詞距
詞距disi是指文本中詞語首次出現(xiàn)的位置和最后一次出現(xiàn)的位置之間的距離。隨著文本長(zhǎng)度的增加,局部關(guān)鍵詞可能影響文本整體關(guān)鍵詞。因此,為了濾除局部關(guān)鍵詞,將詞距引入關(guān)鍵詞的抽取算法中。根據(jù)以往的實(shí)驗(yàn)分析,采用如下公式計(jì)算候選詞的詞距[11]:
(3)
其中,firi為該分詞第一次出現(xiàn)的位置序號(hào),lasi為該分詞最后一次出現(xiàn)的位置序號(hào),sum為經(jīng)分詞后的文本中候選詞的總數(shù)。
3.2.4 調(diào)節(jié)因子的訓(xùn)練
在確定了計(jì)算3個(gè)特征項(xiàng)值的公式后,需要考慮如何確定調(diào)節(jié)因子α、β、γ,使其更加合理地反映各個(gè)因素對(duì)權(quán)重的貢獻(xiàn)程度。對(duì)每種類型的APP分別進(jìn)行訓(xùn)練,能得出適合本類APP的調(diào)節(jié)因子。本研究采用機(jī)器學(xué)習(xí)最小均方誤差(Minimum Mean Square Error,LMS)訓(xùn)練法訓(xùn)練公式的調(diào)節(jié)因子[12],確定調(diào)節(jié)因子的學(xué)習(xí)過程如圖6所示。學(xué)習(xí)完成后,便得到合適的調(diào)節(jié)因子α、β、γ。
3.2.5 關(guān)鍵詞列表輸出
確定了α、β、γ后,使用式(1)進(jìn)行計(jì)算而得出候選詞的權(quán)重,然后根據(jù)關(guān)鍵詞權(quán)重大小對(duì)詞語進(jìn)行排序,根據(jù)文檔的具體需要選取其中的前若干個(gè)詞語作為文檔的關(guān)鍵詞即可。
當(dāng)有新的APP需要進(jìn)行加固時(shí),首先確定APP的種類,用3.2節(jié)中的關(guān)鍵詞提取方法進(jìn)行關(guān)鍵詞提取。之后查詢關(guān)鍵詞集,得到關(guān)鍵詞與其對(duì)應(yīng)的加固技術(shù)強(qiáng)度。
最后分別得到每個(gè)關(guān)鍵詞對(duì)應(yīng)的加固技術(shù)強(qiáng)度。對(duì)于同種技術(shù)有2個(gè)及以上的關(guān)鍵詞指向時(shí),取其最大值。F(x)的值與加固技術(shù)的選擇具有直接關(guān)系,將加固強(qiáng)度分為3個(gè)等級(jí)(該強(qiáng)度等級(jí)可以根據(jù)APP類型的特點(diǎn)靈活調(diào)整)。加固強(qiáng)度與加固策略的對(duì)應(yīng)關(guān)系如表2所示。
由加固技術(shù)介紹可知,本文所用的4種技術(shù),基本覆蓋了所有的攻擊,并且互相獨(dú)立。在加固實(shí)現(xiàn)時(shí),首先解壓APK,然后分別運(yùn)用不同的加固技術(shù)進(jìn)行加固,最后重打包成APK。下面介紹4種技術(shù)的實(shí)現(xiàn)方法。
調(diào)試狀態(tài)檢測(cè)法通過在源程序中嵌入檢測(cè)代碼的方法實(shí)現(xiàn),該代碼會(huì)在APP啟動(dòng)時(shí)對(duì)proc/xxx/status等進(jìn)行檢測(cè),預(yù)設(shè)情況下status中TracerPid值為0,若不為0,說明程序正處于被調(diào)試狀態(tài),則立即終止程序運(yùn)行。
對(duì)于加殼技術(shù)本文采用代碼碎片化加殼的方法實(shí)現(xiàn)[13],框架圖如圖7所示。該技術(shù)的實(shí)現(xiàn)主要分APK預(yù)處理階段和運(yùn)行時(shí)處理階段2個(gè)階段。在APK預(yù)處理階段,主要是提取資源和處理dex文件。首先,按照dex文件的格式將其分為8個(gè)獨(dú)立的片斷,并用AES算法且使用不同的密鑰對(duì)片斷分別進(jìn)行加密。而運(yùn)行時(shí)處理階段完成加載工作和上下文切換工作。首先,會(huì)將dex文件片分別解密后映射入內(nèi)存中,然后,為了確保正確的解釋并執(zhí)行碎片化的dex文件,需要做一些修復(fù)工作,同時(shí),資源的拷貝工作和Manifest配置工作也在此完成。接著,在分片運(yùn)行中,當(dāng)程序跨片時(shí)執(zhí)行上下文切換工作,從而完整地運(yùn)行整個(gè)dex文件。
圖7 碎片化加殼實(shí)現(xiàn)框架
通過加殼讓被保護(hù)dex文件在其整個(gè)生命周期中,始終以碎片化形式存在于進(jìn)程內(nèi)存中,這就大大降低了完整的dex文件被攻擊者竊取的可能性。
代碼混淆,通常通過打亂程序中數(shù)據(jù)的組織形式,變換程序中的數(shù)據(jù)信息,對(duì)函數(shù)名和變量名進(jìn)行變換,盡可能地破壞見名知義的軟件工程設(shè)計(jì)原則等手段來保護(hù)源代碼,但不會(huì)影響程序的功能。本文采用DEX混淆重組的方式實(shí)現(xiàn)混淆[14],實(shí)現(xiàn)過程如圖8所示。
軟件水印技術(shù),是基于大數(shù)分解難理論,對(duì)軟件加水印是將2個(gè)大數(shù)的乘積嵌入APP,不會(huì)涉及對(duì)軟件其他地方的修改,故將其放在最后一步。本文采用基于動(dòng)態(tài)圖的軟件水印技術(shù)實(shí)現(xiàn)水印[15]。
圖8 混淆算法實(shí)現(xiàn)流程
運(yùn)用本系統(tǒng)對(duì)APP加固是為了保證APP的安全性,但又不能對(duì)其本身的功能和效率造成影響,即要保證加固前后功能流程完全一致。運(yùn)用本系統(tǒng)以金融類APP為例,從關(guān)鍵詞提取準(zhǔn)確性、安全性和性能三方面對(duì)方案效果進(jìn)行分析。
用具有公信力且加固技術(shù)已知的APP說明文檔,通過人工統(tǒng)計(jì),得到關(guān)鍵詞與其所用的加固技術(shù)的關(guān)聯(lián)關(guān)系,這也是本文在進(jìn)行APP安全級(jí)別判斷及加固技術(shù)選擇時(shí)的依據(jù)。
由于統(tǒng)計(jì)出的關(guān)鍵詞數(shù)量較多,表3給出的是金融類APP部分關(guān)鍵詞與其對(duì)應(yīng)的加固技術(shù)的示例。其中,0表示該關(guān)鍵詞與此加固技術(shù)不存在關(guān)聯(lián)關(guān)系,1表示該關(guān)鍵詞與此加固技術(shù)存在弱關(guān)聯(lián)關(guān)系,3表示該關(guān)鍵詞與此加固技術(shù)存在強(qiáng)關(guān)聯(lián)關(guān)系。
表3 金融類APP部分關(guān)鍵詞與其對(duì)應(yīng)的加固技術(shù)關(guān)系
以金融類APP為例進(jìn)行說明,其他種類的APP與此類似。選用60份金融類APP的說明文檔,選取其中50個(gè)說明文檔作為訓(xùn)練樣本,選取其中10個(gè)說明文檔作為測(cè)試樣本。使用訓(xùn)練樣本,通過機(jī)器學(xué)習(xí)最小均方誤差(Least Mean Square,LMS)訓(xùn)練法訓(xùn)練式(1)中的調(diào)節(jié)因子,然后使用測(cè)試樣本來驗(yàn)證本關(guān)鍵詞提取方法的正確性。
將訓(xùn)練樣本輸入,通過學(xué)習(xí)系統(tǒng)訓(xùn)練出一組適合金融類APP的調(diào)節(jié)因子,如表4所示。
表4 金融類APP的調(diào)節(jié)因子
然后將測(cè)試樣本輸入,使用上述調(diào)節(jié)因子,提取出關(guān)鍵詞。并將提取出的關(guān)鍵詞與其文檔已知的關(guān)鍵詞進(jìn)行比較,得出提取準(zhǔn)確率,如表5所示,平均準(zhǔn)確率為84%。由于說明文檔篇幅過短,“值得買”APP的識(shí)別準(zhǔn)確率偏低。
表5 關(guān)鍵詞提取準(zhǔn)確率
關(guān)鍵詞提取完后,可通過查詢金融類APP關(guān)鍵詞與其對(duì)應(yīng)的加固技術(shù)關(guān)系表,獲得每個(gè)APP的加固技術(shù)方案。通過本系統(tǒng)得出的加固方案與APP已知的加固方案比較而得基本相符,這也進(jìn)一步驗(yàn)證了本文方案的可行性。
由于關(guān)鍵詞提取操作是一個(gè)預(yù)處理過程,因此,只需分析APP加固前后功能和運(yùn)行效率的變化。運(yùn)用本文設(shè)計(jì)的系統(tǒng)對(duì)10個(gè)APP樣本進(jìn)行加固,在魅藍(lán)3s真機(jī)上進(jìn)行測(cè)試,對(duì)比加固前后APP的大小、啟動(dòng)時(shí)間和運(yùn)行正確性,對(duì)照表如表6所示。APP大小通過直接查詢的方式獲得,APP啟動(dòng)所需的時(shí)間通過adb logcat抓取APP啟動(dòng)時(shí)的log而獲取。加固后APP平均增加5.07%,啟動(dòng)時(shí)間增加32.78%。
表6 加固前后系統(tǒng)性對(duì)照
由表6中數(shù)據(jù)可以看出,在保證APP正確運(yùn)行的情況下,加固后APP的大小增加在5%左右,這是Android系統(tǒng)可以接受的范圍;啟動(dòng)時(shí)間平均增加了32%左右,這對(duì)用戶的使用體驗(yàn)來說,影響不大。
本文設(shè)計(jì)了一種加固系統(tǒng),在保證APP運(yùn)行效率的基礎(chǔ)上,高效地實(shí)現(xiàn)了APP的安全加固。本文方法能夠較準(zhǔn)確地把握APP的加固需求,綜合了各種技術(shù)的優(yōu)點(diǎn),相對(duì)于使用單一的技術(shù)來說,更加靈活和安全。APP加固后能夠抵御靜態(tài)分析、反編譯等各種攻擊,對(duì)軟件作者及用戶來說都具有較好的實(shí)際價(jià)值。未來可將詞語的均勻度也作為一個(gè)量化指標(biāo)用在關(guān)鍵詞提取中,這樣能夠進(jìn)一步提高關(guān)鍵詞提取的準(zhǔn)確性,進(jìn)而更加精確地確定APP的加固需求。
[1] 劉瀟逸,崔 翔,鄭東華,等.一種基于Android系統(tǒng)的手機(jī)僵尸網(wǎng)絡(luò)[J].計(jì)算機(jī)工程,2011,37(22):1-4.
[2] 鮑可進(jìn),彭 釗.一種擴(kuò)展的Android應(yīng)用權(quán)限管理模型[J].計(jì)算機(jī)工程,2012,38(18):57-64.
[3] KOVACHEVA A.Efficient Code Obfuscation for Android[C]//Proceedings of International Conference on Advances in Information Technology.Berlin,Germany:Springer,2013:104-119.
[4] 張 鵬.增強(qiáng)本地代碼安全性的Android軟件保護(hù)方法[J].北京郵電大學(xué)學(xué)報(bào),2015,38(1):21-25.
[5] SCHULZ P.Android Security Analysis Challenge Tamper-ing Dalvik Byte Code During Run-time [EB/OL].(2013-04-24).https://goo.gl/07QBou.
[6] 楊廣亮,龔曉銳,姚 剛,等.一個(gè)面向Android的隱私泄露檢測(cè)系統(tǒng)[J].計(jì)算機(jī)工程,2012,38(23):2-6.
[7] 張 震,張 龍.Android平臺(tái)的Native層加固技術(shù)研究與實(shí)現(xiàn)[J].計(jì)算機(jī)與現(xiàn)代化,2016(10):88-91.
[8] 蘭 焱.基于應(yīng)用分類的Android隱私保護(hù)模型的設(shè)計(jì)與實(shí)現(xiàn)[D].西安:西安電子科技大學(xué),2014.
[9] 管瑞霞.TFLD:一種中文文本關(guān)鍵詞自動(dòng)提取方法[J].機(jī)電工程,2010,27(9):123-127.
[10] 謝 晉.基于詞語跨度的中文文本關(guān)鍵詞提取及在文本分類中的應(yīng)用[D].杭州:浙江工業(yè)大學(xué),2011.
[11] 丁卓冶.面向主題的關(guān)鍵詞抽取方法研究[D].上海:復(fù)旦大學(xué),2013.
[12] MEHER P K,SANG Y P.Critical-path Analysis and Low-complexity Implementation of the LMS Adaptive Algorithm[J].IEEE Transactions on Circuits and Systems,2014,61(7):778-788.
[13] 樊如霞,房鼎益,湯戰(zhàn)勇,等.一種代碼碎片化的Android應(yīng)用程序防二次打包方法[J].小型微型計(jì)算機(jī)系統(tǒng),2016,37(9):1970-1972.
[14] 文偉平,張 漢,曹向磊.基于Android可執(zhí)行文件重組的混淆方案的設(shè)計(jì)與實(shí)現(xiàn)[J].信息網(wǎng)絡(luò)安全,2016(5):71-77.
[15] 雷 敏,楊 榆,胡若翔,等.基于動(dòng)態(tài)圖的軟件水印算法[J].成都信息工程大學(xué)學(xué)報(bào),2015,30(2):173-175.