張 磊 楊哲慜 李明琪 楊 珉
(復旦大學軟件學院 上海 201203)
隨著安卓系統(tǒng)的流行,安卓應用正被部署到數(shù)以億計的移動設備上,龐大的安卓應用數(shù)對惡意攻擊者產(chǎn)生了巨大的誘惑.然而,許多安卓應用,包括一些流行的應用,都包含大量的安全漏洞[1].現(xiàn)有的研究成果表明,大量的軟件安全漏洞都是由于開發(fā)者不正確地使用安卓代碼庫引起的.例如對于安卓系統(tǒng)的Webview[1-3]、安全通訊協(xié)議(SSL)[4-5],如果應用程序以不安全的方式使用它們,就會很容易造成應用軟件的安全缺陷.因此,為消除這些軟件安全漏洞,我們需要首先理解為何應用軟件會不恰當?shù)厥褂冒沧看a庫,以及如何阻止這種不安全使用.
軟件開發(fā)工具包(SDK)和其他庫通常附帶開發(fā)人員指南,指南中說明了如何安全地使用這些工具包.這些信息被稱為安全提示或安全規(guī)約.有時它們也會出現(xiàn)在其他地方,比如谷歌的安全提示網(wǎng)站和一些開發(fā)者論壇(例如Android Development Community, Android People).有研究表明,這些安全提示在應用開發(fā)中并沒有被嚴格遵守.但是,目前仍缺乏對該問題的嚴重程度以及其安全隱患的充分認知.此外,應用開發(fā)者們對安全規(guī)約的內(nèi)容及其有效性缺乏深入的理解,這也是影響安全規(guī)約在實踐中使用效果的一個重要因素.例如人們可能會問:在熱門應用中,這些安全規(guī)約是否經(jīng)常出現(xiàn)?他們什么時候受到好評、什么時候不受歡迎?對于違規(guī)行為,誰應該負起責任,庫提供者或應用程序的開發(fā)人員?我們可以做些什么來使提示更有效、更有可能在應用程序開發(fā)中使用?這些問題的答案對于安卓應用安全至關重要,因為這些安全規(guī)約中報告的問題對于惡意攻擊者來說也是公開的,他們可以輕易地利用這些安全隱患來攻擊那些未能提供保護的應用.
理解安全規(guī)約的現(xiàn)狀.我們系統(tǒng)性地研究了安全規(guī)約在大量流行應用中的實際遵守情況.為此,我們首先從谷歌官方文檔、第三方庫提供者和學術(shù)文獻等多個渠道收集了大量的安全規(guī)約,然后我們設計并開發(fā)了一個靜態(tài)分析框架,對來自谷歌官方應用市場的13 072個流行應用以及13 072個隨機應用進行了檢測,以判斷這些應用是否違反了安全規(guī)約.結(jié)果表明:有大約50%的被測應用未遵守安全規(guī)約,導致了諸如動態(tài)加載不可信代碼、隱私泄露以及SSL證書錯誤驗證等安全漏洞問題.
此外,本文研究了Android應用程序可能會違反安全規(guī)約的原因.我們首先總結(jié)了安全規(guī)約中的11種特征并對其進行了評估,例如安全規(guī)約描述中的關鍵詞、安全規(guī)約出現(xiàn)的位置、應用中使用的庫等特征.然后,我們對所選的應用程序以及3個額外的應用集合進行了進一步的分析.結(jié)果顯示:安全規(guī)約的違反主要由4個原因造成:
1) 模糊的語言描述.由自然語言描述的安全規(guī)約難以描述得很準確,因此也難以被開發(fā)人員抓住重點.另外,我們還發(fā)現(xiàn)安全規(guī)約中使用的某些關鍵詞容易誤導其讀者,因為這些關鍵詞具有多種含義.
2) 碎片化的規(guī)約分布.安全規(guī)約分散在庫文檔、技術(shù)論壇、技術(shù)博客等各個地方,導致開發(fā)者難以一次性獲取需要遵守的安全規(guī)約集合.我們的實驗結(jié)果也表明,大部分的應用只遵守了部分安全規(guī)約.
3) 誤導性的代碼示例.某些庫的默認設置本身就不符合其安全規(guī)約.此外,同樣的問題也在庫的代碼示例中出現(xiàn),導致應用開發(fā)者無意中因參考示例代碼而違反了安全規(guī)約.
4) 缺乏強制性.第三方庫提供的安全規(guī)約一般都屬于建議性質(zhì),缺乏相應的強制措施使開發(fā)者必須遵守.
安全規(guī)約的自動化檢測.基于安全規(guī)約已公開,以及安全規(guī)約涉及的安全漏洞對所有用戶(包括惡意攻擊者)公開的事實,我們認為無論應用是否涉及用戶的隱私數(shù)據(jù)(比如登錄憑證、信用卡號碼、銀行賬號等),應用開發(fā)者都應該嚴格遵守安全規(guī)約的提示,這也需要一個有效的工具來進行自動化的安全檢查.因此,我們開發(fā)了一個新的靜態(tài)分析檢查框架TipTracer.和已有的安全檢查工具不同,TipTracer是首個對安全規(guī)約文檔所描述的缺陷進行強制安全檢查的工具.它使用靜態(tài)程序分析技術(shù)在數(shù)據(jù)流和控制流2個方面對應用中安全規(guī)約的實施情況進行自動化的檢查,同時還會將具有安全漏洞的代碼作為分析報告的一部分進行輸出.對來自谷歌官方應用市場的大量應用進行的實驗分析表明,TipTracer能有效地識別安全規(guī)約的違反情況,而且其誤報率比較低.TipTracer可被應用在Android應用生命周期的3個環(huán)節(jié):
1) 庫提供者.庫提供者可以將安全規(guī)約添加進TipTracer,TipTracer進而就可以自動地對使用該庫的安卓應用進行安全規(guī)約遵守情況的檢查.
2) 應用開發(fā)者.應用開發(fā)者可以使用TipTracer來檢查該應用是否遵守庫提供者所給出的安全規(guī)約.
3) 應用市場.應用市場可以使用TipTracer來對應用進行審核,進而識別應用中是否違反應滿足的安全規(guī)約.
本文的主要貢獻有3個方面:
1) 系統(tǒng)研究了移動應用對安全規(guī)約的遵守情況.本文對安全規(guī)約的遵守情況進行了大規(guī)模系統(tǒng)化的研究,發(fā)現(xiàn)移動應用普遍忽視安全規(guī)約,導致應用程序包含大量安全漏洞.其原因主要為:安全規(guī)約通常語言表述較為模糊、規(guī)約分布比較碎片化、示例代碼也會違反規(guī)約本身以及目前缺乏強制性手段幫助開發(fā)者遵守安全規(guī)約.此外,由于這些安全規(guī)約及相關漏洞報告已經(jīng)被公開,應用漏洞面臨著巨大的被攻擊風險.同時,為了使開發(fā)者能更好的遵守安全規(guī)約,其質(zhì)量也需要進一步提高.
2) 實現(xiàn)了一個自動化檢查安全規(guī)約的程序分析框架.本文設計了首個自動化檢查應用中安全規(guī)約遵守情況的檢測框架TipTracer.該框架提供了一個形式化語言對安全規(guī)約進行表述,并利用程序分析技術(shù)在控制流和數(shù)據(jù)流2個角度對移動應用進行檢查.同時,該框架的形式化規(guī)則語言不僅可以表述已有安全規(guī)約,也可以用于其他漏洞表述,具有通用性.
3) 大規(guī)模的實驗分析.本文收集了部分安全規(guī)約,并以表述這些規(guī)約為例展示了如何利用TipTracer的漏洞檢測能力.通過對谷歌官方應用市場中的大量應用進行了檢測,發(fā)現(xiàn)超過50%的應用都存在違反安全規(guī)約的情況.
我們在安卓與第三方代碼庫所提供的安全規(guī)約中選擇了七大類提示進行研究.
1)MODE_WORLD_READABLE相關的安全提示
安卓應用可以在使用共享配置(shared-preference)、數(shù)據(jù)庫實例或本地文件時使用MODE_WORLD_READABLE模式以允許其他應用讀取其本地存儲空間中的內(nèi)容.但是,一旦本地存儲空間被以MODE_WORLD_READABLE模式進行過訪問,任何將本地信息寫入這一存儲空間的操作都是危險的,因為帶有MODE_WORLD_READABLE標志的存儲空間無法對來自未授權(quán)應用的讀取操作做出限制.因此,惡意應用可以在未經(jīng)授權(quán)的情況下從這些文件中獲取敏感信息.我們在圖1中給出了一個關于MODE_WORLD_READABLE模式的安全規(guī)約示例.

