• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      TipTracer:基于安全提示的安卓應(yīng)用通用漏洞檢測(cè)框架

      2019-11-15 05:11:26楊哲慜李明琪
      計(jì)算機(jī)研究與發(fā)展 2019年11期
      關(guān)鍵詞:安全漏洞規(guī)約安卓

      張 磊 楊哲慜 李明琪 楊 珉

      (復(fù)旦大學(xué)軟件學(xué)院 上海 201203)

      隨著安卓系統(tǒng)的流行,安卓應(yīng)用正被部署到數(shù)以億計(jì)的移動(dòng)設(shè)備上,龐大的安卓應(yīng)用數(shù)對(duì)惡意攻擊者產(chǎn)生了巨大的誘惑.然而,許多安卓應(yīng)用,包括一些流行的應(yīng)用,都包含大量的安全漏洞[1].現(xiàn)有的研究成果表明,大量的軟件安全漏洞都是由于開發(fā)者不正確地使用安卓代碼庫(kù)引起的.例如對(duì)于安卓系統(tǒng)的Webview[1-3]、安全通訊協(xié)議(SSL)[4-5],如果應(yīng)用程序以不安全的方式使用它們,就會(huì)很容易造成應(yīng)用軟件的安全缺陷.因此,為消除這些軟件安全漏洞,我們需要首先理解為何應(yīng)用軟件會(huì)不恰當(dāng)?shù)厥褂冒沧看a庫(kù),以及如何阻止這種不安全使用.

      軟件開發(fā)工具包(SDK)和其他庫(kù)通常附帶開發(fā)人員指南,指南中說明了如何安全地使用這些工具包.這些信息被稱為安全提示或安全規(guī)約.有時(shí)它們也會(huì)出現(xiàn)在其他地方,比如谷歌的安全提示網(wǎng)站和一些開發(fā)者論壇(例如Android Development Community, Android People).有研究表明,這些安全提示在應(yīng)用開發(fā)中并沒有被嚴(yán)格遵守.但是,目前仍缺乏對(duì)該問題的嚴(yán)重程度以及其安全隱患的充分認(rèn)知.此外,應(yīng)用開發(fā)者們對(duì)安全規(guī)約的內(nèi)容及其有效性缺乏深入的理解,這也是影響安全規(guī)約在實(shí)踐中使用效果的一個(gè)重要因素.例如人們可能會(huì)問:在熱門應(yīng)用中,這些安全規(guī)約是否經(jīng)常出現(xiàn)?他們什么時(shí)候受到好評(píng)、什么時(shí)候不受歡迎?對(duì)于違規(guī)行為,誰(shuí)應(yīng)該負(fù)起責(zé)任,庫(kù)提供者或應(yīng)用程序的開發(fā)人員?我們可以做些什么來使提示更有效、更有可能在應(yīng)用程序開發(fā)中使用?這些問題的答案對(duì)于安卓應(yīng)用安全至關(guān)重要,因?yàn)檫@些安全規(guī)約中報(bào)告的問題對(duì)于惡意攻擊者來說也是公開的,他們可以輕易地利用這些安全隱患來攻擊那些未能提供保護(hù)的應(yīng)用.

      理解安全規(guī)約的現(xiàn)狀.我們系統(tǒng)性地研究了安全規(guī)約在大量流行應(yīng)用中的實(shí)際遵守情況.為此,我們首先從谷歌官方文檔、第三方庫(kù)提供者和學(xué)術(shù)文獻(xiàn)等多個(gè)渠道收集了大量的安全規(guī)約,然后我們?cè)O(shè)計(jì)并開發(fā)了一個(gè)靜態(tài)分析框架,對(duì)來自谷歌官方應(yīng)用市場(chǎng)的13 072個(gè)流行應(yīng)用以及13 072個(gè)隨機(jī)應(yīng)用進(jìn)行了檢測(cè),以判斷這些應(yīng)用是否違反了安全規(guī)約.結(jié)果表明:有大約50%的被測(cè)應(yīng)用未遵守安全規(guī)約,導(dǎo)致了諸如動(dòng)態(tài)加載不可信代碼、隱私泄露以及SSL證書錯(cuò)誤驗(yàn)證等安全漏洞問題.

      此外,本文研究了Android應(yīng)用程序可能會(huì)違反安全規(guī)約的原因.我們首先總結(jié)了安全規(guī)約中的11種特征并對(duì)其進(jìn)行了評(píng)估,例如安全規(guī)約描述中的關(guān)鍵詞、安全規(guī)約出現(xiàn)的位置、應(yīng)用中使用的庫(kù)等特征.然后,我們對(duì)所選的應(yīng)用程序以及3個(gè)額外的應(yīng)用集合進(jìn)行了進(jìn)一步的分析.結(jié)果顯示:安全規(guī)約的違反主要由4個(gè)原因造成:

      1) 模糊的語(yǔ)言描述.由自然語(yǔ)言描述的安全規(guī)約難以描述得很準(zhǔn)確,因此也難以被開發(fā)人員抓住重點(diǎn).另外,我們還發(fā)現(xiàn)安全規(guī)約中使用的某些關(guān)鍵詞容易誤導(dǎo)其讀者,因?yàn)檫@些關(guān)鍵詞具有多種含義.

      2) 碎片化的規(guī)約分布.安全規(guī)約分散在庫(kù)文檔、技術(shù)論壇、技術(shù)博客等各個(gè)地方,導(dǎo)致開發(fā)者難以一次性獲取需要遵守的安全規(guī)約集合.我們的實(shí)驗(yàn)結(jié)果也表明,大部分的應(yīng)用只遵守了部分安全規(guī)約.

      3) 誤導(dǎo)性的代碼示例.某些庫(kù)的默認(rèn)設(shè)置本身就不符合其安全規(guī)約.此外,同樣的問題也在庫(kù)的代碼示例中出現(xiàn),導(dǎo)致應(yīng)用開發(fā)者無(wú)意中因參考示例代碼而違反了安全規(guī)約.

      4) 缺乏強(qiáng)制性.第三方庫(kù)提供的安全規(guī)約一般都屬于建議性質(zhì),缺乏相應(yīng)的強(qiáng)制措施使開發(fā)者必須遵守.

      安全規(guī)約的自動(dòng)化檢測(cè).基于安全規(guī)約已公開,以及安全規(guī)約涉及的安全漏洞對(duì)所有用戶(包括惡意攻擊者)公開的事實(shí),我們認(rèn)為無(wú)論應(yīng)用是否涉及用戶的隱私數(shù)據(jù)(比如登錄憑證、信用卡號(hào)碼、銀行賬號(hào)等),應(yīng)用開發(fā)者都應(yīng)該嚴(yán)格遵守安全規(guī)約的提示,這也需要一個(gè)有效的工具來進(jìn)行自動(dòng)化的安全檢查.因此,我們開發(fā)了一個(gè)新的靜態(tài)分析檢查框架TipTracer.和已有的安全檢查工具不同,TipTracer是首個(gè)對(duì)安全規(guī)約文檔所描述的缺陷進(jìn)行強(qiáng)制安全檢查的工具.它使用靜態(tài)程序分析技術(shù)在數(shù)據(jù)流和控制流2個(gè)方面對(duì)應(yīng)用中安全規(guī)約的實(shí)施情況進(jìn)行自動(dòng)化的檢查,同時(shí)還會(huì)將具有安全漏洞的代碼作為分析報(bào)告的一部分進(jìn)行輸出.對(duì)來自谷歌官方應(yīng)用市場(chǎng)的大量應(yīng)用進(jìn)行的實(shí)驗(yàn)分析表明,TipTracer能有效地識(shí)別安全規(guī)約的違反情況,而且其誤報(bào)率比較低.TipTracer可被應(yīng)用在Android應(yīng)用生命周期的3個(gè)環(huán)節(jié):

      1) 庫(kù)提供者.庫(kù)提供者可以將安全規(guī)約添加進(jìn)TipTracer,TipTracer進(jìn)而就可以自動(dòng)地對(duì)使用該庫(kù)的安卓應(yīng)用進(jìn)行安全規(guī)約遵守情況的檢查.

      2) 應(yīng)用開發(fā)者.應(yīng)用開發(fā)者可以使用TipTracer來檢查該應(yīng)用是否遵守庫(kù)提供者所給出的安全規(guī)約.

      3) 應(yīng)用市場(chǎng).應(yīng)用市場(chǎng)可以使用TipTracer來對(duì)應(yīng)用進(jìn)行審核,進(jìn)而識(shí)別應(yīng)用中是否違反應(yīng)滿足的安全規(guī)約.

      本文的主要貢獻(xiàn)有3個(gè)方面:

      1) 系統(tǒng)研究了移動(dòng)應(yīng)用對(duì)安全規(guī)約的遵守情況.本文對(duì)安全規(guī)約的遵守情況進(jìn)行了大規(guī)模系統(tǒng)化的研究,發(fā)現(xiàn)移動(dòng)應(yīng)用普遍忽視安全規(guī)約,導(dǎo)致應(yīng)用程序包含大量安全漏洞.其原因主要為:安全規(guī)約通常語(yǔ)言表述較為模糊、規(guī)約分布比較碎片化、示例代碼也會(huì)違反規(guī)約本身以及目前缺乏強(qiáng)制性手段幫助開發(fā)者遵守安全規(guī)約.此外,由于這些安全規(guī)約及相關(guān)漏洞報(bào)告已經(jīng)被公開,應(yīng)用漏洞面臨著巨大的被攻擊風(fēng)險(xiǎn).同時(shí),為了使開發(fā)者能更好的遵守安全規(guī)約,其質(zhì)量也需要進(jìn)一步提高.

      2) 實(shí)現(xiàn)了一個(gè)自動(dòng)化檢查安全規(guī)約的程序分析框架.本文設(shè)計(jì)了首個(gè)自動(dòng)化檢查應(yīng)用中安全規(guī)約遵守情況的檢測(cè)框架TipTracer.該框架提供了一個(gè)形式化語(yǔ)言對(duì)安全規(guī)約進(jìn)行表述,并利用程序分析技術(shù)在控制流和數(shù)據(jù)流2個(gè)角度對(duì)移動(dòng)應(yīng)用進(jìn)行檢查.同時(shí),該框架的形式化規(guī)則語(yǔ)言不僅可以表述已有安全規(guī)約,也可以用于其他漏洞表述,具有通用性.

      3) 大規(guī)模的實(shí)驗(yàn)分析.本文收集了部分安全規(guī)約,并以表述這些規(guī)約為例展示了如何利用TipTracer的漏洞檢測(cè)能力.通過對(duì)谷歌官方應(yīng)用市場(chǎng)中的大量應(yīng)用進(jìn)行了檢測(cè),發(fā)現(xiàn)超過50%的應(yīng)用都存在違反安全規(guī)約的情況.

      1 安全提示的選取

      我們?cè)诎沧颗c第三方代碼庫(kù)所提供的安全規(guī)約中選擇了七大類提示進(jìn)行研究.

      1.1 安卓原生代碼庫(kù)的安全提示

      1)MODE_WORLD_READABLE相關(guān)的安全提示

      安卓應(yīng)用可以在使用共享配置(shared-preference)、數(shù)據(jù)庫(kù)實(shí)例或本地文件時(shí)使用MODE_WORLD_READABLE模式以允許其他應(yīng)用讀取其本地存儲(chǔ)空間中的內(nèi)容.但是,一旦本地存儲(chǔ)空間被以MODE_WORLD_READABLE模式進(jìn)行過訪問,任何將本地信息寫入這一存儲(chǔ)空間的操作都是危險(xiǎn)的,因?yàn)閹в蠱ODE_WORLD_READABLE標(biāo)志的存儲(chǔ)空間無(wú)法對(duì)來自未授權(quán)應(yīng)用的讀取操作做出限制.因此,惡意應(yīng)用可以在未經(jīng)授權(quán)的情況下從這些文件中獲取敏感信息.我們?cè)趫D1中給出了一個(gè)關(guān)于MODE_WORLD_READABLE模式的安全規(guī)約示例.

      類似于MODE_WORLD_READABLE向所有應(yīng)用授予了應(yīng)用本地存儲(chǔ)空間的讀取權(quán)限,MODE_WORLD_WRITABLE向所有應(yīng)用授予了寫入應(yīng)用本地存儲(chǔ)空間的權(quán)限.因此,從帶有MODE_WORLD_WRITABLE的存儲(chǔ)空間中加載和使用數(shù)據(jù)是存在安全隱患的.帶有MODE_WORLD_WRITABLE標(biāo)志的存儲(chǔ)空間中的數(shù)據(jù)甚至?xí)晃唇?jīng)授權(quán)的應(yīng)用損壞.圖1給出了一個(gè)關(guān)于MODE_WORLD_WRITABLE的安全規(guī)則示例.

      此外,我們還選取了在已有工作中已經(jīng)被提及的一些其他安全提示.我們選擇這些安全提示主要是為了證明TipTracer作為通用漏洞檢測(cè)框架的能力.具體來說,首先,我們收集了大量Google Play上的最新應(yīng)用;然后,利用現(xiàn)有的已知工具對(duì)這些應(yīng)用進(jìn)行分析,并將其分析結(jié)果作為基準(zhǔn);最后,我們利用TipTracer來分析這些應(yīng)用,并將分析結(jié)果與基準(zhǔn)進(jìn)行對(duì)比以確保TipTracer能覆蓋現(xiàn)有工作的結(jié)果.在實(shí)際實(shí)驗(yàn)中,我們研究了3個(gè)安全提示:

      1) SSL相關(guān)的安全提示

      正如Google關(guān)于SSL的官方文檔[6]中所表述的,若應(yīng)用未正確的使用SSL代碼庫(kù),則惡意應(yīng)用就有機(jī)會(huì)在網(wǎng)絡(luò)上截獲該應(yīng)用的數(shù)據(jù).具體來說,安全提示警告開發(fā)者避免使用信任所有證書的自定義主機(jī)名驗(yàn)證器(hostname verifier),同時(shí)應(yīng)用程序也不應(yīng)該通過使用SSL-SocketFactory類來信任所有的主機(jī)名.TipTracer的安全規(guī)約覆蓋了所有這些對(duì)SSL代碼庫(kù)的誤用.

      2) 與數(shù)據(jù)加密代碼庫(kù)相關(guān)的安全提示

      CryptoLint[7]研究了Android應(yīng)用對(duì)數(shù)據(jù)加密代碼庫(kù)的誤用情況,并將其總結(jié)為6條安全建議.例如應(yīng)用在加密時(shí)不應(yīng)使用ECB模式,應(yīng)用也不應(yīng)在對(duì)數(shù)據(jù)進(jìn)行CBC加密時(shí)使用非隨機(jī)的初始化向量.類似的安全提示在安卓安全提示頁(yè)[8]上也存在.TipTracer繼承了其關(guān)于不安全使用加密代碼庫(kù)的定義和相關(guān)安全規(guī)約.

      3) 與動(dòng)態(tài)代碼載入機(jī)制相關(guān)的安全提示

      動(dòng)態(tài)代碼載入機(jī)制允許應(yīng)用動(dòng)態(tài)加載在程序啟動(dòng)前并不知曉的Java代碼.由于通常會(huì)從外部存儲(chǔ)設(shè)備上加載代碼,動(dòng)態(tài)代碼載入會(huì)顯著增加應(yīng)用被惡意第三方通過代碼注入或代碼篡改進(jìn)行攻擊的可能性.通過研究安卓開發(fā)者指南[8-9]中官方的安全提示,及Poeplau等人的工作[10]中提供的安全提示信息,我們導(dǎo)出了使用安卓動(dòng)態(tài)代碼加載類的安全規(guī)約.該安全規(guī)約會(huì)驅(qū)動(dòng)TipTracer檢查應(yīng)用是否會(huì)動(dòng)態(tài)地從不安全的存儲(chǔ)空間加載代碼,以及應(yīng)用是否使用了不安全的存儲(chǔ)空間來緩存動(dòng)態(tài)加載的類.

      1.2 第三方代碼庫(kù)的安全提示

      安卓原生代碼庫(kù)的安全提示在已有的工作中已被討論過,TipTracer可以形式化地表述它們對(duì)應(yīng)的安全規(guī)約并自動(dòng)地驗(yàn)證應(yīng)用是否滿足了這些安全規(guī)約.此外,本文首次研究了第三方代碼庫(kù)中的安全提示.下面是本文選取的2個(gè)安全提示示例:

      1) SQLCipher代碼庫(kù)的安全提示

      SQLCipher[11]代碼庫(kù)是一個(gè)流行的基于SQLite數(shù)據(jù)庫(kù)的第三方擴(kuò)展代碼庫(kù).該代碼庫(kù)封裝了對(duì)數(shù)據(jù)庫(kù)文件進(jìn)行256位AES加密的功能,同時(shí)應(yīng)用開發(fā)者無(wú)需考慮加密過程的細(xì)節(jié).然而,在使用SQLCipher數(shù)據(jù)庫(kù)時(shí),不將固定的解密密鑰放入應(yīng)用程序客戶端文件中是保證數(shù)據(jù)存儲(chǔ)安全的一個(gè)關(guān)鍵因素,因?yàn)槿绻麘?yīng)用程序使用固定密鑰,攻擊者就可以通過從應(yīng)用程序的安裝包中提取密鑰并對(duì)數(shù)據(jù)庫(kù)進(jìn)行解密操作[12-14].

      2) LockPattern代碼庫(kù)的安全提示

      Lock Pattern是一個(gè)第三方隱私保護(hù)擴(kuò)展,該代碼庫(kù)為應(yīng)用提供了添加圖形化鎖定模塊的功能,該模塊可以被用于保護(hù)應(yīng)用程序內(nèi)部數(shù)據(jù)不被未授權(quán)的其他用戶使用.為保護(hù)圖形密鑰,LockPattern的安全提示要求開發(fā)者對(duì)用戶設(shè)定的圖形模式[15]使用自定義的加密器進(jìn)行加密.若應(yīng)用未設(shè)置自定義的加密類,LockPattern會(huì)使用原始的哈希函數(shù)來對(duì)圖形密碼進(jìn)行加密,而這種加密方法可以輕易的被攻擊者所攻破并解密.圖2展示了從這一安全提示導(dǎo)出的安全規(guī)約.

      1.3 違反安全規(guī)約的示例

      圖2給出了軟件安全提示違反的一個(gè)實(shí)例:LockPatternActivity.LockPattern在其軟件安全規(guī)約中指出,在啟動(dòng)器LockPatternActivity之前,應(yīng)用軟件需要首先調(diào)用setEncrypterClass方法來指定一個(gè)加密器.在圖2中,有漏洞的應(yīng)用在未指定加密器的情況下啟動(dòng)了LockPatternActivity.我們可以將這一實(shí)例通過2個(gè)函數(shù)調(diào)用事件及其時(shí)間順序進(jìn)行描述:首先,應(yīng)用程序創(chuàng)建了一個(gè)Intent對(duì)象,并將其對(duì)應(yīng)的組件類設(shè)置為L(zhǎng)ockPatternActivity(行④).之后,應(yīng)用程序在調(diào)用setEncrypterClass函數(shù)(行⑥)之前啟動(dòng)了Intent對(duì)象指定的Activity(行⑦).

      2 安全規(guī)約機(jī)制所存在的問題

      2.1 安全提示缺乏強(qiáng)制力

      應(yīng)用軟件安全建議通過語(yǔ)言這一載體,以非正式的方式傳達(dá)給程序員.同時(shí),我們發(fā)現(xiàn)現(xiàn)有工具都不能檢測(cè)應(yīng)用軟件因違反安全建議而產(chǎn)生的應(yīng)用安全問題.通過分析安卓應(yīng)用程序編寫和編譯機(jī)制,我們發(fā)現(xiàn)在編譯階段,編譯器沒有對(duì)應(yīng)用程序違反安全建議的行為拋出編譯時(shí)錯(cuò)誤,因此,現(xiàn)有安卓應(yīng)用編譯機(jī)制無(wú)法避免應(yīng)用程序因程序員違反安全建議而造成的安全缺陷.此外,我們發(fā)現(xiàn)編譯器只會(huì)在少數(shù)安全建議違反的情況下才發(fā)出警告,而這些警告都是因?yàn)閼?yīng)用程序訪問了過時(shí)的系統(tǒng)調(diào)用接口.然而,由于使用過時(shí)系統(tǒng)調(diào)用接口并不代表應(yīng)用程序會(huì)存在安全問題,因?yàn)檫@類編譯時(shí)警告往往被程序員所忽略.

      2.2 安全提示的碎片化現(xiàn)象

      我們發(fā)現(xiàn)代碼庫(kù)開發(fā)者在向程序開發(fā)者傳達(dá)安全建議時(shí),并沒有一個(gè)統(tǒng)一的傳達(dá)渠道,而是通過將安全建議集成入API文檔、使用實(shí)例、安全教程中或者在開發(fā)者博客和論壇上發(fā)布安全建議說明等方式傳達(dá)安全建議內(nèi)容.這種安全建議的碎片化現(xiàn)象使得開發(fā)者很難掌握其所使用的代碼庫(kù)完全的安全使用需求.

      實(shí)例分析1. 動(dòng)態(tài)代碼加載安全建議.

      Java語(yǔ)言的動(dòng)態(tài)代碼加載機(jī)制為應(yīng)用程序提供在運(yùn)行時(shí)動(dòng)態(tài)加載程序代碼的途徑.通過這一途徑,程序員可以靈活控制加載入應(yīng)用的程序代碼.然而,由于通過動(dòng)態(tài)代碼加載機(jī)制載入應(yīng)用的代碼將在應(yīng)用程序中被直接運(yùn)行,因此如果在加載過程中,訪問了不安全的外部存儲(chǔ)位置(如SD卡)或者通過未加密的通道從遠(yuǎn)程服務(wù)器加載代碼庫(kù),應(yīng)用程序就可能面臨被惡意入侵者劫持的風(fēng)險(xiǎn).今年年初,Poeplau等人[10]介紹了在安卓應(yīng)用程序中,因?yàn)閼?yīng)用程序開發(fā)者不安全使用動(dòng)態(tài)代碼加載機(jī)制帶來的軟件安全漏洞.

      事實(shí)上,在谷歌官方的開發(fā)者文檔中,對(duì)于動(dòng)態(tài)代碼機(jī)制的安全問題已經(jīng)提出了相應(yīng)的安全建議.然而,對(duì)于對(duì)應(yīng)代碼庫(kù)的安全建議主要有2條,而對(duì)于這2條安全建議的描述卻被分散在2個(gè)不同的位置:在安卓開發(fā)者文檔的“安全提示(security tips)”頁(yè)[8]中,代碼庫(kù)設(shè)計(jì)者強(qiáng)調(diào)在使用動(dòng)態(tài)代碼加載時(shí),開發(fā)者需要確保被加載的代碼必須來自于不可被篡改的安全加載源.另外,在開發(fā)者文檔中的DexClass-Loader的接口頁(yè)[9]中,代碼庫(kù)設(shè)計(jì)者強(qiáng)調(diào)在使用動(dòng)態(tài)代碼加載時(shí),開發(fā)者需要確保被加載的代碼不可被緩存在可被篡改的介質(zhì)中.被分散的安全建議造成軟件開發(fā)者無(wú)法完整捕獲動(dòng)態(tài)代碼加載的安全規(guī)約,而一旦開發(fā)者錯(cuò)失部分的安全建議,就可能導(dǎo)致應(yīng)用程序存在不安全加載動(dòng)態(tài)代碼庫(kù)的行為.

      2.3 開發(fā)者對(duì)安全提示的錯(cuò)誤理解問題

      目前,安卓代碼庫(kù)的安全建議均采用自然語(yǔ)言的方式呈現(xiàn)給程序開發(fā)者.由于自然語(yǔ)言中存在復(fù)雜語(yǔ)義,并且可能包含大量存在歧義和具誤導(dǎo)性的詞或句子,因此應(yīng)用開發(fā)者在閱讀安全建議時(shí)可能會(huì)誤解安全建議的內(nèi)容.尤其是當(dāng)程序開發(fā)者的母語(yǔ)和安全建議所使用語(yǔ)言不一致時(shí),該問題更為嚴(yán)重.

      實(shí)例分析2. Rastreador celular Inteligente.

      安卓應(yīng)用程序在使用SharedPreference,本地?cái)?shù)據(jù)庫(kù)或者本地文件存儲(chǔ)私有數(shù)據(jù)時(shí),可以設(shè)置該數(shù)據(jù)的共享模式.在這一過程中,如果該共享模式被設(shè)置為MODE_WORLD_READABLE或MODE_WORLD_WRITABLE時(shí),通過該介質(zhì)存儲(chǔ)的信息就可以被本機(jī)其他應(yīng)用讀取或?qū)懭?在谷歌的安全建議頁(yè)[8]中,代碼庫(kù)設(shè)計(jì)者警告:“你應(yīng)該避免使用MODE_WORLD_READABLE和MODE_WORLD_WRITABLE模式,因?yàn)樗麄儾粚?duì)特定應(yīng)用程序提供訪問控制,同時(shí)也不對(duì)數(shù)據(jù)存儲(chǔ)格式做出任何限制”.

      Rastreador celular Inteligente[16]是一款用于朋友之間相互發(fā)送短信的軟件.在對(duì)這款軟件的分析過程中,我們發(fā)現(xiàn),應(yīng)用程序的開發(fā)者將MODE_WORLD_READABLE誤認(rèn)為是MODE_READ,將MODE_WORLD_WRITABLE誤認(rèn)為是MODE_WRITE.因此,每當(dāng)該軟件需要查詢本地?cái)?shù)據(jù)庫(kù)時(shí),程序開發(fā)者都將本地?cái)?shù)據(jù)庫(kù)的訪問模式設(shè)置為MODE_WORLD_READABLE.類似地,當(dāng)該軟件需要更新數(shù)據(jù)時(shí),程序開發(fā)者都會(huì)將數(shù)據(jù)的共享模式設(shè)置為MODE_WORLD_WRITABLE.因此,當(dāng)程序需要讀寫它的數(shù)據(jù)庫(kù)時(shí),它同時(shí)也賦予其他所有的應(yīng)用程序讀取或?qū)懭肫浔镜財(cái)?shù)據(jù)庫(kù)的權(quán)限.同時(shí),我們發(fā)現(xiàn),安卓系統(tǒng)代碼庫(kù)的所有安全建議都是使用英語(yǔ)書寫的,而我們分析的這款軟件是由一個(gè)葡萄牙公司開發(fā)的,因此,我們認(rèn)為這個(gè)安全漏洞很大可能是由于開發(fā)者誤解安全建議的英文表述所引起的.

      2.4 誤導(dǎo)性代碼示例的影響

      代碼庫(kù)有時(shí)會(huì)通過提供示例代碼來演示對(duì)其提供接口的使用方法.與之類似地,一些關(guān)于安卓開發(fā)的書籍或者在網(wǎng)上的技術(shù)談?wù)撐恼轮?,也時(shí)常通過實(shí)例代碼演示對(duì)安卓代碼庫(kù)的使用方法.我們發(fā)現(xiàn)安卓應(yīng)用的開發(fā)者不僅會(huì)瀏覽演示示例的內(nèi)容,還會(huì)將其中的代碼復(fù)制到自己的應(yīng)用中,從而減少開發(fā)成本.然而,如果示例代碼本身包含不完全的代碼庫(kù)使用,將示例代碼嵌入應(yīng)用這一行為將造成開發(fā)中應(yīng)用得安全缺陷.

      實(shí)例分析3. 已出版的安卓書籍.

      如果應(yīng)用程序使用MODE_WORLD_READABLE或者M(jìn)ODE_WORLD_WRITABLE這2個(gè)參數(shù)訪問本地存儲(chǔ)的數(shù)據(jù),會(huì)造成其本地?cái)?shù)據(jù)全局可讀或可寫,并代碼應(yīng)用程序的安全隱患.本節(jié)我們進(jìn)一步研究了存在于安卓示例代碼中對(duì)這2項(xiàng)不安全配置的使用情況.我們的觀察結(jié)果顯示,誤導(dǎo)性的代碼片段不僅在網(wǎng)上的技術(shù)文章與相關(guān)技術(shù)討論中被大量誤用,類似使用也存在于已出版的介紹安卓開發(fā)的圖書中.我們發(fā)現(xiàn)在至少3本技術(shù)類書籍[17-19]中包含了不安全的代碼庫(kù)使用,并且在這些數(shù)據(jù)中都沒有給出相關(guān)的安全提示.

      2.5 案例研究:第三方代碼庫(kù)

      在安卓原生代碼庫(kù)以外,我們還研究了2個(gè)用于增強(qiáng)應(yīng)用安全性的第三方安卓代碼庫(kù):SQLCipher與LockPattern:SQLCipher[11]提供了對(duì)應(yīng)用程序本地SQLite數(shù)據(jù)庫(kù)進(jìn)行256位AES加密的功能,應(yīng)用程序可以通過庫(kù)函數(shù)接口進(jìn)行加密配置,而不需要考慮加密函數(shù)的細(xì)節(jié).LockPattern提供了給應(yīng)用程序添加圖形化鎖定模塊的功能,該模塊可以被用于保護(hù)應(yīng)用程序內(nèi)部數(shù)據(jù)不被未授權(quán)其他用戶使用.它們都含有上文中所提到的問題.

      1) 我們發(fā)現(xiàn)這些第三方代碼庫(kù)在描述安全需求時(shí),比原生安卓代碼庫(kù)更傾向于使用模糊或較弱的表述方式,比如他們經(jīng)常使用“更加安全”或“建議使用……而非……”的方式描述安全需求.這很容易引起程序員的誤解.相反,安卓開發(fā)者文檔更傾向于使用較強(qiáng)的語(yǔ)氣表述需求,如“避免……”或“……將引起漏洞”等.

      2) 這些第三方代碼庫(kù)都未將安全提示放進(jìn)其接口文檔或代碼庫(kù)使用教程中.我們發(fā)現(xiàn)它們有時(shí)將安全提示放在了開發(fā)者博客[13]的一個(gè)單獨(dú)的頁(yè)面上,有時(shí)將其放在接口文檔的不明顯的角落切沒有明顯指向該頁(yè)面的鏈接[15].更有甚者,有時(shí)代碼庫(kù)開發(fā)者還將安全提示散布于Google群組討論[12]或者Stackoverflow的問答[14]中.碎片化的安全提示使開發(fā)人員難以理解代碼庫(kù)所提出的需求并遵守相關(guān)要求.

      3) 雖然SQLCipher在其安全提示中建議不要將固定的密鑰置于應(yīng)用程序代碼中,我們?nèi)匀话l(fā)現(xiàn)在SQLCipher的官方代碼庫(kù)使用教程[20]與SQLChipherForAndroid-SDK[21]的示例中存在使用固定密鑰的情況.

      3 TipTracer的整體架構(gòu)

      為了在移動(dòng)應(yīng)用中大規(guī)模檢測(cè)安全規(guī)約的遵守情況,我們?cè)O(shè)計(jì)并實(shí)現(xiàn)了一個(gè)基于靜態(tài)分析的安卓應(yīng)用通用漏洞檢測(cè)框架,名為TipTracer.圖3展示了TipTracer的總體架構(gòu).該框架主要由一個(gè)安全規(guī)約模型與一個(gè)靜態(tài)軟件分析器構(gòu)成.

      1) 安全規(guī)約模型.為了解決在2.3節(jié)中討論的由安全提示的自然語(yǔ)言描述特性帶來的語(yǔ)義誤解問題,我們?cè)O(shè)計(jì)了一個(gè)編程模型來形式化地描述代碼安全規(guī)約.由于安全提示普遍在方法級(jí)別描述程序的正常代碼庫(kù)使用行為,TipTracer的安全規(guī)約模型允許代碼庫(kù)設(shè)計(jì)人員描述方法調(diào)用的安全時(shí)間順序、調(diào)用參數(shù)與返回值間的數(shù)據(jù)依賴關(guān)系,以及對(duì)參數(shù)賦予的限制.在第5節(jié)中我們將詳細(xì)描述該安全規(guī)約模型.

      Fig. 3 Architecture of TipTracer圖3 TipTracer 的總體架構(gòu)

      2) 靜態(tài)軟件分析器.基于代碼庫(kù)安全規(guī)約模型在控制流和數(shù)據(jù)流上描述了應(yīng)用軟件應(yīng)該遵守什么行為規(guī)范.因此,靜態(tài)軟件分析器通過對(duì)目標(biāo)應(yīng)用代碼進(jìn)行控制流與數(shù)據(jù)流分析,利用程序切片技術(shù)定位安全規(guī)約相關(guān)的應(yīng)用代碼,再檢測(cè)這些代碼是否符合行為規(guī)范.第5節(jié)中我們將對(duì)該分析器的設(shè)計(jì)細(xì)節(jié)做詳細(xì)描述.

      4 TipTracer的屬性描述

      TipTracer通過利用代碼庫(kù)安全規(guī)約對(duì)應(yīng)用軟件安全性進(jìn)行檢測(cè).在TipTracer進(jìn)行安全檢測(cè)之前,我們需要對(duì)安全提示所提出的代碼庫(kù)安全使用需求進(jìn)行形式化描述.在本節(jié)中,我們首先給出了TipTracer所支持的安全規(guī)約類型,然后對(duì)安全規(guī)約邏輯進(jìn)行了形式化的定義.

      4.1 屬性類型

      軟件安全提示通常在函數(shù)粒度指導(dǎo)開發(fā)者如何使用庫(kù)API,包括各個(gè)函數(shù)調(diào)用之間的先后關(guān)系或調(diào)用特定函數(shù)時(shí)需要滿足的參數(shù)數(shù)據(jù)限制.TipTracer中定義的軟件安全規(guī)約描述了違背這些代碼庫(kù)使用約束的情形.

      1) 不安全接口調(diào)用順序.該情形限制了函數(shù)接口之間調(diào)用順序應(yīng)該滿足特定先后關(guān)系.比如通常情況下,在用HTTP接口傳播密碼之前,都應(yīng)該先調(diào)用對(duì)應(yīng)的加密函數(shù),以防止可能的密碼泄露.

      2) 不安全的數(shù)據(jù)傳播.該情形限制了函數(shù)的參數(shù)所需滿足的數(shù)據(jù)污染關(guān)系.比如很多庫(kù)都規(guī)定對(duì)用戶隱私數(shù)據(jù)的使用應(yīng)當(dāng)小心謹(jǐn)慎,不應(yīng)該流入log日志中等可能被攻擊者訪問到的數(shù)據(jù)節(jié)點(diǎn)上.

      3) 不安全參數(shù)值.該情形限制了函數(shù)接口所能接受的參數(shù)應(yīng)該滿足的限制條件.比如很多庫(kù)規(guī)定開發(fā)者應(yīng)該使用有效的加密方法對(duì)敏感數(shù)據(jù)進(jìn)行保護(hù),但是如果在使用加密函數(shù)Cipher.getInstance()時(shí)設(shè)定第2個(gè)參數(shù)為“ECB”,將導(dǎo)致該軟件使用弱加密,即使用了不安全的參數(shù)值.

      4.2 基本元素

      在定義TipTracer安全規(guī)約之前,我們首先定義用于組成安全規(guī)約的基本元素:執(zhí)行點(diǎn)和數(shù)據(jù)點(diǎn).

      1) 執(zhí)行點(diǎn)(execution point, EP)

      執(zhí)行點(diǎn)代表對(duì)一個(gè)函數(shù)的具體調(diào)用點(diǎn).一般情況下,每個(gè)函數(shù)都具有獨(dú)立且唯一的方法簽名(signature),因此,我們使用方法簽名去表示每一個(gè)函數(shù)調(diào)用點(diǎn),即執(zhí)行點(diǎn).例如在安卓系統(tǒng)中可以用EP(“android.content.Context.getSharedPreferences”)表示一個(gè)調(diào)用getSharedPreferences這個(gè)方法的執(zhí)行點(diǎn).此外,我們也定義了2個(gè)特殊的程序執(zhí)行點(diǎn):ProgramEntry和ProgramExit,用于表示整個(gè)應(yīng)用程序執(zhí)行時(shí)的入口和出口.我們也定義了用于對(duì)某一函數(shù)的所有調(diào)用點(diǎn)的集合表示方法EPS.如EPS(“android.content.Context.getSharedPreferences”)可以表示在應(yīng)用軟件運(yùn)行時(shí)所有對(duì)getSharedPreferences方法的調(diào)用點(diǎn).

      2) 數(shù)據(jù)點(diǎn)(data point, DP)

      數(shù)據(jù)點(diǎn)代表程序執(zhí)行中出現(xiàn)的所有數(shù)據(jù)節(jié)點(diǎn),包括所有方法調(diào)用的參數(shù)、返回值以及所有的全局變量.類似于執(zhí)行點(diǎn)集合(EPS),數(shù)據(jù)點(diǎn)集合(DPS)也被定義為所有同類數(shù)據(jù)點(diǎn)的集合.

      4.3 規(guī)則邏輯

      TipTracer的規(guī)則系統(tǒng)支持邏輯組合.使用上面定義的基本元素,再結(jié)合一些邏輯組合關(guān)系,可以定義出各種各樣的復(fù)雜安全規(guī)則.具體而言,本系統(tǒng)中支持3種規(guī)則邏輯.

      4.3.1 時(shí)序規(guī)則

      為了表示指令之間的先后順序關(guān)系,一種可能的方法是使用狀態(tài)機(jī)[22-23].但是,許多安全規(guī)則在限定函數(shù)執(zhí)行順序的同時(shí)也對(duì)其參數(shù)進(jìn)行規(guī)范,使用狀態(tài)機(jī)時(shí)并不容易表示.因此,本文定義了一個(gè)新的三元組用以表示時(shí)序規(guī)則,具體是:

      Rule∷Temporal(EPSS,EPS1,EPSE,mode),

      其中,EPSS為起始執(zhí)行點(diǎn)集合,EPS1為中間執(zhí)行點(diǎn)集合,EPSE為結(jié)束執(zhí)行點(diǎn)集合.mode包含2種模式PROP_SKIP或PROP_PASS_THROUGH.如果mode為PROP_PASS_THROUGH,則表示如果在應(yīng)用軟件從EPSS執(zhí)行到EPSE的過程中,如果存在一條執(zhí)行路徑包含了EPS1的執(zhí)行點(diǎn),則存在安全隱患;如果mode為PROP_SKIP,則表示如果在應(yīng)用軟件從EPSS執(zhí)行到EPSE的過程中,如果任意一條執(zhí)行路徑都不包含EPS1的執(zhí)行點(diǎn),則存在安全隱患.例如,圖8中的規(guī)則r3表示在目標(biāo)Activity啟動(dòng)之前,應(yīng)用程序應(yīng)首先調(diào)用方法setEncrypterClass.

      4.3.2 數(shù)據(jù)傳播規(guī)則

      數(shù)據(jù)傳播規(guī)則主要用來限定應(yīng)用軟件中的敏感數(shù)據(jù)流,具體表述是:

      Rule∷Propagation(DPSS,DPSE,mode),

      其中,DPSS表示數(shù)據(jù)傳播過程中的起始數(shù)據(jù)點(diǎn),DPSE表示數(shù)據(jù)傳播過程中的結(jié)束數(shù)據(jù)點(diǎn),mode同樣包含2種模式PROP_MAY和PROP_MAYNOT.如果mode為PROP_MAY,則表示在應(yīng)用程序執(zhí)行的過程中,如果存在數(shù)據(jù)從數(shù)據(jù)點(diǎn)集合DPSS流向數(shù)據(jù)點(diǎn)集合DPSE時(shí),則存在安全隱患.例如圖4中的規(guī)則表示,如果應(yīng)用軟件將外部數(shù)據(jù)傳入到敏感數(shù)據(jù)點(diǎn)(DexClassLoader的第2個(gè)參數(shù)),則存在安全隱患.

      如果mode為PROP_MAYNOT,則如果應(yīng)用軟件執(zhí)行時(shí),對(duì)于結(jié)束數(shù)據(jù)點(diǎn)集合DPSE,如果不存在數(shù)據(jù)從數(shù)據(jù)點(diǎn)集合DPSS流入時(shí),則存在安全隱患.例如,圖5中的規(guī)則表示,在設(shè)置SQLCipher數(shù)據(jù)庫(kù)加密密鑰參數(shù)的路徑時(shí),如果沒有將其設(shè)置為來自于外部數(shù)據(jù)源,則說明應(yīng)用軟件存在安全隱患.

      4.3.3 參數(shù)賦值規(guī)則

      參數(shù)賦值規(guī)則用于表示函數(shù)調(diào)用時(shí)參數(shù)值應(yīng)該滿足的限制條件,具體為

      Rule∷Assignment(DPS,ViolationPattern).

      與另外2種規(guī)則不同,該規(guī)則只用來對(duì)單個(gè)數(shù)據(jù)點(diǎn)進(jìn)行限定,包括函數(shù)的參數(shù)、返回值以及全局變量等.ViolationPattern用來表示對(duì)數(shù)據(jù)點(diǎn)附加的具體限制,如數(shù)值的合法取值范圍、字符串應(yīng)當(dāng)滿足的正則表達(dá)式特征等.同時(shí),我們也定義了一些特殊變量的關(guān)鍵字,比如關(guān)鍵字CONST可以用來表示所有常數(shù)類型的參數(shù).例如圖6中給出的規(guī)則限定了在使用加密算法時(shí)不能使用ECB模式.

      在4.3.1~4.3.3節(jié)中,我們描述了TipTracer使用的3種基本安全規(guī)約類型.但是,很多復(fù)雜的安全規(guī)約并不能簡(jiǎn)單地利用一種規(guī)則進(jìn)行描述.因此,TipTracer提供了邏輯操作(邏輯與、邏輯或、邏輯非)來合并多個(gè)安全規(guī)則以組成復(fù)雜規(guī)則.例如圖7中的行⑨展示了邏輯與的一個(gè)具體實(shí)例,它表示只有應(yīng)用程序同時(shí)違反這幾個(gè)安全規(guī)則時(shí)才會(huì)被認(rèn)定為違反安全規(guī)約.

      為了配合多個(gè)安全規(guī)則之間的邏輯操作,TipTracer額外提供了一個(gè)綁定(bind)功能,以方便將執(zhí)行點(diǎn)與對(duì)應(yīng)的數(shù)據(jù)點(diǎn)結(jié)合在一起.例如在圖7中,通過綁定功能,2個(gè)安全規(guī)則r1和r2共同完成了應(yīng)用程序不能將數(shù)據(jù)庫(kù)設(shè)定為全局可讀寫模式的安全規(guī)約:規(guī)則r1使用參數(shù)賦值規(guī)則限定了openOrCreateDatabase的第3個(gè)參數(shù)為2(MODE_WORLD_WRITABLE)或3(MODE_WORLD_READABLE|MODE_WORLD_WRITABLE),而規(guī)則r2限定了應(yīng)用程序打開數(shù)據(jù)庫(kù)的行為.這2個(gè)安全規(guī)則之間是存在數(shù)據(jù)依賴的,因?yàn)樗鼈兺瑫r(shí)是針對(duì)同一數(shù)據(jù)庫(kù)對(duì)象進(jìn)行限定.因此,我們需要將數(shù)據(jù)點(diǎn)集合dps1與dps2綁定到執(zhí)行點(diǎn)ep1上,以表示它們代表著同一個(gè)數(shù)據(jù)庫(kù)對(duì)象,即這2個(gè)數(shù)據(jù)點(diǎn)對(duì)應(yīng)同一個(gè)執(zhí)行點(diǎn).

      圖8給出了LockPatternActivity相關(guān)的軟件安全規(guī)約.在該安全規(guī)約中,我們使用了3個(gè)基本安全規(guī)約來描述對(duì)應(yīng)的安全提示違反需要滿足的3個(gè)關(guān)鍵點(diǎn):首先,應(yīng)用程序?qū)⒔M件類LockPattern-Activity傳遞到一個(gè)Intent對(duì)象的構(gòu)造函數(shù)中(屬性r1).隨后,應(yīng)用程序?qū)ntent對(duì)象傳播到Activity的初始化方法中(屬性r2).最后,在啟動(dòng)新的Activity之前應(yīng)用程序未調(diào)用setEncrypterClass方法(屬性r3).此外,r1中創(chuàng)建的Intent對(duì)象應(yīng)該與傳遞到r2中的Intent對(duì)象相同,所以r1與r2應(yīng)共享同樣的Intent對(duì)象創(chuàng)建指令.因此,我們將屬于共享方法調(diào)用的數(shù)據(jù)點(diǎn)集合dps1與dps2綁定到同樣的執(zhí)行點(diǎn)ep1上.類似地,r2與r3共享同樣的Activity啟動(dòng)指令,因此我們同樣將startActivity方法調(diào)用的2個(gè)數(shù)據(jù)點(diǎn)dps3和dps4都與執(zhí)行點(diǎn)ep2進(jìn)行綁定.

      為了理解這一軟件安全規(guī)約的作用原理,我們將圖2中含有漏洞的應(yīng)用程序與圖8中建立的安全規(guī)約進(jìn)行匹配:

      1) 指令4滿足r1中定義的參數(shù)賦值規(guī)則.

      2) 應(yīng)用程序?qū)⒅噶?中創(chuàng)建的Intent對(duì)象傳遞到指令7中,這符合r2中定義的數(shù)據(jù)傳播規(guī)則.

      3) 應(yīng)用程序在調(diào)用setEncrypterClass之前在指令7中調(diào)用了startActivity方法,因此r3被滿足.

      4)r1與r2共享同樣的執(zhí)行點(diǎn)(指令4),但r2與r3共享另一執(zhí)行點(diǎn)(指令7),因此安全規(guī)約的綁定約束也與啟發(fā)示例中的代碼相符.

      5) 因此,圖2符合圖8中的所有描述,其違反了圖8建立的安全規(guī)約.

      Fig. 8 An example of violation of rule LockPatternActivity
      圖8 LockPatternActivity的安全規(guī)約示例

      5 TipTracer的實(shí)現(xiàn)與評(píng)測(cè)

      5.1 TipTracer的實(shí)現(xiàn)

      TipTracer實(shí)現(xiàn)在Soot靜態(tài)分析框架[24]的基礎(chǔ)上,支持安卓APK文件、安卓應(yīng)用源代碼以及安卓應(yīng)用字節(jié)碼等多種輸入形式.在4.3節(jié)中,我們提出了TipTracer支持的安全規(guī)約系統(tǒng),主要包含3種安全規(guī)約.因?yàn)橥ㄟ^相互組合,這3種安全規(guī)則可以描述各種復(fù)雜情況,包括但不限于已知的安卓安全規(guī)約,因此,TipTracer可做為通用漏洞檢測(cè)框架進(jìn)一步擴(kuò)展,只需將漏洞特征以安全規(guī)則的形式進(jìn)行書寫.本文僅是以安全規(guī)約這一應(yīng)用場(chǎng)景為例,展示TipTracer的漏洞檢測(cè)能力.

      在TipTracer系統(tǒng)中,針對(duì)這3種基本安全規(guī)則限定的條件,我們采用不同的方法進(jìn)行分析.首先,對(duì)于時(shí)序規(guī)則,因其表述的是相關(guān)函數(shù)調(diào)用指令的執(zhí)行順序,我們利用代碼可達(dá)性分析[25]技術(shù)在程序控制流圖上檢測(cè)代碼執(zhí)行順序是否滿足規(guī)則約束.其次,針對(duì)數(shù)據(jù)傳播規(guī)則,我們首先結(jié)合了一個(gè)靜態(tài)污點(diǎn)分析工具FlowDroid[26],利用其污點(diǎn)分析能力構(gòu)建出程序數(shù)據(jù)流圖,再檢測(cè)數(shù)據(jù)污染關(guān)系是否滿足安全規(guī)則限定.此外,對(duì)于常量,我們利用常量傳播分析[27]來分析其傳播過程是否符合安全規(guī)則.

      因?yàn)門ipTracer支持安全規(guī)則之間的相互綁定關(guān)系,我們會(huì)在每一輪分析的結(jié)尾部分,對(duì)剩余分析對(duì)象是否還滿足綁定關(guān)系進(jìn)行判斷,以消減進(jìn)行下一輪分析的代碼數(shù)量,進(jìn)一步加快整個(gè)程序分析進(jìn)程.同時(shí),在每一輪分析中,為了避免對(duì)整個(gè)應(yīng)用程序代碼做多余分析,我們利用程序切片技術(shù)僅抽取目標(biāo)數(shù)據(jù)點(diǎn)、執(zhí)行點(diǎn)附近的代碼用于分析.具體來說,我們用后向數(shù)據(jù)流分析確定程序切片的起點(diǎn),再利用正向數(shù)據(jù)流分析確定其終點(diǎn).然后利用控制流圖補(bǔ)全程序切片里的指令.

      TipTracer使用了3種不同靜態(tài)分析方法來驗(yàn)證4.3節(jié)提到的3種基本安全規(guī)約.首先,TipTracer使用的每種靜態(tài)分析方法都與其他幾種分析方法相互獨(dú)立,即不論TipTracer以何種順序進(jìn)行靜態(tài)分析都不會(huì)影響到其對(duì)應(yīng)用進(jìn)行規(guī)約驗(yàn)證的結(jié)果.然而,運(yùn)行不同程序分析的順序?qū)O大地影響到TipTracer進(jìn)行規(guī)約驗(yàn)證的效率.我們觀察到,靜態(tài)分析在檢查數(shù)據(jù)傳播規(guī)則時(shí)其分析速度會(huì)比檢查時(shí)序規(guī)則與參數(shù)賦值規(guī)則慢.此外,常量傳播分析的速度相對(duì)穩(wěn)定,受其他條件影響比較小.因此,TipTracer采用調(diào)度策略去調(diào)整這幾種分析技術(shù)的先后順序以加快整體分析的速度.具體來說,TipTracer首先檢測(cè)參數(shù)賦值規(guī)則,其次時(shí)序規(guī)則.而速度最慢的數(shù)據(jù)傳播規(guī)則被留到了最后.這樣經(jīng)過每一輪分析結(jié)尾階段對(duì)待測(cè)目標(biāo)的消減,在數(shù)據(jù)傳播分析階段僅剩下較少代碼片段,可大幅提升整體分析速度.

      5.2 TipTracer測(cè)試結(jié)果

      5.2.1 TipTracer發(fā)現(xiàn)的應(yīng)用軟件安全漏洞

      首先,我們使用于2015年11月從Google Play上獲取的2批應(yīng)用軟件作為測(cè)試集,以此對(duì)TipTracer發(fā)現(xiàn)應(yīng)用軟件安全漏洞的能力做出評(píng)估.其中,第1批13 072個(gè)應(yīng)用包含了在Google Play上每一分類中最流行的500個(gè)應(yīng)用,第2批應(yīng)用包含了13 072個(gè)從Google Play上隨機(jī)選取的應(yīng)用.圖9展示了2批應(yīng)用中違反代碼庫(kù)安全提示的應(yīng)用數(shù)分布.根據(jù)我們的測(cè)試結(jié)果,大約52%的流行免費(fèi)應(yīng)用與38%的隨機(jī)選取的應(yīng)用存在安全漏洞.為驗(yàn)證TipTracer的結(jié)果,我們從每個(gè)安全規(guī)約類別中隨機(jī)選擇有漏洞的應(yīng)用程序進(jìn)行人工驗(yàn)證.在被檢查的411個(gè)應(yīng)用中,有9個(gè)應(yīng)用的安全漏洞是TipTracer的誤報(bào),這意味著TipTracer的假陽(yáng)率為2.1%.根據(jù)我們的進(jìn)一步分析,所有的假陽(yáng)性結(jié)果都是在驗(yàn)證數(shù)據(jù)傳播規(guī)則時(shí)發(fā)生的(該規(guī)則使用了靜態(tài)污點(diǎn)分析方法進(jìn)行驗(yàn)證).由于上下文敏感或域敏感的數(shù)據(jù)流分析過程非常耗時(shí),所以我們采用的污點(diǎn)分析算法使用了上下文不敏感且域不敏感的分析方法以節(jié)省分析時(shí)間.但是,這種方法是不精確的.根據(jù)我們的驗(yàn)證結(jié)果,在這些由TipTracer得出的假陽(yáng)性結(jié)果中,有6個(gè)是由于TipTracer在靜態(tài)污點(diǎn)分析時(shí)使用不精確但省時(shí)的方法引起的.這些誤報(bào)可以通過使用上下文敏感、域敏感的方法來加以消除.其余3個(gè)假陽(yáng)性結(jié)果是由FlowDroid中的錯(cuò)誤引起的.

      Fig. 9 Distribution of violated apps from Google Play圖9 Google Play上違反安全提示的應(yīng)用數(shù)分布

      為進(jìn)一步了解存在安全漏洞應(yīng)用的分布情況,圖10統(tǒng)計(jì)了各下載量區(qū)段應(yīng)用中違反安全提示的應(yīng)用分布.對(duì)于不同的用戶下載量,圖10給出了隨機(jī)選取的應(yīng)用中違反安全提示應(yīng)用的比例.從圖10可以看出,有漏洞應(yīng)用比例在不同的下載量區(qū)間中相對(duì)穩(wěn)定,而在下載量比較大的應(yīng)用中稍微較多.因此,不論是流行應(yīng)用還是排名靠后的應(yīng)用都存在違反安全提示的情況.

      Fig. 10 The download numbers of violated apps圖10 違背安全提示的應(yīng)用下載量分布

      5.2.2 安全漏洞的持續(xù)存在性

      為了評(píng)估軟件中安全漏洞隨時(shí)間的變化情況,我們選擇了另外兩批安卓應(yīng)用作為樣本.其中一批樣本包含10 000個(gè)在2012年從Google Play上隨機(jī)選擇的應(yīng)用;另一批包含在2014年獲取的同樣的應(yīng)用.在這部分測(cè)試中,因?yàn)樵?012年沒有使用我們測(cè)試的第三方代碼庫(kù)LockPattern,因此我們沒有測(cè)試這些應(yīng)用中第三方代碼庫(kù)LockPattern所包含的安全提示.表1顯示:在2012年違反安全規(guī)約的1 753個(gè)有漏洞的應(yīng)用中僅363個(gè)在2014年修復(fù)了應(yīng)用中的安全漏洞.該結(jié)果顯示安全提示對(duì)消除安全漏洞僅起到了很小的作用.

      Table 1 Violation of Security Tips in Goolge Play Appsand the Fix

      5.2.3 概念驗(yàn)證攻擊

      本文不僅研究了在已有研究中被提及的安全提示信息,也對(duì)許多在本文中首次被提及的安全提示進(jìn)行了研究.在本節(jié)中,我們通過對(duì)真實(shí)應(yīng)用進(jìn)行實(shí)際攻擊來展示本文提到的安全漏洞如何使得應(yīng)用程序容易受攻擊者攻擊.

      1) 解密SQLCipher數(shù)據(jù)庫(kù)

      與安卓系統(tǒng)原生的數(shù)據(jù)庫(kù)解決方案不同,SQLCipher代碼庫(kù)提供了對(duì)數(shù)據(jù)庫(kù)文件進(jìn)行256位AES加密的功能,同時(shí)應(yīng)用程序無(wú)需考慮加密的細(xì)節(jié).應(yīng)用程序開發(fā)者通常會(huì)將SQLCipher當(dāng)作安全的數(shù)據(jù)庫(kù)加密方案,并認(rèn)為其他應(yīng)用是無(wú)法解密SQLCipher數(shù)據(jù)庫(kù)中的內(nèi)容的.因此,開發(fā)者也會(huì)認(rèn)為,存儲(chǔ)在SQLCipher數(shù)據(jù)庫(kù)中的內(nèi)容不會(huì)被惡意應(yīng)用訪問,并在設(shè)備丟失或被盜的情況下也是安全的.但是,利用本文中發(fā)現(xiàn)的安全漏洞,我們可以通過采用3個(gè)步驟來對(duì)SQLCipher數(shù)據(jù)庫(kù)文件進(jìn)行解密:

      ① 利用TipTracer分析目標(biāo)應(yīng)用,TipTracer會(huì)指出應(yīng)用軟件不安全的創(chuàng)建SQLCipher數(shù)據(jù)庫(kù)的相關(guān)代碼.

      ② 需要在SQLCipher創(chuàng)建數(shù)據(jù)庫(kù)代碼前插樁代碼,該代碼提取用于創(chuàng)建數(shù)據(jù)庫(kù)的密鑰,并將密鑰寫入日志中.

      ③ 利用該密鑰,可以編寫一個(gè)應(yīng)用來對(duì)SQLCipher數(shù)據(jù)庫(kù)進(jìn)行解密.由于數(shù)據(jù)庫(kù)密鑰是被嵌入到應(yīng)用中的一個(gè)固定密鑰,因此編寫的應(yīng)用可以在理論上解密目標(biāo)應(yīng)用的任何數(shù)據(jù)庫(kù)實(shí)例.

      我們研究了由TipTracer報(bào)告的10款應(yīng)用.在我們的示例攻擊中,我們成功解密了所有被報(bào)告應(yīng)用的數(shù)據(jù)庫(kù).

      2) 獲取應(yīng)用本地文件

      由于受到安卓沙箱機(jī)制的保護(hù),應(yīng)用程序開發(fā)者通常會(huì)假設(shè)應(yīng)用的本地文件不會(huì)被其他應(yīng)用軟件訪問.而正如3.3節(jié)的描述,TipTracer找到了一系列通過MODE_WORLD_READABLE模式訪問自身本地存儲(chǔ)的應(yīng)用.由于MODE_WORLD_READABLE模式無(wú)法對(duì)存儲(chǔ)空間的訪問者做出限制,這些應(yīng)用的存諸空間有可能會(huì)被惡意應(yīng)用所竊取.為不失一般性,我們從TipTracer的報(bào)告中隨機(jī)選擇了10個(gè)應(yīng)用,并編寫了與之安全漏洞相對(duì)應(yīng)的示例攻擊應(yīng)用.我們確認(rèn)示例攻擊應(yīng)用可以在未獲取任何安卓權(quán)限的情況下獲取這些應(yīng)用本地文件中的內(nèi)容.

      5.2.4 本文其他發(fā)現(xiàn)

      1) 流行的免費(fèi)應(yīng)用并未能更好地遵守代碼庫(kù)安全提示

      我們可能會(huì)認(rèn)為流行的免費(fèi)應(yīng)用會(huì)更少地違反安全提示,因?yàn)樗鼈兊拈_發(fā)者有更多的資源來提升應(yīng)用的質(zhì)量.但是,表2顯示流行應(yīng)用所違反的安全提示數(shù)量甚至超過了隨機(jī)選擇應(yīng)用所違反的數(shù)量.我們的人工驗(yàn)證表明,流行免費(fèi)應(yīng)用更趨向于使用安全敏感的代碼庫(kù),但它們的開發(fā)者通常會(huì)忽略代碼庫(kù)所提出的安全需求與安全提示.同時(shí),排名靠后的應(yīng)用常會(huì)使用完全沒有安全保證的代碼庫(kù),而使用這樣的代碼庫(kù)會(huì)對(duì)應(yīng)用的安全造成極大的威脅.

      Table 2 Violation of Security Tips in Popular Apps and Random Apps from Google Play表2 在流行應(yīng)用和隨機(jī)應(yīng)用中對(duì)安全提示的違反情況

      2) 第三方代碼庫(kù)的安全提示更易被應(yīng)用軟件開發(fā)者忽略

      表2顯示超過94%的使用第三方代碼庫(kù)(SQLCipher和LocakPattern)的應(yīng)用開發(fā)者都未能遵守代碼庫(kù)的安全提示,對(duì)第三方代碼庫(kù)安全提示的違反比例遠(yuǎn)超安卓?jī)?nèi)置代碼庫(kù)安全提示的違規(guī)比例.在2.5節(jié)中,我們研究了這2類安全提示并討論了這2類代碼庫(kù)所存在的問題.

      5.3 TipTracer的分析耗時(shí)

      在我們的5.2節(jié)測(cè)試過程中,TipTracer分析框架的運(yùn)行環(huán)境為:

      1) 雙路Xeon 8核2.0 GHz CPU;

      2) 32 GB內(nèi)存;

      3) Debian Linux,內(nèi)核版本2.6.32.

      我們對(duì)所有51 650個(gè)應(yīng)用的靜態(tài)分析過程共耗時(shí)634 h.若將分析過程的工作負(fù)載分配到多臺(tái)計(jì)算機(jī)上,分析時(shí)間還可以被進(jìn)一步縮短.平均每個(gè)應(yīng)用的分析耗時(shí)為44 s,這一耗時(shí)對(duì)于安卓市場(chǎng)的運(yùn)營(yíng)者來說是可以忽略不計(jì)的.

      6 關(guān)于TipTracer的討論

      TipTracer是一個(gè)對(duì)給定的安全規(guī)約進(jìn)行自動(dòng)化驗(yàn)證的分析框架.由于代碼庫(kù)安全提示大多指定API層的安全實(shí)現(xiàn)需求,因此當(dāng)前TipTracer的安全規(guī)則邏輯被設(shè)計(jì)為僅能對(duì)應(yīng)用代碼在方法粒度的規(guī)約做出安全約束.TipTracer尚不能在更細(xì)粒度上表述安全規(guī)約,例如TipTracer無(wú)法為一個(gè)給定方法的實(shí)現(xiàn)細(xì)節(jié)作出安全約束.因此,雖然目前我們發(fā)現(xiàn)的所有安全提示都在方法這一級(jí)別為開發(fā)者提出代碼編寫指導(dǎo),但若要進(jìn)行進(jìn)一步的研究,我們?nèi)匀恍枰?xì)粒度的安全規(guī)約定義與應(yīng)用分析器,細(xì)粒度的形式化定義與自動(dòng)化分析是本研究未來可能的一個(gè)擴(kuò)展方向.

      為了消除應(yīng)用程序中的不安全應(yīng)用代碼實(shí)現(xiàn),最佳的辦法是通過發(fā)出編譯時(shí)錯(cuò)誤來阻止不安全的代碼實(shí)踐通過編譯,并防止不安全的應(yīng)用被上傳到應(yīng)用市場(chǎng).由于我們的靜態(tài)分析可能會(huì)帶來誤報(bào),因此有時(shí)一個(gè)安全的應(yīng)用也會(huì)被誤報(bào)為不安全的.幸運(yùn)的是,通過記錄應(yīng)用違反的安全規(guī)則,以及相應(yīng)的執(zhí)行點(diǎn)集合、數(shù)據(jù)點(diǎn)集合,TipTracer分析器可以報(bào)告出所有違規(guī)的細(xì)節(jié).例如TipTracer會(huì)報(bào)告每個(gè)執(zhí)行點(diǎn)集合、數(shù)據(jù)點(diǎn)集合所對(duì)應(yīng)的代碼行,并報(bào)告數(shù)據(jù)傳播規(guī)則所對(duì)應(yīng)的完整傳播路徑,這些細(xì)節(jié)可以為開發(fā)者進(jìn)行手工驗(yàn)證提供極大的幫助.為消除TipTracer的分析誤報(bào),一個(gè)可能的方案是使用更高精度的分析方法.例如,我們可以使用上下文敏感、字段敏感的污點(diǎn)分析方法來消除大部分誤報(bào).此外,大多數(shù)誤報(bào)還可以通過稍微修改應(yīng)用代碼加以避免.例如,使用簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)來處理敏感數(shù)據(jù)(如數(shù)據(jù)庫(kù)密鑰),這樣可以避免由字段不敏感的分析所引起的誤報(bào).

      TipTracer目前與安卓應(yīng)用編譯器是相互獨(dú)立的,我們需要先使用安卓應(yīng)用編譯器來生成字節(jié)碼,再使用TipTracer來分析字節(jié)碼.然而,某些源代碼所包含的信息,如方法名等,在混淆后的字節(jié)碼中會(huì)丟失,所以字節(jié)碼所包含的信息量較源代碼會(huì)少很多.因此,TipTracer分析混淆后的代碼可能會(huì)產(chǎn)生遺漏.將來我們準(zhǔn)備將TipTracer整合到安卓應(yīng)用編譯器中,這樣可以在很大程度上減少由信息丟失帶來的漏報(bào).

      7 相關(guān)工作比較

      本節(jié)我們將與相關(guān)工作進(jìn)行比較.

      1) 安卓中的靜態(tài)分析

      本文我們使用程序靜態(tài)分析技術(shù)檢測(cè)安卓應(yīng)用軟件是否遵守安全規(guī)約.靜態(tài)分析已經(jīng)廣泛用于安卓中的漏洞檢測(cè)[27-31].其中靜態(tài)污點(diǎn)分析是最流行的技術(shù)之一,它可以監(jiān)控安卓系統(tǒng)和應(yīng)用之間的數(shù)據(jù)傳播[26,32-36].此技術(shù)回答了什么數(shù)據(jù)(數(shù)據(jù)源)流向了什么地方(目的地)的問題.而這也是本文工具設(shè)計(jì)的一個(gè)重要思想.但與前人工作不同的是,本文在使用該技術(shù)之前,首先對(duì)安全規(guī)約進(jìn)行了形式化建模分析,并將其與靜態(tài)分析技術(shù)結(jié)合起來,彌補(bǔ)了文本化的安全規(guī)約與程序化的靜態(tài)分析之間的差距,并基于此實(shí)現(xiàn)了自動(dòng)化的漏洞挖掘.

      2) 安卓應(yīng)用的漏洞挖掘

      據(jù)我們所知,TipTracer是第1個(gè)系統(tǒng)化的研究安卓安全規(guī)約機(jī)制與對(duì)應(yīng)漏洞挖掘技術(shù)的工作,并揭示了應(yīng)用安全漏洞與安全規(guī)約之間的關(guān)系.目前為止,其他關(guān)于安卓應(yīng)用漏洞的研究一般都只針對(duì)一種特定代碼庫(kù)的安全規(guī)約.例如MalloDroid[37]及Georgiev等人的工作[38]研究了網(wǎng)絡(luò)安全通訊協(xié)議(SSL)在安卓應(yīng)用軟件中的使用情況.其研究結(jié)果表明,安卓應(yīng)用經(jīng)常誤用SSL協(xié)議導(dǎo)致網(wǎng)絡(luò)流量數(shù)據(jù)暴露在攻擊者威脅之下;Poeplau等人[10]專門研究了安卓的動(dòng)態(tài)代碼加載機(jī)制,并揭示了安卓應(yīng)用程序因?yàn)槔貌话踩耐獠客ǖ兰虞d代碼而造成安全漏洞問題;CryptoLint[7]揭示了安卓應(yīng)用誤用數(shù)據(jù)加密代碼庫(kù)所引起的安全漏洞.相對(duì)于這些研究,本文不僅系統(tǒng)化地研究了大量安全規(guī)約,還研究了4類之前未被研究過的軟件安全規(guī)約.而且,本文提出了一整套自動(dòng)化分析框架,用于檢測(cè)安卓應(yīng)用程序師父遵守安全規(guī)約.在該框架中,我們提出了一套安全規(guī)約語(yǔ)言,該語(yǔ)言形式化地定義了由安全提示所隱含的編程規(guī)約.相較于TipTracer可以形式化地定義和驗(yàn)證不同的安全規(guī)約,現(xiàn)有的工作目前僅完成了對(duì)特定規(guī)約的形式化定義.MC擴(kuò)展[39]將安全規(guī)約以狀態(tài)機(jī)的方式進(jìn)行了建模,關(guān)注于對(duì)調(diào)用順序規(guī)則的驗(yàn)證;MECA[40]使用基于靜態(tài)污點(diǎn)傳播的數(shù)據(jù)依賴規(guī)則.上述安全規(guī)約定義方法僅能單一地關(guān)注于純控制流規(guī)則或純數(shù)據(jù)流規(guī)則.而安卓代碼庫(kù)的安全提示所導(dǎo)出的安全規(guī)約可能會(huì)非常復(fù)雜,一個(gè)單一的規(guī)約可能會(huì)同時(shí)引入調(diào)用順序規(guī)則與數(shù)據(jù)依賴規(guī)則.由于已有的規(guī)約系統(tǒng)不能表示復(fù)合規(guī)則,因此無(wú)法對(duì)實(shí)際需要的安全提示進(jìn)行完整而準(zhǔn)確地描述.例如有限狀態(tài)自動(dòng)機(jī)不能表示數(shù)據(jù)依賴規(guī)則,污點(diǎn)傳播規(guī)則不能表示調(diào)用順序規(guī)則.

      8 結(jié) 論

      本文研究了大多數(shù)代碼庫(kù)設(shè)計(jì)人員避免應(yīng)用安全漏洞的方法,即使用安全提示來引導(dǎo)應(yīng)用開發(fā)者編寫安全的應(yīng)用.與以往僅關(guān)注于某一特定類型的安全規(guī)約的研究不同,我們指出系統(tǒng)的理解安全提示機(jī)制的有效性與缺陷可以幫助我們識(shí)別安全漏洞的根源.此外,正如本文中所提到的那樣,我們通過跟蹤以往未被深入研究的安全提示,發(fā)現(xiàn)了許多未被報(bào)告的應(yīng)用安全漏洞.基于我們對(duì)有漏洞的安卓應(yīng)用與安全提示的觀察,我們認(rèn)為缺少自動(dòng)化的驗(yàn)證與提示工具是許多安全漏洞產(chǎn)生的重要原因.因此,我們提出了TipTracer,一個(gè)新的應(yīng)用分析框架來高效、自動(dòng)化地驗(yàn)證與報(bào)告安卓應(yīng)用對(duì)安全規(guī)約的遵守情況.TipTracer使用形式化的安全規(guī)約替代了以自然語(yǔ)言表述的安全提示,并使用了一個(gè)集中式的分析器來檢測(cè)應(yīng)用對(duì)安全規(guī)約的違背情況.在TipTracer分析器的幫助下,我們可以將編譯時(shí)安全檢查整合到安全漏洞敏感的應(yīng)用市場(chǎng)審查過程中,提升應(yīng)用市場(chǎng)中各類應(yīng)用的安全性.

      猜你喜歡
      安全漏洞規(guī)約安卓
      文物表情包
      電力系統(tǒng)通信規(guī)約庫(kù)抽象設(shè)計(jì)與實(shí)現(xiàn)
      一種在復(fù)雜環(huán)境中支持容錯(cuò)的高性能規(guī)約框架
      安全漏洞太大亞馬遜、沃爾瑪和Target緊急下架這種玩具
      玩具世界(2018年6期)2018-08-31 02:36:26
      一種改進(jìn)的LLL模糊度規(guī)約算法
      基于安全漏洞掃描的校園網(wǎng)告警系統(tǒng)的開發(fā)與設(shè)計(jì)
      一種基于安卓系統(tǒng)的手機(jī)側(cè)抓包分析方法
      修辭的敞開與遮蔽*——對(duì)公共話語(yǔ)規(guī)約意義的批判性解讀
      安卓L未至安卓M來了!安卓首泄漏M系統(tǒng)
      安全漏洞Shellshock簡(jiǎn)介
      河南科技(2014年11期)2014-02-27 14:16:49
      平凉市| 门源| 郁南县| 昔阳县| 抚顺市| 凭祥市| 吴江市| 舟山市| 漯河市| 斗六市| 鄱阳县| 钟祥市| 普兰县| 清新县| 德令哈市| 江西省| 枣庄市| 福安市| 分宜县| 淮安市| 拜泉县| 通州市| 陕西省| 巴塘县| 昭平县| 道孚县| 陆河县| 万宁市| 白朗县| 赤峰市| 革吉县| 彭水| 神木县| 儋州市| 科尔| 八宿县| 威海市| 温州市| 札达县| 买车| 龙泉市|