何 鍇 琦
(吉林大學(xué) 大數(shù)據(jù)和網(wǎng)絡(luò)管理中心,長春 130012)
隨著移動(dòng)應(yīng)用(app)的快速發(fā)展,人們已經(jīng)習(xí)慣通過手指的簡(jiǎn)單操作完成各種事務(wù).不僅包括簡(jiǎn)單的網(wǎng)上交流和游戲,也包括一些安全敏感性的活動(dòng),如電子銀行和商務(wù)處理等.在這種應(yīng)用環(huán)境下,用戶不再只關(guān)注于移動(dòng)app功能方面的體驗(yàn),而是越來越重視自己的隱私信息安全.
移動(dòng)應(yīng)用需要使用智能手機(jī)上的敏感信息以實(shí)現(xiàn)產(chǎn)品功能,在使用這些敏感信息前,移動(dòng)應(yīng)用需要向用戶申請(qǐng)相應(yīng)的權(quán)限才能訪問敏感數(shù)據(jù).考慮到具有類似功能的產(chǎn)品應(yīng)該使用相似的敏感權(quán)限[1-3],并且移動(dòng)應(yīng)用的功能信息與權(quán)限信息可通過挖掘其UI(user interface)和代碼有效地獲取,因此本文提出一種分析移動(dòng)應(yīng)用安全性的方法.首先,通過分析產(chǎn)品的UI挖掘移動(dòng)應(yīng)用具有的功能信息;然后,通過分析代碼中使用的API確定移動(dòng)應(yīng)用實(shí)際使用的敏感權(quán)限;最后,將具有類似功能的產(chǎn)品聚類到一起,使用孤立森林算法識(shí)別每個(gè)簇中異常使用了敏感權(quán)限的應(yīng)用,進(jìn)而完成安全性分析.
為支持后續(xù)app產(chǎn)品的安全分析工作,首先需要了解每個(gè)app具有的功能.受UI測(cè)試工具的啟發(fā)[4],本文開發(fā)一個(gè)UI探索工具完成挖掘app功能的任務(wù).
用戶是通過各種動(dòng)作與app產(chǎn)品進(jìn)行交互的(如點(diǎn)擊、滑動(dòng)和編輯等).本文UI探索工具基于該原理分析app的apk文件,進(jìn)而獲取其具有的功能.將apk文件作為輸入,UI探索工具首先以app產(chǎn)品的一個(gè)UI頁面為起始點(diǎn),嘗試識(shí)別當(dāng)前UI頁面的可進(jìn)行交互的UI組件,并且通過分析這些組件的屬性推測(cè)它們具有的交互功能.然后,該工具模擬人類動(dòng)作觸發(fā)相應(yīng)的UI事件,從而自動(dòng)化地探索app產(chǎn)品的不同部分.在該過程中,工具可以收集app產(chǎn)品的UI截圖.以圖1為例,本文工具從UI-1出發(fā),通過模擬動(dòng)作滑動(dòng)和兩次點(diǎn)擊依次跳轉(zhuǎn)到UI-2,UI-3和UI-4,從而收集到該app產(chǎn)品的4個(gè)UI截圖.

圖1 UI探索工具探索app產(chǎn)品的UI截圖實(shí)例Fig.1 UI explorer tool explores UI screenshot instances of app products
在探索過程中,使用UI Automator導(dǎo)出每個(gè)頁面對(duì)應(yīng)的xml文件.UI Automator是安卓平臺(tái)提供的界面測(cè)試框架,UI Automator中提供了dump功能,該功能可用于導(dǎo)出移動(dòng)應(yīng)用當(dāng)前的UI運(yùn)行時(shí)前端代碼,該代碼以xml文件格式展示.該前端代碼對(duì)應(yīng)的xml文件的形式可參考圖2中的示例,圖2的左側(cè)展示了一個(gè)UI截圖,右側(cè)是其對(duì)應(yīng)的xml文件.