類似于MODE_WORLD_READABLE向所有應用授予了應用本地存儲空間的讀取權(quán)限,MODE_WORLD_WRITABLE向所有應用授予了寫入應用本地存儲空間的權(quán)限.因此,從帶有MODE_WORLD_WRITABLE的存儲空間中加載和使用數(shù)據(jù)是存在安全隱患的.帶有MODE_WORLD_WRITABLE標志的存儲空間中的數(shù)據(jù)甚至會被未經(jīng)授權(quán)的應用損壞.圖1給出了一個關于MODE_WORLD_WRITABLE的安全規(guī)則示例.
此外,我們還選取了在已有工作中已經(jīng)被提及的一些其他安全提示.我們選擇這些安全提示主要是為了證明TipTracer作為通用漏洞檢測框架的能力.具體來說,首先,我們收集了大量Google Play上的最新應用;然后,利用現(xiàn)有的已知工具對這些應用進行分析,并將其分析結(jié)果作為基準;最后,我們利用TipTracer來分析這些應用,并將分析結(jié)果與基準進行對比以確保TipTracer能覆蓋現(xiàn)有工作的結(jié)果.在實際實驗中,我們研究了3個安全提示:
1) SSL相關的安全提示
正如Google關于SSL的官方文檔[6]中所表述的,若應用未正確的使用SSL代碼庫,則惡意應用就有機會在網(wǎng)絡上截獲該應用的數(shù)據(jù).具體來說,安全提示警告開發(fā)者避免使用信任所有證書的自定義主機名驗證器(hostname verifier),同時應用程序也不應該通過使用SSL-SocketFactory類來信任所有的主機名.TipTracer的安全規(guī)約覆蓋了所有這些對SSL代碼庫的誤用.
2) 與數(shù)據(jù)加密代碼庫相關的安全提示
CryptoLint[7]研究了Android應用對數(shù)據(jù)加密代碼庫的誤用情況,并將其總結(jié)為6條安全建議.例如應用在加密時不應使用ECB模式,應用也不應在對數(shù)據(jù)進行CBC加密時使用非隨機的初始化向量.類似的安全提示在安卓安全提示頁[8]上也存在.TipTracer繼承了其關于不安全使用加密代碼庫的定義和相關安全規(guī)約.
3) 與動態(tài)代碼載入機制相關的安全提示
動態(tài)代碼載入機制允許應用動態(tài)加載在程序啟動前并不知曉的Java代碼.由于通常會從外部存儲設備上加載代碼,動態(tài)代碼載入會顯著增加應用被惡意第三方通過代碼注入或代碼篡改進行攻擊的可能性.通過研究安卓開發(fā)者指南[8-9]中官方的安全提示,及Poeplau等人的工作[10]中提供的安全提示信息,我們導出了使用安卓動態(tài)代碼加載類的安全規(guī)約.該安全規(guī)約會驅(qū)動TipTracer檢查應用是否會動態(tài)地從不安全的存儲空間加載代碼,以及應用是否使用了不安全的存儲空間來緩存動態(tài)加載的類.
安卓原生代碼庫的安全提示在已有的工作中已被討論過,TipTracer可以形式化地表述它們對應的安全規(guī)約并自動地驗證應用是否滿足了這些安全規(guī)約.此外,本文首次研究了第三方代碼庫中的安全提示.下面是本文選取的2個安全提示示例:
1) SQLCipher代碼庫的安全提示
SQLCipher[11]代碼庫是一個流行的基于SQLite數(shù)據(jù)庫的第三方擴展代碼庫.該代碼庫封裝了對數(shù)據(jù)庫文件進行256位AES加密的功能,同時應用開發(fā)者無需考慮加密過程的細節(jié).然而,在使用SQLCipher數(shù)據(jù)庫時,不將固定的解密密鑰放入應用程序客戶端文件中是保證數(shù)據(jù)存儲安全的一個關鍵因素,因為如果應用程序使用固定密鑰,攻擊者就可以通過從應用程序的安裝包中提取密鑰并對數(shù)據(jù)庫進行解密操作[12-14].
2) LockPattern代碼庫的安全提示
Lock Pattern是一個第三方隱私保護擴展,該代碼庫為應用提供了添加圖形化鎖定模塊的功能,該模塊可以被用于保護應用程序內(nèi)部數(shù)據(jù)不被未授權(quán)的其他用戶使用.為保護圖形密鑰,LockPattern的安全提示要求開發(fā)者對用戶設定的圖形模式[15]使用自定義的加密器進行加密.若應用未設置自定義的加密類,LockPattern會使用原始的哈希函數(shù)來對圖形密碼進行加密,而這種加密方法可以輕易的被攻擊者所攻破并解密.圖2展示了從這一安全提示導出的安全規(guī)約.
圖2給出了軟件安全提示違反的一個實例:LockPatternActivity.LockPattern在其軟件安全規(guī)約中指出,在啟動器LockPatternActivity之前,應用軟件需要首先調(diào)用setEncrypterClass方法來指定一個加密器.在圖2中,有漏洞的應用在未指定加密器的情況下啟動了LockPatternActivity.我們可以將這一實例通過2個函數(shù)調(diào)用事件及其時間順序進行描述:首先,應用程序創(chuàng)建了一個Intent對象,并將其對應的組件類設置為LockPatternActivity(行④).之后,應用程序在調(diào)用setEncrypterClass函數(shù)(行⑥)之前啟動了Intent對象指定的Activity(行⑦).

