楊蕾新 張健毅 楊 濤
1. 北京電子科技學院,北京市 100070 2. 公安部第三研究所信息網(wǎng)絡安全公安部重點實驗室,上海市 201204
如今,越來越多的安卓開發(fā)傾向于混合開發(fā)模式。 混合開發(fā)是一種取長補短的開發(fā)模式——原生代碼部分利用WebView 控件[1]或者其它框架[2]為H5 提供容器,應用程序主要的業(yè)務實現(xiàn)、界面展示都是利用與H5 相關的Web 技術進行實現(xiàn)的。 目前已經(jīng)有眾多流行的混合應用程序,如微信、美團、今日頭條等。 混合開發(fā)模式中WebView 容易使用,深受移動開發(fā)人員的喜愛。 研究顯示[3]大約80%的安卓應用使用WebView。 但是與WebView 的交互機制很復雜,在安卓應用中會引發(fā)各種安全問題[1],如用戶敏感信息的泄露[4-6]、網(wǎng)絡釣魚攻擊[7,8]、惡意廣告加載[9,10]等。
針對WebView 引發(fā)的安全問題,研究人員進行了廣泛研究[4-7,11,12],這些研究從各自的角度探索了部分由WebView 引發(fā)的漏洞和對應的攻擊模型,并提出了相對應的緩解策略。 還有一項研究[1]從廣泛的角度理解,對這種漏洞進行系統(tǒng)的檢查。 這些研究的共同之處在于,它們主要調(diào)查在混合應用中針對WebView 引起各種類型的攻擊,這種攻擊允許不可信的網(wǎng)絡內(nèi)容(例如廣告)加載到混合應用中,以便直接訪問設備資源。 本文嘗試對混合開發(fā)模式下與WebView安全方面相關的技術研究進行全面的歸納和總結,介紹混合應用程序的體系機構,詳細分析混合應用中WebView 安全方面的研究現(xiàn)狀并探討防御方目前面臨的挑戰(zhàn),為進一步研究作參考。
本文第1 節(jié)介紹相關背景知識;第2 節(jié)針對WebView 漏洞的攻擊類型進行歸類;第3 節(jié)介紹相關漏洞檢測和防御的研究現(xiàn)狀,對不同類別的漏洞檢測方法進行了定性分析和橫向比較;第4節(jié)對WebView 相關安全方面研究面臨的挑戰(zhàn)進行總結和分析,對未來工作進行展望;第5 節(jié)對全文工作進行總結。
混合開發(fā)模式是一把雙刃劍,應用程序的功能通過將本地API 暴露給網(wǎng)絡內(nèi)容而獲得良好的性能,但這些技術可能會產(chǎn)生新的安全和隱私問題。 如圖1 所示,這是一個使用WebView 作為容器直接承載Web 頁面的混合應用程序。WebView[13]是一個用于加載和顯示網(wǎng)頁的網(wǎng)絡控件,采用WebKit 內(nèi)核作為渲染引擎,來加載和顯示網(wǎng)頁,相當于一款高性能的瀏覽器。 它與網(wǎng)絡瀏覽器的不同之處在于,它提供了一組APIs來促進混合應用的網(wǎng)絡層(Web 側,主要指JavaScript)和本地層(Native 側)之間的雙向交互。 如WebView 使用網(wǎng)絡-移動橋來連接網(wǎng)絡層和移動層,移動層通過事件處理程序可以控制并處理發(fā)生在網(wǎng)絡層的事件(如點擊鏈接),WebView 設置APIs 可以用來配置Webview 實例(如是否允許JavaScript 代碼執(zhí)行)等。 這樣加載在WebView 中的不可信代碼(例如廣告)就有可能竊取用戶的私人數(shù)據(jù)[12]。 WebView 的UI設計樣式過于簡單,缺少標題欄、地址欄、標簽欄等,這樣用戶不知道正在加載哪些Web 內(nèi)容,也不能很好的管理多WebView UI 實例。 攻擊者可以使用導航功能通過重定向到假網(wǎng)站,發(fā)起網(wǎng)絡釣魚攻擊,但用戶不會輕易注意到[7]。
大部分針對WebView 相關漏洞攻擊的根本原因在于網(wǎng)絡層和移動層之間的交互沒有相對應的保護機制。 也就是說,WebView 提供了幾個APIs 使得開發(fā)人員可以定制他們的WebView實例,卻沒有提供對這些APIs 的訪問控制,導致加載在WebView 中的不可信代碼可以進行各種類型的攻擊。 如圖1 所示,開發(fā)人員可以通過設置APIs 配置WebView,如啟用JavaScript、訪問本地文件、數(shù)據(jù)庫和GPS 位置;開發(fā)人員還可以使用內(nèi)容加載API(如:loadUrl())將網(wǎng)頁內(nèi)容加載到WebView 實例中;開發(fā)人員還可以利用網(wǎng)絡-移動橋來實現(xiàn)網(wǎng)絡和移動層之間的交互,網(wǎng)絡-移動橋有兩種格式:事件處理程序和JavaScript Bridge;還可以使用網(wǎng)絡-移動橋等特殊方法定制postMessage(即混合postMessage)來實現(xiàn)網(wǎng)絡層和移動層之間的HTML5 postMessage形式的跨平臺消息傳遞。 表1 整理了針對Web-View 漏洞的各種攻擊類型。
開發(fā)人員經(jīng)常使用WebView 的內(nèi)容加載APIs(如loadUrl())打開遠程網(wǎng)站或第三方JavaScript 庫。 這種方式可能會引入WebView UXSS(通用跨站點腳本)漏洞[4]。 UXSS 是瀏覽器和瀏覽器擴展的一種客戶端漏洞,是由驗證用戶輸入失敗引起的。 攻擊者可以注入惡意的JavaScript 來破壞瀏覽器遵守的同源策略(SOP)。 基于WebKit 內(nèi)核的谷歌瀏覽器存在UXSS 漏洞,因此,使用WebKit 內(nèi)核的WebView(安卓4.4 之前)的安卓應用程序會受到這類漏洞的感染。 從安卓4.4 開始,WebView 使用Blink,但是在安卓5.0 之前仍然存在UXSS 漏洞。 UXSS 漏洞出現(xiàn)在WebView 本身,攻擊者可以在易受攻擊的WebView 加載的任何頁面中運行惡意的JavaScript 代碼,以竊取敏感的頁面內(nèi)容、cookies 等。 被盜的cookies 可能會導致嚴重的攻擊[14],例如會話劫持和用戶假冒。 跨站點腳本甚至可以重寫網(wǎng)頁的內(nèi)容。
表1 針對WebView 漏洞的攻擊類型
當應用程序本地有生成JavaScript 代碼時,使用WebView 的內(nèi)容加載APIs(如loadUrl())同樣可以加載應用程序資源中的HTML 文件和應用程序代碼中的動態(tài)JavaScript。 如果允許在WebView 中訪問文件系統(tǒng),如設置管理API:setAllowFileAccessFromFileURLs(true),允許本地HTML 通過JavaScript 讀取本地文件內(nèi)容,這樣一個文件區(qū)域(本地HTML)中的JavaScript 可以訪問其他文件區(qū)域的內(nèi)容;或者setAllowUniversalAccessFromFileURLs(true),允許本地HTML通過JavaScript 檢索網(wǎng)頁內(nèi)容,這樣一個文件區(qū)域中的JavaScript 也可以訪問其他http 區(qū)域的內(nèi)容。 這將會引入基于文件的跨區(qū)域漏洞[4]。 在安卓4.2 之前,上述兩個訪問權限是默認啟用的。
開發(fā)人員可以利用JavaScript Bridge[3,9,12,17]來實現(xiàn)網(wǎng)絡和移動層之間的交互,這是一種在網(wǎng)頁中的JavaScript 代碼和應用程序中的Java 代碼之間搭建橋梁的機制,允許JavaScript 代碼調(diào)用Java 代 碼。 具 體 來 說, 可 以 通 過 調(diào) 用WebView 的方法addJavascriptInterface (Object object, String name)來構建JavaScript Bridge,該方法將一個Java 對象(第一個參數(shù))注入到JavaScript 環(huán) 境 中, 使 得 由WebView 加 載 的JavaScript 代碼可以通過提供的名稱(第二個參數(shù))調(diào)用該Java 對象的方法。 但是,WebView 不提供任何對JavaScript Bridge 的訪問控制,在WebView 中執(zhí)行的JavaScript 代碼可以通過提供的名稱調(diào)用Java 對象的所有公共方法。 惡意JavaScript 代碼可能通過調(diào)用Java 代碼來訪問應用程序和用戶設備的資源,這些漏洞會導致數(shù)據(jù)泄漏。 盡管攻擊受到應用程序所擁有的權限的限制,但攻擊者有可能利用根漏洞獲得更多權限。 更嚴重的是,攻擊者甚至可能利用此類漏洞在用戶設備上安裝后門。
WebView 允許開發(fā)人員在安卓中的Java 環(huán)境中具體指定事件處理程序來處理WebView 中發(fā)生的Web 事件,如可以重寫事件處理程序shouldOverrideUrlLoading()來處理網(wǎng)址導航事件。 這些事件處理程序和JavaScript Bridge 一樣可以用來實現(xiàn)網(wǎng)絡和移動層之間的交互。 由于這些事件處理程序存在安全風險,即允許在WebView 中加載的任何Web 代碼來訪問它們。因此,當移動層中的事件處理程序攜帶敏感功能(如讀取位置信息、訪問攝像頭)時,攻擊者可以通過代碼注入攻擊[11]將惡意HTML/JavaScript代碼注入WebView,執(zhí)行該惡意代碼并觸發(fā)Web事件,進一步調(diào)用移動層中對應的事件處理程序,該事件處理程序由注入的輸入引導,以執(zhí)行其內(nèi)部關鍵功能。 這種面向事件的攻擊[5](EOE)會造成嚴重的后果,如敏感信息泄露、跨框架操縱、網(wǎng)絡釣魚攻擊等,并且該攻擊也無法通過所有現(xiàn)有的防御解決方案進行防御。
Web 代碼經(jīng)常使用iframe/popup,例如用來顯示不同格式的文件(如視頻和圖片),加載不可信的內(nèi)容(如,廣告)。 iframe/popup 在普通瀏覽器中研究和保護地很好,但在WebView 中是危險的。 具體地說,普通瀏覽器擁有完整的UI組件(如地址、狀態(tài)和標題欄),但是WebView 的UI 簡單,只包含一個用于呈現(xiàn)web 內(nèi)容的區(qū)域。因此,如果在WebView 中存在著攜帶不受信任內(nèi)容的iframe/popup,并且這些不受信任的iframe/popup 可以導航WebView 的主框架或頂部框架,就會發(fā)生網(wǎng)絡釣魚攻擊。 如事件處理程序onCreateWindow()由于其設計缺陷無法區(qū)分良性請求和不受信任的請求。 不受信任的iframes/popups 通過簡單地觸發(fā)彈出窗口創(chuàng)建事件,并使創(chuàng)建的WebView UI 加載偽造的Web 內(nèi)容并與良性WebView UI 重疊,從而具有執(zhí)行網(wǎng)絡釣魚攻擊的能力。 由于缺少地址和標簽欄,用戶幾乎不會注意到這種危險的彈出式創(chuàng)建操作。這種由WebView 和常規(guī)瀏覽器之間的差異導致的并且與iframes/popups 相關的新型漏洞稱為環(huán)境差異漏洞[7](DCV)。
WebView 繼承了常規(guī)瀏覽器的防御解決方案,包括同源策略(SOP),但是SOP 不允許不同的不信任的web 框架之間的通信。 在普通瀏覽器中通過HTML5 postMessage 機制及其相應的安全模型得以緩解。 WebView 也支持postMessage。 然而在混合應用程序中,開發(fā)人員不僅需要不同web 框架之間的通信,還需要網(wǎng)絡層和移動層之間的通信。 雖然網(wǎng)絡- 移動橋(如JavaScript Bridge[12])可以進行跨平臺交互,但HTML5 postMessage 形式的跨平臺消息傳遞不可以用這種方法實現(xiàn)。 為了緩解這個問題,開發(fā)人員使用網(wǎng)絡- 移動橋等特殊方法定制postMessage(即混合postMessage) 來實現(xiàn)。 然而,如這些研究[5,12,17]所示,這些橋通常是安全漏洞的原因,因為任何加載到WebView 中的代碼都可以自由訪問它們。 通過混合postMessage發(fā)送的消息在網(wǎng)絡和本地層之間移動時原始信息(如:消息發(fā)送者和接收者)會丟失,無法區(qū)分消息發(fā)送者的身份,甚至無法安全地獲得消息的來源。 混合postMessage 引起的這種安全問題稱為源剝離漏洞(OSV)[6]。 如果消息包含敏感信息,可能會導致嚴重后果。 遠程攻擊者可能會利用應用程序中的這個安全問題來執(zhí)行拒絕服務攻擊(DoS)、本地關鍵硬件設備訪問(如實時監(jiān)控麥克風)等。
根據(jù)相關研究[3],在Google Play 市場上免費應用程序中有28%的混合應用包含至少一個安全漏洞,這些漏洞存在于安卓生態(tài)系統(tǒng)的各個角落,對用戶構成了嚴重威脅。 通過第一節(jié)的分析,可以發(fā)現(xiàn)關于WebView 漏洞的攻擊大多數(shù)都是通過代碼注入攻擊來進行。
這幾項研究[4,11,12]提出了基于靜態(tài)分析的方法來檢驗混合應用程序。 JSDroid[4]這個自動工具可以檢測安卓應用程序中常見的JavaScript使用模式,并基于靜態(tài)分析揭示潛在的與JavaScript 相關的漏洞。 該分析發(fā)現(xiàn)其中70%以上的應用存在潛在的JavaScript 相關漏洞,其中20%可以被成功利用。 BridgeScope[12]更加針對JavaScript Bridge 所產(chǎn)生的安全問題,這是一個基于自定義靜態(tài)分析來評估JavaScript 接口的工具,可以精準有效地確認任何與JavaScript Bridge 的安全問題。 與該工作類似,Claudio Rizzo 等人[11]通過使用BabelView 這個攻擊者行為模型來檢測應用程序,使用靜態(tài)信息流分析系統(tǒng)地評估代碼注入攻擊對WebView 的可能影響。 可以不必對JavaScript 語義進行推理。 BridgeScope[12]允許檢測接口方法之間的潛在流量,使用定制的流分析,而BabelView[11]有意允許重用最先進的流分析工具。
表2 WebView 相關漏洞檢測和防范
針對與WebView 相關的JavaScript 安全漏洞,可以采用以下防范措施:對于普通用戶來說,最好經(jīng)常更新應用程序和設備,因為新版本的應用程序通常會修復漏洞,更高版本的安卓設備可以更好地保護用戶的隱私。 對于開發(fā)人員而言,需要通過在應用清單文件中指定更嚴格的權限來關閉攻擊媒介[4],如限制JavaScript 在file:/ /URLs 中的執(zhí)行,限制WebView 的可導航性,最好只在高于4.2 的安卓版本中使用JS Bridge 模式,經(jīng)過凈化以過濾惡意JavaScript 的關鍵字等等。 Li 等人[18]還提出了一種操作系統(tǒng)級的緩解措施,作為針對這些類型攻擊的對策。
以上幾種檢測攻擊都是針對與WebView 相關的JavaScript 安全問題進行探討,但是這幾種方法都采用的是靜態(tài)分析,靜態(tài)分析方法通常具有很高的誤報率,無法檢測到通過本機代碼或動態(tài)代碼加載實例化的WebView 和接口。 Yang 等人[5]將深度靜態(tài)分析的信息與選擇性符號執(zhí)行相結合,可以自動審查安卓混合應用程序中的事件處理程序中的漏洞。 在OSV-Hunter[6]中,他們引入了一種檢測源剝離漏洞(OSV)的新方法。與上述介紹的檢測工具[11,12]不同,這些檢測工具[11,12]并不能追蹤來源,而OSV-Hunter[6]可以自動發(fā)現(xiàn)消息發(fā)送者和接受者,并且分析他們之間的鏈接語義。 客戶端驗證(CSV)的檢測和防御[19]可以減輕這種威脅,但是性能也是有限的,現(xiàn)實情況是很難消除由OSV 引起的安全問題,于是他們在最新的WebView 中設計并實現(xiàn)了一套新的混合postMessage API 稱為OSV-Free[6]來緩解OSV。 而對于WebView 中iframe/popup 這種特殊的網(wǎng)絡行為帶來的攻擊[7]來說,直接應用上述工具來檢測是很有挑戰(zhàn)性的。 現(xiàn)有的靜態(tài)分析工具不是為分析iframe/popup 行為而設計的, 并且現(xiàn)有的動態(tài)分析工具( 如EOEDroid[5])有很高的誤報率,DCV-Hunter[7]作為針對DCV 的靜態(tài)檢測工具,可以自動審查給定的應用程中的DCV,可擴展、有效,并有相對較低的誤報。 該研究人員[7]通過增強WebView編程特性和UI 特性的安全性提出了一個多級保護解決方案。
研究[20]發(fā)現(xiàn)在混合移動應用中調(diào)用的近40%的軟件服務接口(敏感APIs)是由第三方庫(如廣告庫)觸發(fā)的。 Vaibhav Rastogi 等人[9]針對混合應用中虛假欺詐廣告的問題,做出檢測和現(xiàn)狀調(diào)查說明,同時開發(fā)了一個分析框架,能夠大規(guī)模的對應用程序進行動態(tài)測試并記錄廣告鏈接和最終鏈接(廣告內(nèi)容或者下載的文件等),來進行惡意鏈接或者文件的判斷。
以上這些研究成果對于日后設計適當?shù)膼阂廛浖z測或漏洞緩解策略至關重要。
現(xiàn)有的研究[1,4-7,11,12,21]從有限的角度探索了部分與WebView 相關的漏洞,大部分研究局限于檢測某個漏洞,無法對測試中的應用程序進行全面分析,而且這些工具很少能實現(xiàn)零誤報。因此以一種可擴展的方式檢測更多種類的漏洞,并且比現(xiàn)存的方式具有零誤報是當前面臨的一大挑戰(zhàn)。
根據(jù)表2 可以看到大部分工具都使用靜態(tài)或者動態(tài)分析來檢測漏洞。 靜態(tài)分析方法通常具有很高的誤報率,會導致大量的人工工作,難追蹤隱式數(shù)據(jù)流,無法檢測到通過本機代碼或動態(tài)代碼加載實例化的WebView 和接口。 如在混合移動應用程序中,一些加載在WebView 中的網(wǎng)址是加密的,一些與網(wǎng)址相關的數(shù)據(jù)通過隱式流,一些與WebView 相關的代碼是動態(tài)加載的。類似于現(xiàn)有的靜態(tài)分析工具[4,11,12],基本不處理隱式數(shù)據(jù)流,原則上這允許開發(fā)人員有意隱藏敏感的JavaScript。 動態(tài)分析的方法容易出現(xiàn)假陰性。 如這幾項研究中[6,9]都使用隨機測試工具“Monkey”來觸發(fā)WebView,然而,一些應用的WebView 只能在前提條件滿足時顯示,例如,用戶必須完成登錄,或者一個pdf 文件必須預先存在于本地存儲中,因此探索所有可能的UI 組件是一個困難的問題。 因此平衡這兩個方面的缺陷也是當前面臨的挑戰(zhàn)。
上述面臨的挑戰(zhàn)在為混合應用程序開發(fā)和相關漏洞檢測的工作帶來難題的同時,客觀上也為新發(fā)展創(chuàng)造了條件和機遇。 展望未來,仍有如下研究問題值得關注和進一步探討:
1)不同漏洞檢測方法的融合。 不同的檢測方法從不同的角度對混合應用存在的漏洞進行分析和檢測,不同檢測方法之間具有很強的互補性,通過融合各類檢測方法來引入新的安全機制,可能會更有效地檢測漏洞。
2)受到靜態(tài)分析的限制,無法檢測到通過本機代碼或動態(tài)代碼加載實例化的WebView 和接口。 原則上,這允許開發(fā)人員有意隱藏敏感的JavaScript,攻擊者可利用相關漏洞在用戶設備上安裝后門,攻擊者還可以不斷調(diào)整其惡意代碼的外顯特征,從而規(guī)避傳統(tǒng)方法的檢測。 這種攻擊方式的檢測和防御是未來研究的重點也是難點。因此,這是未來漏洞檢測的可能發(fā)展方向之一。
3)通過加強防范能力來抵制惡意攻擊。 從防范角度來考慮,可從加強基于密碼技術的認證或訪問控制等方面來提高防范能力,有可能會大幅度消減未知漏洞。 因此,這也是未來混合應用程序開發(fā)值得關注的問題之一。
安卓混合應用的安全問題是信息安全領域的熱點問題,經(jīng)過廣大研究人員的不懈努力,已經(jīng)取得了一定的成績;但是相關技術發(fā)展迅速,可能會帶動新型漏洞和相關攻擊技術的升級。研究人員需要檢測新系統(tǒng)的新型漏洞,不斷改進檢測方法,開發(fā)新的檢測工具。 因此,針對安卓混合應用程序的安全性研究依然是一項需要研究人員繼續(xù)努力的持久艱巨的任務。 本文討論了安卓混合應用程序中WebView 的最近研究進展,介紹了針對WebView 漏洞的幾種相關攻擊、檢測方法和對應防范措施,并提出了當前面臨的挑戰(zhàn)和未來的研究展望。 希望這項工作會對安卓混合應用中安全問題及相關領域的進一步研究有所幫助。