圖2 一個(gè)UI截圖及其對(duì)應(yīng)的xml文件Fig.2 A UI screenshot and its corresponding xml file
由圖2可見,xml由很多節(jié)點(diǎn)(node)按層次結(jié)構(gòu)進(jìn)行組織.每個(gè)節(jié)點(diǎn)都有一系列屬性,例如: text屬性代表該節(jié)點(diǎn)的文本標(biāo)簽;class屬性反應(yīng)了該節(jié)點(diǎn)的類型;clickable節(jié)點(diǎn)反應(yīng)了該節(jié)點(diǎn)是否是可點(diǎn)擊的.這些node有ViewGroup類型的(如FrameLayout),也有View類型的(如ImageView,TextView).通過分析該文件,可以獲取UI頁面中具有的組件、組件的屬性以及這些組件的層次結(jié)構(gòu).
基于這些xml文件,可以分析UI截圖上提供的功能.通過實(shí)際觀察app產(chǎn)品,絕大多數(shù)提供功能的UI組件都是通過點(diǎn)擊方式進(jìn)行的(在本文觀察的與功能相關(guān)組件中,97%的UI組件激發(fā)動(dòng)作是點(diǎn)擊).相應(yīng)地,在分析xml文件時(shí),也僅分析可點(diǎn)擊屬性為true的UI組件.為了解某個(gè)可點(diǎn)擊組件實(shí)現(xiàn)的功能,本文制定4條分析規(guī)則用于對(duì)可點(diǎn)擊組件進(jìn)行分析,規(guī)則如下.
規(guī)則1) 若可點(diǎn)擊UI組件的text屬性不為空,則text屬性的值為該組件的功能.Text屬性用于設(shè)置顯示在UI組件上的文字,通過組件上的文字,用戶能了解與該組件實(shí)現(xiàn)的功能.如圖3(A)所示,藍(lán)框圈出的按鈕用于實(shí)現(xiàn)Send功能,該按鈕的text屬性值為Send.
規(guī)則2) 若可點(diǎn)擊UI組件為ViewGroup類型的組件,則使用其子節(jié)點(diǎn)的text值作為該組件的功能.ViewGroup類型的組件是用于存放其他UI組件的布局容器.當(dāng)這類組件的clickable屬性為true時(shí),其子節(jié)點(diǎn)的text屬性值可用于說明點(diǎn)擊該ViewGroup組件所實(shí)現(xiàn)的功能.如圖3(B)所示,藍(lán)框圈出的ViewGroup組件具有兩個(gè)子節(jié)點(diǎn),由第二個(gè)子節(jié)點(diǎn)的text屬性可知該組件實(shí)現(xiàn)的功能是Translate.
規(guī)則3) 若可點(diǎn)擊UI組件為圖片組件(ImageView,ImageButton),則使用其相鄰節(jié)點(diǎn)的text屬性作為組件的功能.當(dāng)可點(diǎn)擊組件為圖片組件時(shí),圖片旁邊的相鄰節(jié)點(diǎn)通常會(huì)給出描述性文字用于對(duì)圖片對(duì)應(yīng)的功能進(jìn)行說明.如圖3(C)所示,通過分析相鄰節(jié)點(diǎn)可知,藍(lán)框部分圈出的ImageView組件的功能是Camera.
規(guī)則4) 若通過以上規(guī)則無法獲取有效的功能信息,則對(duì)UI組件的id屬性進(jìn)行分析,從而獲得組件的功能.為保證開發(fā)時(shí)的代碼便于閱讀和理解,開發(fā)者通常會(huì)使用能表現(xiàn)組件功能的文本作為組件的id值.因此,通過對(duì)組件的id值進(jìn)行分析可獲得組件代表的功能.如圖3(A)所示,通過對(duì)組件id進(jìn)行分析,可知紅框圈出的組件功能為choose stickers.