應用軟件安全建議通過語言這一載體,以非正式的方式傳達給程序員.同時,我們發(fā)現(xiàn)現(xiàn)有工具都不能檢測應用軟件因違反安全建議而產(chǎn)生的應用安全問題.通過分析安卓應用程序編寫和編譯機制,我們發(fā)現(xiàn)在編譯階段,編譯器沒有對應用程序違反安全建議的行為拋出編譯時錯誤,因此,現(xiàn)有安卓應用編譯機制無法避免應用程序因程序員違反安全建議而造成的安全缺陷.此外,我們發(fā)現(xiàn)編譯器只會在少數(shù)安全建議違反的情況下才發(fā)出警告,而這些警告都是因為應用程序訪問了過時的系統(tǒng)調(diào)用接口.然而,由于使用過時系統(tǒng)調(diào)用接口并不代表應用程序會存在安全問題,因為這類編譯時警告往往被程序員所忽略.
我們發(fā)現(xiàn)代碼庫開發(fā)者在向程序開發(fā)者傳達安全建議時,并沒有一個統(tǒng)一的傳達渠道,而是通過將安全建議集成入API文檔、使用實例、安全教程中或者在開發(fā)者博客和論壇上發(fā)布安全建議說明等方式傳達安全建議內(nèi)容.這種安全建議的碎片化現(xiàn)象使得開發(fā)者很難掌握其所使用的代碼庫完全的安全使用需求.
實例分析1. 動態(tài)代碼加載安全建議.
Java語言的動態(tài)代碼加載機制為應用程序提供在運行時動態(tài)加載程序代碼的途徑.通過這一途徑,程序員可以靈活控制加載入應用的程序代碼.然而,由于通過動態(tài)代碼加載機制載入應用的代碼將在應用程序中被直接運行,因此如果在加載過程中,訪問了不安全的外部存儲位置(如SD卡)或者通過未加密的通道從遠程服務器加載代碼庫,應用程序就可能面臨被惡意入侵者劫持的風險.今年年初,Poeplau等人[10]介紹了在安卓應用程序中,因為應用程序開發(fā)者不安全使用動態(tài)代碼加載機制帶來的軟件安全漏洞.
事實上,在谷歌官方的開發(fā)者文檔中,對于動態(tài)代碼機制的安全問題已經(jīng)提出了相應的安全建議.然而,對于對應代碼庫的安全建議主要有2條,而對于這2條安全建議的描述卻被分散在2個不同的位置:在安卓開發(fā)者文檔的“安全提示(security tips)”頁[8]中,代碼庫設計者強調(diào)在使用動態(tài)代碼加載時,開發(fā)者需要確保被加載的代碼必須來自于不可被篡改的安全加載源.另外,在開發(fā)者文檔中的DexClass-Loader的接口頁[9]中,代碼庫設計者強調(diào)在使用動態(tài)代碼加載時,開發(fā)者需要確保被加載的代碼不可被緩存在可被篡改的介質(zhì)中.被分散的安全建議造成軟件開發(fā)者無法完整捕獲動態(tài)代碼加載的安全規(guī)約,而一旦開發(fā)者錯失部分的安全建議,就可能導致應用程序存在不安全加載動態(tài)代碼庫的行為.
目前,安卓代碼庫的安全建議均采用自然語言的方式呈現(xiàn)給程序開發(fā)者.由于自然語言中存在復雜語義,并且可能包含大量存在歧義和具誤導性的詞或句子,因此應用開發(fā)者在閱讀安全建議時可能會誤解安全建議的內(nèi)容.尤其是當程序開發(fā)者的母語和安全建議所使用語言不一致時,該問題更為嚴重.
實例分析2. Rastreador celular Inteligente.
安卓應用程序在使用SharedPreference,本地數(shù)據(jù)庫或者本地文件存儲私有數(shù)據(jù)時,可以設置該數(shù)據(jù)的共享模式.在這一過程中,如果該共享模式被設置為MODE_WORLD_READABLE或MODE_WORLD_WRITABLE時,通過該介質(zhì)存儲的信息就可以被本機其他應用讀取或?qū)懭?在谷歌的安全建議頁[8]中,代碼庫設計者警告:“你應該避免使用MODE_WORLD_READABLE和MODE_WORLD_WRITABLE模式,因為他們不對特定應用程序提供訪問控制,同時也不對數(shù)據(jù)存儲格式做出任何限制”.
Rastreador celular Inteligente[16]是一款用于朋友之間相互發(fā)送短信的軟件.在對這款軟件的分析過程中,我們發(fā)現(xiàn),應用程序的開發(fā)者將MODE_WORLD_READABLE誤認為是MODE_READ,將MODE_WORLD_WRITABLE誤認為是MODE_WRITE.因此,每當該軟件需要查詢本地數(shù)據(jù)庫時,程序開發(fā)者都將本地數(shù)據(jù)庫的訪問模式設置為MODE_WORLD_READABLE.類似地,當該軟件需要更新數(shù)據(jù)時,程序開發(fā)者都會將數(shù)據(jù)的共享模式設置為MODE_WORLD_WRITABLE.因此,當程序需要讀寫它的數(shù)據(jù)庫時,它同時也賦予其他所有的應用程序讀取或?qū)懭肫浔镜財?shù)據(jù)庫的權(quán)限.同時,我們發(fā)現(xiàn),安卓系統(tǒng)代碼庫的所有安全建議都是使用英語書寫的,而我們分析的這款軟件是由一個葡萄牙公司開發(fā)的,因此,我們認為這個安全漏洞很大可能是由于開發(fā)者誤解安全建議的英文表述所引起的.
代碼庫有時會通過提供示例代碼來演示對其提供接口的使用方法.與之類似地,一些關于安卓開發(fā)的書籍或者在網(wǎng)上的技術(shù)談論文章中,也時常通過實例代碼演示對安卓代碼庫的使用方法.我們發(fā)現(xiàn)安卓應用的開發(fā)者不僅會瀏覽演示示例的內(nèi)容,還會將其中的代碼復制到自己的應用中,從而減少開發(fā)成本.然而,如果示例代碼本身包含不完全的代碼庫使用,將示例代碼嵌入應用這一行為將造成開發(fā)中應用得安全缺陷.
實例分析3. 已出版的安卓書籍.
如果應用程序使用MODE_WORLD_READABLE或者MODE_WORLD_WRITABLE這2個參數(shù)訪問本地存儲的數(shù)據(jù),會造成其本地數(shù)據(jù)全局可讀或可寫,并代碼應用程序的安全隱患.本節(jié)我們進一步研究了存在于安卓示例代碼中對這2項不安全配置的使用情況.我們的觀察結(jié)果顯示,誤導性的代碼片段不僅在網(wǎng)上的技術(shù)文章與相關技術(shù)討論中被大量誤用,類似使用也存在于已出版的介紹安卓開發(fā)的圖書中.我們發(fā)現(xiàn)在至少3本技術(shù)類書籍[17-19]中包含了不安全的代碼庫使用,并且在這些數(shù)據(jù)中都沒有給出相關的安全提示.
在安卓原生代碼庫以外,我們還研究了2個用于增強應用安全性的第三方安卓代碼庫:SQLCipher與LockPattern:SQLCipher[11]提供了對應用程序本地SQLite數(shù)據(jù)庫進行256位AES加密的功能,應用程序可以通過庫函數(shù)接口進行加密配置,而不需要考慮加密函數(shù)的細節(jié).LockPattern提供了給應用程序添加圖形化鎖定模塊的功能,該模塊可以被用于保護應用程序內(nèi)部數(shù)據(jù)不被未授權(quán)其他用戶使用.它們都含有上文中所提到的問題.
1) 我們發(fā)現(xiàn)這些第三方代碼庫在描述安全需求時,比原生安卓代碼庫更傾向于使用模糊或較弱的表述方式,比如他們經(jīng)常使用“更加安全”或“建議使用……而非……”的方式描述安全需求.這很容易引起程序員的誤解.相反,安卓開發(fā)者文檔更傾向于使用較強的語氣表述需求,如“避免……”或“……將引起漏洞”等.
2) 這些第三方代碼庫都未將安全提示放進其接口文檔或代碼庫使用教程中.我們發(fā)現(xiàn)它們有時將安全提示放在了開發(fā)者博客[13]的一個單獨的頁面上,有時將其放在接口文檔的不明顯的角落切沒有明顯指向該頁面的鏈接[15].更有甚者,有時代碼庫開發(fā)者還將安全提示散布于Google群組討論[12]或者Stackoverflow的問答[14]中.碎片化的安全提示使開發(fā)人員難以理解代碼庫所提出的需求并遵守相關要求.
3) 雖然SQLCipher在其安全提示中建議不要將固定的密鑰置于應用程序代碼中,我們?nèi)匀话l(fā)現(xiàn)在SQLCipher的官方代碼庫使用教程[20]與SQLChipherForAndroid-SDK[21]的示例中存在使用固定密鑰的情況.
為了在移動應用中大規(guī)模檢測安全規(guī)約的遵守情況,我們設計并實現(xiàn)了一個基于靜態(tài)分析的安卓應用通用漏洞檢測框架,名為TipTracer.圖3展示了TipTracer的總體架構(gòu).該框架主要由一個安全規(guī)約模型與一個靜態(tài)軟件分析器構(gòu)成.
1) 安全規(guī)約模型.為了解決在2.3節(jié)中討論的由安全提示的自然語言描述特性帶來的語義誤解問題,我們設計了一個編程模型來形式化地描述代碼安全規(guī)約.由于安全提示普遍在方法級別描述程序的正常代碼庫使用行為,TipTracer的安全規(guī)約模型允許代碼庫設計人員描述方法調(diào)用的安全時間順序、調(diào)用參數(shù)與返回值間的數(shù)據(jù)依賴關系,以及對參數(shù)賦予的限制.在第5節(jié)中我們將詳細描述該安全規(guī)約模型.

