1. 程式人生 > >Android WebView遠端執行程式碼漏洞淺析

Android WebView遠端執行程式碼漏洞淺析

在過去的一段時間裡,WebView遠端程式碼執行漏洞可以說是橫掃了一大批的Android App,查詢一些漏洞平臺可以得到大致的情況,鑑於很多存在漏洞的App並沒有披露,因此WebVeiw遠端執行程式碼漏洞的影響程度會更大。由於Google Android 系統碎片化程度很高,大量的Android系統無法得到及時有效地更新,這個漏洞目前依然在被利用。

本文從WebView的概念開始詳細介紹了webView漏洞的成因、利用和檢測方法,並在文章的末尾對此類漏洞進行了一些思考和總結。

一. WebView 的簡介

根據Google的文件,WebView 就是A View that displays web pages 繼承的結構如下:

從上圖中可以得知,WebView 也是一個View,在Android 中一個View就可以簡單地理解為顯示在螢幕上的一個介面,而WebView就是用於展示Web頁面的介面。Android的WebView的主要作用有下面兩個:

Activity上顯示線上的網頁內容
WebView可以實現一個接受簡單控制的Web瀏覽器

WebView的實現發生了很大的改變,在Android < 4.4 (KitKat)上的WebView是基於Webkit實現的,而Android >= 4.4 的WebView 則是基於Chrome for Android version 30實現的,因此差異十分明顯。

在Android系統中使用WebView是很容易的,首先需要在layout 中定義WebView節點。

在layout中添加了WebView節點後,在Activity中就可以直接使用了,

開啟WebView的Activity,就會訪問index.html頁面,這就是WebView的基本用法。

二. WebView RCE 相關的幾個CVE

進幾年和WebView遠端程式碼執行相關的漏洞主要有CVE-2012-6336,CVE-2014-1939,CVE-2014-7224, 這些漏洞中最核心的漏洞是CVE-2012-6336,另外兩個CVE只是發現了幾個預設存在的介面,下面就具體說明這些漏洞的情況。

3.1 CVE-2012-6636

Android API 16.0及之前的版本中存在安全漏洞,該漏洞源於程式沒有正確限制使用WebView.addJavascriptInterface方法。遠端攻擊者可通過使用Java Reflection API利用該漏洞執行任意Java物件的方法

Google Android <= 4.1.2 (API level 16) 受到此漏洞的影響。

3.2 CVE-2014-1939

java/android/webkit/BrowserFrame.java 使用addJavascriptInterface API並建立了SearchBoxImpl類的物件。攻擊者可通過訪問searchBoxJavaBridge_介面利用該漏洞執行任意Java程式碼。

Google Android <= 4.3.1 受到此漏洞的影響

3.3 CVE-2014-7224

香港理工大學的研究人員發現當系統輔助功能中的任意一項服務被開啟後,所有由系統提供的WebView都會被加入兩個JS objects,分別為是accessibility和accessibilityTraversal。惡意攻擊者就可以使用accessibility和accessibilityTraversal這兩個Java Bridge來執行遠端攻擊程式碼.

Google Android < 4.4 受到此漏洞的影響。

三. WebView RCE 漏洞分析

要理解WebView 的遠端程式碼執行漏洞首先要理解JAVA的反射機制(Java Reflection)

4.1 Java Reflection

反射是java語言提供的一種機制,使Java程式可以在執行時檢查類、介面、方法和成員,而不需要在編譯的時候知道類的名字和方法等細節資訊。
JAVA反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意一個方法;這種動態獲取的資訊以及動態呼叫物件的方法的功能稱為java語言的反射機制。

為了使用Java Reflection,我們首先需要了解獲得Class Object的方法,一般的情況下有下面幾種方法。

得到了Class object 後就可以得到非常強大的能力,Class Object是Reflection API 中的核心,一般常用的方法有下面幾個:
– getName()
– getFields()
– getDeclaredFields()
– getMethods()
為了更好地理解,參考下面的幾個比較典型的例子

4.1.1 執行Private 方法

利用反射的方法,我們已經成功呼叫了Demo的private a1 方法。

4.1.2 執行命令

執行上面的java 程式碼,會將 id 命令的結果寫入 /tmp/id 檔案,這個程式碼其和WebView漏洞的實際情況已經很接近了。

4.2 WebView的addJavascriptInterface 方法

接下來我們來看看WebView 漏洞的實際情況,Android 官方網站對addJavascriptInterface的介紹如下:

從上面的介紹我們可以瞭解到,addJavascriptInterface往 WebView裡注入了一個Java Object, 而這個Jave Object 的方法可以被Javascript 訪問。之所以提供addJavascriptInterface是為了WebView中的Javascript可以和本地的App通訊,這確實是一個很強大的功能,這麼做的好處在於本地App邏輯不變的情況下,不需要升級App就可以對程式進行更新,修改相應的Web頁面就可以了。

但是在Android 的早期版本並沒有對可以訪問的方法做限制,利用Java 的反射機制,可以呼叫任意物件的任意方法,這就是WebView 漏洞的根本成因。

四. WebView RCE漏洞利用方法

使用受漏洞影響的WebView訪問包含下面指令碼的頁面就會執行相關的命令。

jsinterface是匯出的Java物件,如果利用成功,獲得的許可權是app的使用者許可權,也就是說利用WebView 漏洞獲得的許可權是app的許可權,受限於Android application sandbox, 受限於AndroidManifest.xml中申請的許可權。像上面的語句要成功寫入檔案,需要AndroidManifest.xml中存在 android.permission.WRITE_EXTERNAL_STORAGE 許可權。

五. WebView 遠端漏洞檢測

使用WebView訪問下面頁面,輸出的介面名稱則存在漏洞。利用Ajax等方法完全可以對WebView 漏洞進行自動化測試。

在Android 4.1.2 分兩種情況訪問測試頁面,測試的結果如下:

(1) 沒有開啟任何一個輔助功能
(2) 開啟一個輔助功能

在沒有打補丁的情況下,已經成功地檢測出CVE-2014-1939和CVE-2014-7224漏洞中所指出的有JS object,這個漏洞檢測程式碼是有效的。

六. 修復方法和現狀

Google宣佈不為小於Android 4.4 的系統提供WebView補丁, 具體可以參見連結

因此要解決WebView的RCE漏洞,靠譜的方法是升級Android系統,至少要升級到 API level 17 (Android 4.2), WebView 除了最嚴重的RCE漏洞,還有各種SOP漏洞,所以至少要升級到Android 4.4才能保證安全,小於Android 4.4 Google不提供補丁。Android 4.4 以後使用以chrome為基礎的WebView。

升級系統API level 17後,只有顯示新增 @JavascriptInterface的方法才能被JavaScript呼叫,這樣反射就失去作用了。

建議在使用WebView的程式碼刪除出問題的介面,具體程式碼如下: 

removeJavascriptInterface(“accessibility”); removeJavascriptInterface(“accessibilityTraversal”); removeJavascriptInterface(“searchBoxJavaBridge_”);

七. 一些思考

由於Java 反射所帶來的安全問題並不在少數,這也給我們發掘相關漏洞提供了思路。比如CVE-2010-1871的jboss seam framework RCE。

看看這個利用程式碼是不是非常的相似。還有前段很火爆的Spring Framework Remote Code with Expression Language Injection,原理都是類似的。

真正的新漏洞並不多,人們大多數時候都在犯同樣的錯誤,雖然俗話說人們不應該在同樣的地方摔倒兩次,但是在網路安全的世界裡,人們卻總是在同樣的地方摔倒。

參考資料