圖3 UI組件及其對(duì)應(yīng)的頁面UI代碼Fig.3 UI component and its corresponding page UI code
對(duì)于一個(gè)app,先使用UI探索工具遍歷獲得它具有的頁面及對(duì)應(yīng)的xml文件后,再根據(jù)以上4條規(guī)則對(duì)每個(gè)頁面的xml文件進(jìn)行分析.這樣就能獲得一個(gè)app所具有的功能.
由于同一個(gè)功能在不同的app中會(huì)有不同的表述方式,因此需要對(duì)提取出的功能進(jìn)行聚類.首先,將功能轉(zhuǎn)換成向量: 給定一個(gè)功能,使用BERT[5]將功能中的單詞依次轉(zhuǎn)換成詞向量,取所有單詞詞向量的平均值作為該功能的向量表示.BERT是基于Transformer架構(gòu)的用于自然語言處理的預(yù)訓(xùn)練技術(shù).與基于word embedding的word2vec[6]相比,BERT在為單詞生成詞向量時(shí),會(huì)考慮單詞出現(xiàn)的上下文.例如,詞“蘋果”的word2vec詞向量在“我愛吃蘋果”和“我買了一部蘋果手機(jī)”中相同.而BERT則會(huì)根據(jù)上下文的不同含義提供不同的詞向量.完成功能的向量化后,使用Mean shift算法[7]對(duì)功能向量進(jìn)行聚類.Mean shift算法是一種基于聚類中心的聚類算法,與傳統(tǒng)的k-means[8]聚類算法相比,Mean shift算法不需要提前設(shè)置聚類的類別個(gè)數(shù)k,能較好處理聚類個(gè)數(shù)未知的情形.對(duì)于給定d維空間d中的n個(gè)樣本點(diǎn)xi(i=1,2,…,n),對(duì)于x點(diǎn),其Mean shift的向量形式為

(1)
其中:

(2)
G(x)是一個(gè)單位的核函數(shù);H是一個(gè)正定的對(duì)稱d×d矩陣,稱為帶寬矩陣,是一個(gè)對(duì)角矩陣;w(xi)≥0是每個(gè)樣本的權(quán)重.對(duì)角矩陣H的形式為

(3)
完成app的功能分析后,先基于app的功能進(jìn)行風(fēng)險(xiǎn)app檢測(cè)工作,過程如圖4所示.