Fig. 3 Architecture of TipTracer圖3 TipTracer 的總體架構(gòu)
2) 靜態(tài)軟件分析器.基于代碼庫安全規(guī)約模型在控制流和數(shù)據(jù)流上描述了應用軟件應該遵守什么行為規(guī)范.因此,靜態(tài)軟件分析器通過對目標應用代碼進行控制流與數(shù)據(jù)流分析,利用程序切片技術(shù)定位安全規(guī)約相關的應用代碼,再檢測這些代碼是否符合行為規(guī)范.第5節(jié)中我們將對該分析器的設計細節(jié)做詳細描述.
TipTracer通過利用代碼庫安全規(guī)約對應用軟件安全性進行檢測.在TipTracer進行安全檢測之前,我們需要對安全提示所提出的代碼庫安全使用需求進行形式化描述.在本節(jié)中,我們首先給出了TipTracer所支持的安全規(guī)約類型,然后對安全規(guī)約邏輯進行了形式化的定義.
軟件安全提示通常在函數(shù)粒度指導開發(fā)者如何使用庫API,包括各個函數(shù)調(diào)用之間的先后關系或調(diào)用特定函數(shù)時需要滿足的參數(shù)數(shù)據(jù)限制.TipTracer中定義的軟件安全規(guī)約描述了違背這些代碼庫使用約束的情形.
1) 不安全接口調(diào)用順序.該情形限制了函數(shù)接口之間調(diào)用順序應該滿足特定先后關系.比如通常情況下,在用HTTP接口傳播密碼之前,都應該先調(diào)用對應的加密函數(shù),以防止可能的密碼泄露.
2) 不安全的數(shù)據(jù)傳播.該情形限制了函數(shù)的參數(shù)所需滿足的數(shù)據(jù)污染關系.比如很多庫都規(guī)定對用戶隱私數(shù)據(jù)的使用應當小心謹慎,不應該流入log日志中等可能被攻擊者訪問到的數(shù)據(jù)節(jié)點上.
3) 不安全參數(shù)值.該情形限制了函數(shù)接口所能接受的參數(shù)應該滿足的限制條件.比如很多庫規(guī)定開發(fā)者應該使用有效的加密方法對敏感數(shù)據(jù)進行保護,但是如果在使用加密函數(shù)Cipher.getInstance()時設定第2個參數(shù)為“ECB”,將導致該軟件使用弱加密,即使用了不安全的參數(shù)值.
在定義TipTracer安全規(guī)約之前,我們首先定義用于組成安全規(guī)約的基本元素:執(zhí)行點和數(shù)據(jù)點.
1) 執(zhí)行點(execution point, EP)
執(zhí)行點代表對一個函數(shù)的具體調(diào)用點.一般情況下,每個函數(shù)都具有獨立且唯一的方法簽名(signature),因此,我們使用方法簽名去表示每一個函數(shù)調(diào)用點,即執(zhí)行點.例如在安卓系統(tǒng)中可以用EP(“android.content.Context.getSharedPreferences”)表示一個調(diào)用getSharedPreferences這個方法的執(zhí)行點.此外,我們也定義了2個特殊的程序執(zhí)行點:ProgramEntry和ProgramExit,用于表示整個應用程序執(zhí)行時的入口和出口.我們也定義了用于對某一函數(shù)的所有調(diào)用點的集合表示方法EPS.如EPS(“android.content.Context.getSharedPreferences”)可以表示在應用軟件運行時所有對getSharedPreferences方法的調(diào)用點.
2) 數(shù)據(jù)點(data point, DP)
數(shù)據(jù)點代表程序執(zhí)行中出現(xiàn)的所有數(shù)據(jù)節(jié)點,包括所有方法調(diào)用的參數(shù)、返回值以及所有的全局變量.類似于執(zhí)行點集合(EPS),數(shù)據(jù)點集合(DPS)也被定義為所有同類數(shù)據(jù)點的集合.
TipTracer的規(guī)則系統(tǒng)支持邏輯組合.使用上面定義的基本元素,再結(jié)合一些邏輯組合關系,可以定義出各種各樣的復雜安全規(guī)則.具體而言,本系統(tǒng)中支持3種規(guī)則邏輯.
4.3.1 時序規(guī)則
為了表示指令之間的先后順序關系,一種可能的方法是使用狀態(tài)機[22-23].但是,許多安全規(guī)則在限定函數(shù)執(zhí)行順序的同時也對其參數(shù)進行規(guī)范,使用狀態(tài)機時并不容易表示.因此,本文定義了一個新的三元組用以表示時序規(guī)則,具體是:
Rule∷Temporal(EPSS,EPS1,EPSE,mode),
其中,EPSS為起始執(zhí)行點集合,EPS1為中間執(zhí)行點集合,EPSE為結(jié)束執(zhí)行點集合.mode包含2種模式PROP_SKIP或PROP_PASS_THROUGH.如果mode為PROP_PASS_THROUGH,則表示如果在應用軟件從EPSS執(zhí)行到EPSE的過程中,如果存在一條執(zhí)行路徑包含了EPS1的執(zhí)行點,則存在安全隱患;如果mode為PROP_SKIP,則表示如果在應用軟件從EPSS執(zhí)行到EPSE的過程中,如果任意一條執(zhí)行路徑都不包含EPS1的執(zhí)行點,則存在安全隱患.例如,圖8中的規(guī)則r3表示在目標Activity啟動之前,應用程序應首先調(diào)用方法setEncrypterClass.
4.3.2 數(shù)據(jù)傳播規(guī)則
數(shù)據(jù)傳播規(guī)則主要用來限定應用軟件中的敏感數(shù)據(jù)流,具體表述是:
Rule∷Propagation(DPSS,DPSE,mode),
其中,DPSS表示數(shù)據(jù)傳播過程中的起始數(shù)據(jù)點,DPSE表示數(shù)據(jù)傳播過程中的結(jié)束數(shù)據(jù)點,mode同樣包含2種模式PROP_MAY和PROP_MAYNOT.如果mode為PROP_MAY,則表示在應用程序執(zhí)行的過程中,如果存在數(shù)據(jù)從數(shù)據(jù)點集合DPSS流向數(shù)據(jù)點集合DPSE時,則存在安全隱患.例如圖4中的規(guī)則表示,如果應用軟件將外部數(shù)據(jù)傳入到敏感數(shù)據(jù)點(DexClassLoader的第2個參數(shù)),則存在安全隱患.

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

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