圖4 風(fēng)險(xiǎn)app檢測(cè)過程Fig.4 Detection prosess of risk app
首先,根據(jù)app具有的功能為其建立一個(gè)功能向量,并使用Mean shift算法對(duì)app進(jìn)行聚類.App的功能向量建立過程如圖4(A)所示,app功能向量的維數(shù)與集合中的功能簇?cái)?shù)量一致,向量中的每個(gè)元素與集合中的每個(gè)功能簇具有對(duì)應(yīng)關(guān)系.將app中具有的功能與集合中的功能簇依次進(jìn)行比較,若app擁有簇中的某個(gè)功能,則將該簇對(duì)應(yīng)維的值設(shè)為1,否則設(shè)為0.基于Mean shift算法完成聚類工作后,可得到一個(gè)app的簇集合,屬于同一個(gè)簇的app具有相似功能.
其次,利用孤立森林(isolation forest,iForest)算法[9]對(duì)每個(gè)簇進(jìn)行分析,以識(shí)別出可能異常使用了敏感權(quán)限的風(fēng)險(xiǎn)app產(chǎn)品.iForest是一種無監(jiān)督異常檢測(cè)算法,廣泛應(yīng)用于數(shù)據(jù)的異常檢測(cè)中,如網(wǎng)絡(luò)安全中的攻擊檢測(cè)、金融交易欺詐檢測(cè)、疾病偵測(cè)和噪聲數(shù)據(jù)過濾等.孤立森林算法的理論基礎(chǔ)有兩點(diǎn): 1) 異常數(shù)據(jù)占總樣本量的比例很小;2) 異常點(diǎn)的特征值與正常點(diǎn)的差異很大.基于上述理論基礎(chǔ),查找異常點(diǎn)的策略如下: 假設(shè)用一個(gè)隨機(jī)超平面切割數(shù)據(jù)空間,切一次可以生成兩個(gè)子空間.然后再繼續(xù)用一個(gè)隨機(jī)超平面切割每個(gè)子空間,循環(huán)進(jìn)行,直到每個(gè)子空間中只有一個(gè)數(shù)據(jù)點(diǎn)為止.那些密度很高的簇被切割很多次才能停止,即每個(gè)點(diǎn)都單獨(dú)存在于一個(gè)子空間內(nèi).但那些密度很低的點(diǎn)會(huì)很早停止切割.如何對(duì)數(shù)據(jù)空間進(jìn)行切割是孤立森林設(shè)計(jì)的核心思想.iForest由t個(gè)孤立樹(isolation tree,iTree)組成,每個(gè)iTree是一個(gè)二叉樹結(jié)構(gòu).iTree的訓(xùn)練算法如下.
算法1iTree(X′)算法.
輸入:X′;
輸出: iTree;
步驟1) ifX′不能被分割 then
步驟2) return exNode{Size←|X′|};
步驟3) end
步驟4) else
步驟5) 設(shè)Q為X′中屬性的列表;
步驟6) 隨機(jī)選擇一個(gè)屬性q∈Q;
步驟7) 在X′中的屬性q的最大值和最小值之間隨機(jī)選擇一個(gè)分割點(diǎn)p;
步驟8)Xl←filter(X′,q
步驟9)Xr←filter(X′,q≥p);
步驟10) return inNode{Left←iTree(Xl),right←iTree(Xr)},SplitAtt←q,SplitValue←p};
步驟11) end.
1) 從訓(xùn)練數(shù)據(jù)中隨機(jī)選擇Ψ個(gè)樣本點(diǎn)作為子樣本,放入樹的根節(jié)點(diǎn);
2) 隨機(jī)指定一個(gè)維度,在當(dāng)前節(jié)點(diǎn)數(shù)據(jù)中隨機(jī)產(chǎn)生一個(gè)切割點(diǎn)p(切割點(diǎn)產(chǎn)生于當(dāng)前節(jié)點(diǎn)數(shù)據(jù)中指定維度的最大值和最小值之間);
3) 以此切割點(diǎn)生成一個(gè)超平面,然后將當(dāng)前節(jié)點(diǎn)數(shù)據(jù)空間劃分為兩個(gè)子空間: 把指定維度中小于p的數(shù)據(jù)放在當(dāng)前節(jié)點(diǎn)的左邊,把大于等于p的數(shù)據(jù)放在當(dāng)前節(jié)點(diǎn)的右邊;
4) 在子節(jié)點(diǎn)中遞歸步驟2)和3),不斷構(gòu)造新的子節(jié)點(diǎn),直到子節(jié)點(diǎn)中只有一個(gè)數(shù)據(jù)(無法再繼續(xù)切割)或子節(jié)點(diǎn)已到達(dá)限定高度.
同一個(gè)簇的app具有相似的功能,相應(yīng)地,這些產(chǎn)品也應(yīng)該使用類似的敏感權(quán)限.安卓官方文檔將28個(gè)權(quán)限定義為敏感權(quán)限,這些權(quán)限涉及到用戶的隱私及安全問題,例如短信權(quán)限、位置權(quán)限等.獲得app使用權(quán)限的一種方式是從apk的manifest文件中的權(quán)限聲明部分直接獲取.但研究表明30%的app聲明權(quán)限會(huì)比實(shí)際使用的權(quán)限更多[10].為避免這種分析方法帶來的誤差,本文通過分析app中實(shí)際調(diào)用的API進(jìn)一步獲得其使用權(quán)限.本文使用安卓靜態(tài)分析工具androguard(https://github.com/androguard/androguard)對(duì)apk文件進(jìn)行反編譯,并獲取程序中調(diào)用的API.論文PScout[11]為安卓應(yīng)用的API與權(quán)限之間建立了映射關(guān)系,從而為根據(jù)調(diào)用API獲得其使用權(quán)限提供了基礎(chǔ): 若app調(diào)用了與某個(gè)權(quán)限有映射關(guān)系的API,則該app使用了此權(quán)限.根據(jù)app對(duì)這28個(gè)敏感權(quán)限的使用情況,為每個(gè)app生成一個(gè)28維的權(quán)限向量,向量中每個(gè)元素代表該app是否使用了相應(yīng)的敏感權(quán)限: 1表示使用了相應(yīng)的權(quán)限;0表示未使用.完成上述工作后,再使用孤立森林算法對(duì)獲取的向量進(jìn)行處理,以識(shí)別出其中的異常點(diǎn),進(jìn)而判斷app是否異常使用了敏感權(quán)限.孤立森林算法會(huì)為每個(gè)app生成一個(gè)位于[0,1]內(nèi)的異常得分,異常得分越接近于1,說明該app的權(quán)限使用情況越異常.本文將異常得分高于0.5的app識(shí)別為風(fēng)險(xiǎn)app.
下面通過實(shí)驗(yàn)對(duì)上述方法進(jìn)行驗(yàn)證.本文從Google play應(yīng)用商店中選取4個(gè)類別的app作為研究對(duì)象,這4個(gè)類別分別為Social,Photograph,Music&Audio,Navigation.分別從這4個(gè)類別中隨機(jī)選取1 000個(gè)app,組成一個(gè)共包含4 000個(gè)app的集合.按照本文方法對(duì)該集合中的app進(jìn)行分析,從而識(shí)別出其中的風(fēng)險(xiǎn)app.對(duì)于每個(gè)類別,從中隨機(jī)選取20個(gè)被本文方法識(shí)別為風(fēng)險(xiǎn)的app和20個(gè)被識(shí)別為安全的app作為實(shí)驗(yàn)的測(cè)試集.
建立完實(shí)驗(yàn)測(cè)試集后,由3個(gè)具有安卓應(yīng)用開發(fā)經(jīng)驗(yàn)的開發(fā)者對(duì)測(cè)試集中app的安全性進(jìn)行評(píng)估.首先,為開發(fā)者提供app的描述文本信息,通過分析API得到的app使用的權(quán)限列表以及app的apk安裝包,開發(fā)者閱讀描述文本和權(quán)限列表后,將apk安裝到手機(jī)上進(jìn)行實(shí)際操作和使用.然后,開發(fā)者判斷該app是否異常使用了敏感權(quán)限,若使用了則標(biāo)記為風(fēng)險(xiǎn)app,否則標(biāo)記為安全app.若3名開發(fā)者對(duì)同一個(gè)app的標(biāo)記情況不一致,則3人進(jìn)行討論并得到最終標(biāo)記結(jié)果.將本文方法得到的識(shí)別結(jié)果與實(shí)驗(yàn)人員的標(biāo)記結(jié)果進(jìn)行比較以評(píng)估本文方法的有效性.
表1列出了風(fēng)險(xiǎn)app識(shí)別方法的評(píng)估結(jié)果.實(shí)驗(yàn)結(jié)果表明,本文方法能完成app的安全分析工作: 利用本文方法得到的80個(gè)風(fēng)險(xiǎn)app中,超過半數(shù)的app(65.00%)被開發(fā)者標(biāo)記為風(fēng)險(xiǎn)app;利用本文方法獲得的80個(gè)安全app中,有72個(gè)被開發(fā)者標(biāo)記為安全應(yīng)用程序.有28個(gè)安全app被本文方法錯(cuò)誤地識(shí)別為風(fēng)險(xiǎn)app,對(duì)這些app進(jìn)行分析并總結(jié)了分析錯(cuò)誤的主要原因: 某些app使用了大量的圖標(biāo)用于表示產(chǎn)品中的功能,這些圖標(biāo)周圍并未給出對(duì)圖標(biāo)功能的說明性文本,從而導(dǎo)致本文方法無法準(zhǔn)確地獲取app具有的功能,最后導(dǎo)致分析結(jié)果的錯(cuò)誤.

表1 風(fēng)險(xiǎn)app識(shí)別方法的評(píng)估結(jié)果
綜上所述,針對(duì)移動(dòng)應(yīng)用隱私信息的安全性問題,本文提出了一種移動(dòng)應(yīng)用安全性分析方法,它通過挖掘UI與代碼中的信息識(shí)別出產(chǎn)品具有的功能與實(shí)際使用的敏感權(quán)限,并且基于具有相似功能的應(yīng)用應(yīng)該使用相似敏感權(quán)限的思想分析移動(dòng)應(yīng)用是否具有風(fēng)險(xiǎn).實(shí)驗(yàn)結(jié)果表明,該方法能有效完成移動(dòng)應(yīng)用的安全分析.