在4.3.1~4.3.3節(jié)中,我們描述了TipTracer使用的3種基本安全規(guī)約類型.但是,很多復雜的安全規(guī)約并不能簡單地利用一種規(guī)則進行描述.因此,TipTracer提供了邏輯操作(邏輯與、邏輯或、邏輯非)來合并多個安全規(guī)則以組成復雜規(guī)則.例如圖7中的行⑨展示了邏輯與的一個具體實例,它表示只有應用程序同時違反這幾個安全規(guī)則時才會被認定為違反安全規(guī)約.
為了配合多個安全規(guī)則之間的邏輯操作,TipTracer額外提供了一個綁定(bind)功能,以方便將執(zhí)行點與對應的數(shù)據(jù)點結(jié)合在一起.例如在圖7中,通過綁定功能,2個安全規(guī)則r1和r2共同完成了應用程序不能將數(shù)據(jù)庫設定為全局可讀寫模式的安全規(guī)約:規(guī)則r1使用參數(shù)賦值規(guī)則限定了openOrCreateDatabase的第3個參數(shù)為2(MODE_WORLD_WRITABLE)或3(MODE_WORLD_READABLE|MODE_WORLD_WRITABLE),而規(guī)則r2限定了應用程序打開數(shù)據(jù)庫的行為.這2個安全規(guī)則之間是存在數(shù)據(jù)依賴的,因為它們同時是針對同一數(shù)據(jù)庫對象進行限定.因此,我們需要將數(shù)據(jù)點集合dps1與dps2綁定到執(zhí)行點ep1上,以表示它們代表著同一個數(shù)據(jù)庫對象,即這2個數(shù)據(jù)點對應同一個執(zhí)行點.

圖8給出了LockPatternActivity相關的軟件安全規(guī)約.在該安全規(guī)約中,我們使用了3個基本安全規(guī)約來描述對應的安全提示違反需要滿足的3個關鍵點:首先,應用程序?qū)⒔M件類LockPattern-Activity傳遞到一個Intent對象的構(gòu)造函數(shù)中(屬性r1).隨后,應用程序?qū)ntent對象傳播到Activity的初始化方法中(屬性r2).最后,在啟動新的Activity之前應用程序未調(diào)用setEncrypterClass方法(屬性r3).此外,r1中創(chuàng)建的Intent對象應該與傳遞到r2中的Intent對象相同,所以r1與r2應共享同樣的Intent對象創(chuàng)建指令.因此,我們將屬于共享方法調(diào)用的數(shù)據(jù)點集合dps1與dps2綁定到同樣的執(zhí)行點ep1上.類似地,r2與r3共享同樣的Activity啟動指令,因此我們同樣將startActivity方法調(diào)用的2個數(shù)據(jù)點dps3和dps4都與執(zhí)行點ep2進行綁定.
為了理解這一軟件安全規(guī)約的作用原理,我們將圖2中含有漏洞的應用程序與圖8中建立的安全規(guī)約進行匹配:
1) 指令4滿足r1中定義的參數(shù)賦值規(guī)則.
2) 應用程序?qū)⒅噶?中創(chuàng)建的Intent對象傳遞到指令7中,這符合r2中定義的數(shù)據(jù)傳播規(guī)則.
3) 應用程序在調(diào)用setEncrypterClass之前在指令7中調(diào)用了startActivity方法,因此r3被滿足.
4)r1與r2共享同樣的執(zhí)行點(指令4),但r2與r3共享另一執(zhí)行點(指令7),因此安全規(guī)約的綁定約束也與啟發(fā)示例中的代碼相符.
5) 因此,圖2符合圖8中的所有描述,其違反了圖8建立的安全規(guī)約.
Fig. 8 An example of violation of rule LockPatternActivity
圖8 LockPatternActivity的安全規(guī)約示例
TipTracer實現(xiàn)在Soot靜態(tài)分析框架[24]的基礎上,支持安卓APK文件、安卓應用源代碼以及安卓應用字節(jié)碼等多種輸入形式.在4.3節(jié)中,我們提出了TipTracer支持的安全規(guī)約系統(tǒng),主要包含3種安全規(guī)約.因為通過相互組合,這3種安全規(guī)則可以描述各種復雜情況,包括但不限于已知的安卓安全規(guī)約,因此,TipTracer可做為通用漏洞檢測框架進一步擴展,只需將漏洞特征以安全規(guī)則的形式進行書寫.本文僅是以安全規(guī)約這一應用場景為例,展示TipTracer的漏洞檢測能力.
在TipTracer系統(tǒng)中,針對這3種基本安全規(guī)則限定的條件,我們采用不同的方法進行分析.首先,對于時序規(guī)則,因其表述的是相關函數(shù)調(diào)用指令的執(zhí)行順序,我們利用代碼可達性分析[25]技術(shù)在程序控制流圖上檢測代碼執(zhí)行順序是否滿足規(guī)則約束.其次,針對數(shù)據(jù)傳播規(guī)則,我們首先結(jié)合了一個靜態(tài)污點分析工具FlowDroid[26],利用其污點分析能力構(gòu)建出程序數(shù)據(jù)流圖,再檢測數(shù)據(jù)污染關系是否滿足安全規(guī)則限定.此外,對于常量,我們利用常量傳播分析[27]來分析其傳播過程是否符合安全規(guī)則.
因為TipTracer支持安全規(guī)則之間的相互綁定關系,我們會在每一輪分析的結(jié)尾部分,對剩余分析對象是否還滿足綁定關系進行判斷,以消減進行下一輪分析的代碼數(shù)量,進一步加快整個程序分析進程.同時,在每一輪分析中,為了避免對整個應用程序代碼做多余分析,我們利用程序切片技術(shù)僅抽取目標數(shù)據(jù)點、執(zhí)行點附近的代碼用于分析.具體來說,我們用后向數(shù)據(jù)流分析確定程序切片的起點,再利用正向數(shù)據(jù)流分析確定其終點.然后利用控制流圖補全程序切片里的指令.
TipTracer使用了3種不同靜態(tài)分析方法來驗證4.3節(jié)提到的3種基本安全規(guī)約.首先,TipTracer使用的每種靜態(tài)分析方法都與其他幾種分析方法相互獨立,即不論TipTracer以何種順序進行靜態(tài)分析都不會影響到其對應用進行規(guī)約驗證的結(jié)果.然而,運行不同程序分析的順序?qū)O大地影響到TipTracer進行規(guī)約驗證的效率.我們觀察到,靜態(tài)分析在檢查數(shù)據(jù)傳播規(guī)則時其分析速度會比檢查時序規(guī)則與參數(shù)賦值規(guī)則慢.此外,常量傳播分析的速度相對穩(wěn)定,受其他條件影響比較小.因此,TipTracer采用調(diào)度策略去調(diào)整這幾種分析技術(shù)的先后順序以加快整體分析的速度.具體來說,TipTracer首先檢測參數(shù)賦值規(guī)則,其次時序規(guī)則.而速度最慢的數(shù)據(jù)傳播規(guī)則被留到了最后.這樣經(jīng)過每一輪分析結(jié)尾階段對待測目標的消減,在數(shù)據(jù)傳播分析階段僅剩下較少代碼片段,可大幅提升整體分析速度.
5.2.1 TipTracer發(fā)現(xiàn)的應用軟件安全漏洞
首先,我們使用于2015年11月從Google Play上獲取的2批應用軟件作為測試集,以此對TipTracer發(fā)現(xiàn)應用軟件安全漏洞的能力做出評估.其中,第1批13 072個應用包含了在Google Play上每一分類中最流行的500個應用,第2批應用包含了13 072個從Google Play上隨機選取的應用.圖9展示了2批應用中違反代碼庫安全提示的應用數(shù)分布.根據(jù)我們的測試結(jié)果,大約52%的流行免費應用與38%的隨機選取的應用存在安全漏洞.為驗證TipTracer的結(jié)果,我們從每個安全規(guī)約類別中隨機選擇有漏洞的應用程序進行人工驗證.在被檢查的411個應用中,有9個應用的安全漏洞是TipTracer的誤報,這意味著TipTracer的假陽率為2.1%.根據(jù)我們的進一步分析,所有的假陽性結(jié)果都是在驗證數(shù)據(jù)傳播規(guī)則時發(fā)生的(該規(guī)則使用了靜態(tài)污點分析方法進行驗證).由于上下文敏感或域敏感的數(shù)據(jù)流分析過程非常耗時,所以我們采用的污點分析算法使用了上下文不敏感且域不敏感的分析方法以節(jié)省分析時間.但是,這種方法是不精確的.根據(jù)我們的驗證結(jié)果,在這些由TipTracer得出的假陽性結(jié)果中,有6個是由于TipTracer在靜態(tài)污點分析時使用不精確但省時的方法引起的.這些誤報可以通過使用上下文敏感、域敏感的方法來加以消除.其余3個假陽性結(jié)果是由FlowDroid中的錯誤引起的.

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

Fig. 10 The download numbers of violated apps圖10 違背安全提示的應用下載量分布
5.2.2 安全漏洞的持續(xù)存在性
為了評估軟件中安全漏洞隨時間的變化情況,我們選擇了另外兩批安卓應用作為樣本.其中一批樣本包含10 000個在2012年從Google Play上隨機選擇的應用;另一批包含在2014年獲取的同樣的應用.在這部分測試中,因為在2012年沒有使用我們測試的第三方代碼庫LockPattern,因此我們沒有測試這些應用中第三方代碼庫LockPattern所包含的安全提示.表1顯示:在2012年違反安全規(guī)約的1 753個有漏洞的應用中僅363個在2014年修復了應用中的安全漏洞.該結(jié)果顯示安全提示對消除安全漏洞僅起到了很小的作用.

Table 1 Violation of Security Tips in Goolge Play Appsand the Fix
5.2.3 概念驗證攻擊
本文不僅研究了在已有研究中被提及的安全提示信息,也對許多在本文中首次被提及的安全提示進行了研究.在本節(jié)中,我們通過對真實應用進行實際攻擊來展示本文提到的安全漏洞如何使得應用程序容易受攻擊者攻擊.
1) 解密SQLCipher數(shù)據(jù)庫
與安卓系統(tǒng)原生的數(shù)據(jù)庫解決方案不同,SQLCipher代碼庫提供了對數(shù)據(jù)庫文件進行256位AES加密的功能,同時應用程序無需考慮加密的細節(jié).應用程序開發(fā)者通常會將SQLCipher當作安全的數(shù)據(jù)庫加密方案,并認為其他應用是無法解密SQLCipher數(shù)據(jù)庫中的內(nèi)容的.因此,開發(fā)者也會認為,存儲在SQLCipher數(shù)據(jù)庫中的內(nèi)容不會被惡意應用訪問,并在設備丟失或被盜的情況下也是安全的.但是,利用本文中發(fā)現(xiàn)的安全漏洞,我們可以通過采用3個步驟來對SQLCipher數(shù)據(jù)庫文件進行解密:
① 利用TipTracer分析目標應用,TipTracer會指出應用軟件不安全的創(chuàng)建SQLCipher數(shù)據(jù)庫的相關代碼.
② 需要在SQLCipher創(chuàng)建數(shù)據(jù)庫代碼前插樁代碼,該代碼提取用于創(chuàng)建數(shù)據(jù)庫的密鑰,并將密鑰寫入日志中.
③ 利用該密鑰,可以編寫一個應用來對SQLCipher數(shù)據(jù)庫進行解密.由于數(shù)據(jù)庫密鑰是被嵌入到應用中的一個固定密鑰,因此編寫的應用可以在理論上解密目標應用的任何數(shù)據(jù)庫實例.
我們研究了由TipTracer報告的10款應用.在我們的示例攻擊中,我們成功解密了所有被報告應用的數(shù)據(jù)庫.
2) 獲取應用本地文件
由于受到安卓沙箱機制的保護,應用程序開發(fā)者通常會假設應用的本地文件不會被其他應用軟件訪問.而正如3.3節(jié)的描述,TipTracer找到了一系列通過MODE_WORLD_READABLE模式訪問自身本地存儲的應用.由于MODE_WORLD_READABLE模式無法對存儲空間的訪問者做出限制,這些應用的存諸空間有可能會被惡意應用所竊取.為不失一般性,我們從TipTracer的報告中隨機選擇了10個應用,并編寫了與之安全漏洞相對應的示例攻擊應用.我們確認示例攻擊應用可以在未獲取任何安卓權(quán)限的情況下獲取這些應用本地文件中的內(nèi)容.
5.2.4 本文其他發(fā)現(xiàn)
1) 流行的免費應用并未能更好地遵守代碼庫安全提示
我們可能會認為流行的免費應用會更少地違反安全提示,因為它們的開發(fā)者有更多的資源來提升應用的質(zhì)量.但是,表2顯示流行應用所違反的安全提示數(shù)量甚至超過了隨機選擇應用所違反的數(shù)量.我們的人工驗證表明,流行免費應用更趨向于使用安全敏感的代碼庫,但它們的開發(fā)者通常會忽略代碼庫所提出的安全需求與安全提示.同時,排名靠后的應用常會使用完全沒有安全保證的代碼庫,而使用這樣的代碼庫會對應用的安全造成極大的威脅.

Table 2 Violation of Security Tips in Popular Apps and Random Apps from Google Play表2 在流行應用和隨機應用中對安全提示的違反情況
2) 第三方代碼庫的安全提示更易被應用軟件開發(fā)者忽略
表2顯示超過94%的使用第三方代碼庫(SQLCipher和LocakPattern)的應用開發(fā)者都未能遵守代碼庫的安全提示,對第三方代碼庫安全提示的違反比例遠超安卓內(nèi)置代碼庫安全提示的違規(guī)比例.在2.5節(jié)中,我們研究了這2類安全提示并討論了這2類代碼庫所存在的問題.
在我們的5.2節(jié)測試過程中,TipTracer分析框架的運行環(huán)境為:
1) 雙路Xeon 8核2.0 GHz CPU;
2) 32 GB內(nèi)存;
3) Debian Linux,內(nèi)核版本2.6.32.
我們對所有51 650個應用的靜態(tài)分析過程共耗時634 h.若將分析過程的工作負載分配到多臺計算機上,分析時間還可以被進一步縮短.平均每個應用的分析耗時為44 s,這一耗時對于安卓市場的運營者來說是可以忽略不計的.
TipTracer是一個對給定的安全規(guī)約進行自動化驗證的分析框架.由于代碼庫安全提示大多指定API層的安全實現(xiàn)需求,因此當前TipTracer的安全規(guī)則邏輯被設計為僅能對應用代碼在方法粒度的規(guī)約做出安全約束.TipTracer尚不能在更細粒度上表述安全規(guī)約,例如TipTracer無法為一個給定方法的實現(xiàn)細節(jié)作出安全約束.因此,雖然目前我們發(fā)現(xiàn)的所有安全提示都在方法這一級別為開發(fā)者提出代碼編寫指導,但若要進行進一步的研究,我們?nèi)匀恍枰毩6鹊陌踩?guī)約定義與應用分析器,細粒度的形式化定義與自動化分析是本研究未來可能的一個擴展方向.
為了消除應用程序中的不安全應用代碼實現(xiàn),最佳的辦法是通過發(fā)出編譯時錯誤來阻止不安全的代碼實踐通過編譯,并防止不安全的應用被上傳到應用市場.由于我們的靜態(tài)分析可能會帶來誤報,因此有時一個安全的應用也會被誤報為不安全的.幸運的是,通過記錄應用違反的安全規(guī)則,以及相應的執(zhí)行點集合、數(shù)據(jù)點集合,TipTracer分析器可以報告出所有違規(guī)的細節(jié).例如TipTracer會報告每個執(zhí)行點集合、數(shù)據(jù)點集合所對應的代碼行,并報告數(shù)據(jù)傳播規(guī)則所對應的完整傳播路徑,這些細節(jié)可以為開發(fā)者進行手工驗證提供極大的幫助.為消除TipTracer的分析誤報,一個可能的方案是使用更高精度的分析方法.例如,我們可以使用上下文敏感、字段敏感的污點分析方法來消除大部分誤報.此外,大多數(shù)誤報還可以通過稍微修改應用代碼加以避免.例如,使用簡單的數(shù)據(jù)結(jié)構(gòu)來處理敏感數(shù)據(jù)(如數(shù)據(jù)庫密鑰),這樣可以避免由字段不敏感的分析所引起的誤報.
TipTracer目前與安卓應用編譯器是相互獨立的,我們需要先使用安卓應用編譯器來生成字節(jié)碼,再使用TipTracer來分析字節(jié)碼.然而,某些源代碼所包含的信息,如方法名等,在混淆后的字節(jié)碼中會丟失,所以字節(jié)碼所包含的信息量較源代碼會少很多.因此,TipTracer分析混淆后的代碼可能會產(chǎn)生遺漏.將來我們準備將TipTracer整合到安卓應用編譯器中,這樣可以在很大程度上減少由信息丟失帶來的漏報.
本節(jié)我們將與相關工作進行比較.
1) 安卓中的靜態(tài)分析
本文我們使用程序靜態(tài)分析技術(shù)檢測安卓應用軟件是否遵守安全規(guī)約.靜態(tài)分析已經(jīng)廣泛用于安卓中的漏洞檢測[27-31].其中靜態(tài)污點分析是最流行的技術(shù)之一,它可以監(jiān)控安卓系統(tǒng)和應用之間的數(shù)據(jù)傳播[26,32-36].此技術(shù)回答了什么數(shù)據(jù)(數(shù)據(jù)源)流向了什么地方(目的地)的問題.而這也是本文工具設計的一個重要思想.但與前人工作不同的是,本文在使用該技術(shù)之前,首先對安全規(guī)約進行了形式化建模分析,并將其與靜態(tài)分析技術(shù)結(jié)合起來,彌補了文本化的安全規(guī)約與程序化的靜態(tài)分析之間的差距,并基于此實現(xiàn)了自動化的漏洞挖掘.
2) 安卓應用的漏洞挖掘
據(jù)我們所知,TipTracer是第1個系統(tǒng)化的研究安卓安全規(guī)約機制與對應漏洞挖掘技術(shù)的工作,并揭示了應用安全漏洞與安全規(guī)約之間的關系.目前為止,其他關于安卓應用漏洞的研究一般都只針對一種特定代碼庫的安全規(guī)約.例如MalloDroid[37]及Georgiev等人的工作[38]研究了網(wǎng)絡安全通訊協(xié)議(SSL)在安卓應用軟件中的使用情況.其研究結(jié)果表明,安卓應用經(jīng)常誤用SSL協(xié)議導致網(wǎng)絡流量數(shù)據(jù)暴露在攻擊者威脅之下;Poeplau等人[10]專門研究了安卓的動態(tài)代碼加載機制,并揭示了安卓應用程序因為利用不安全的外部通道加載代碼而造成安全漏洞問題;CryptoLint[7]揭示了安卓應用誤用數(shù)據(jù)加密代碼庫所引起的安全漏洞.相對于這些研究,本文不僅系統(tǒng)化地研究了大量安全規(guī)約,還研究了4類之前未被研究過的軟件安全規(guī)約.而且,本文提出了一整套自動化分析框架,用于檢測安卓應用程序師父遵守安全規(guī)約.在該框架中,我們提出了一套安全規(guī)約語言,該語言形式化地定義了由安全提示所隱含的編程規(guī)約.相較于TipTracer可以形式化地定義和驗證不同的安全規(guī)約,現(xiàn)有的工作目前僅完成了對特定規(guī)約的形式化定義.MC擴展[39]將安全規(guī)約以狀態(tài)機的方式進行了建模,關注于對調(diào)用順序規(guī)則的驗證;MECA[40]使用基于靜態(tài)污點傳播的數(shù)據(jù)依賴規(guī)則.上述安全規(guī)約定義方法僅能單一地關注于純控制流規(guī)則或純數(shù)據(jù)流規(guī)則.而安卓代碼庫的安全提示所導出的安全規(guī)約可能會非常復雜,一個單一的規(guī)約可能會同時引入調(diào)用順序規(guī)則與數(shù)據(jù)依賴規(guī)則.由于已有的規(guī)約系統(tǒng)不能表示復合規(guī)則,因此無法對實際需要的安全提示進行完整而準確地描述.例如有限狀態(tài)自動機不能表示數(shù)據(jù)依賴規(guī)則,污點傳播規(guī)則不能表示調(diào)用順序規(guī)則.
本文研究了大多數(shù)代碼庫設計人員避免應用安全漏洞的方法,即使用安全提示來引導應用開發(fā)者編寫安全的應用.與以往僅關注于某一特定類型的安全規(guī)約的研究不同,我們指出系統(tǒng)的理解安全提示機制的有效性與缺陷可以幫助我們識別安全漏洞的根源.此外,正如本文中所提到的那樣,我們通過跟蹤以往未被深入研究的安全提示,發(fā)現(xiàn)了許多未被報告的應用安全漏洞.基于我們對有漏洞的安卓應用與安全提示的觀察,我們認為缺少自動化的驗證與提示工具是許多安全漏洞產(chǎn)生的重要原因.因此,我們提出了TipTracer,一個新的應用分析框架來高效、自動化地驗證與報告安卓應用對安全規(guī)約的遵守情況.TipTracer使用形式化的安全規(guī)約替代了以自然語言表述的安全提示,并使用了一個集中式的分析器來檢測應用對安全規(guī)約的違背情況.在TipTracer分析器的幫助下,我們可以將編譯時安全檢查整合到安全漏洞敏感的應用市場審查過程中,提升應用市場中各類應用的安全性.