陌陌分享|Android WebView 相關漏洞分析
沃·茲基碩德小貼士
分享一點點,學習一些些
作者述:見解有限,文章內容如有不當之處,請多多指正。
一、webview 遠程命令執行
Android API level 16 以及之前的版本存在遠程代碼執行的漏洞,該漏洞源於程序沒有正確限制使用 WebView.addJavascriptInterface 方法,遠程攻擊者可通過使用 Java Reflection API 利用該漏洞執行任意 Java 對象的方法,簡單的說就是通過 addJavascriptInterface 給 WebView 加入一個 JavaScript 橋接接口, app 使用 webview 加載網頁時, JavaScript 通過調用這個接口可以直接操作本地 app 的 JAVA 接口。
二、WebView RCE 相關的幾個CVE
WebView 遠程代碼執行相關的漏洞主要有 CVE-2012-6336, CVE-2014-1939, CVE-2014-7224。
2.1 CVE-2012-6636
Android API 16.0 及之前的版本中存在安全漏洞,該漏洞源於程序沒有正確限制使用WebView.addJavascriptInterface 方法。遠程攻擊者可通過使用 Java Reflection API 利用該漏洞執行任意 Java 對象的方法。
Google Android <= 4.1.2 (API level 16) 受到此漏洞的影響。
2.2 CVE-2014-1939
java/android/webkit/BrowserFrame.java 使用 addJavascriptInterface API 並創建了 SearchBoxImpl 類的對象。攻擊者可通過訪問 searchBoxJavaBridge_ 接口利用該漏洞執行任意 Java 代碼。
Google Android <= 4.3.1 受到此漏洞的影響。
2.3 CVE-2014-7224
香港理工大學的研究人員發現當系統輔助功能中的任意一項服務被開啓後,所有由系統提供的 WebView 都會被加入兩個 JS objects,分別爲是 accessibility 和 accessibilityTraversal。惡意攻擊者就可以使用accessibility 和 accessibilityTraversal 這兩個 Java Bridge 來執行遠程攻擊代碼。
Google Android < 4.4 受到此漏洞的影響。
三、API Level <17 WebView RCE POC
Android 在 4.4.4 版本上徹底從 native 層禁止了 webview 對 getClass 的調用,從而阻斷了一條反射執行命令的道路。但是 Context 的 getClassLoader().loadClass(“java.lang.Runtime”) 卻是沒有被禁止的。其限制條件爲 addJavascriptInterface 綁定的對象必須爲 context 的子類(一般都是 activity),因爲這樣才能調用 getClassLoader。targetSDKversion <17,只有在 targetsdk 小於 17 的時候才能調用 js 對象的任意方法,targetsdk>=17 的情況下只能調用加了 @JavaScriptInterface 註解的方法。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<title>WebView漏洞檢測</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
</head>
<body>
<p>
提示:如何檢測出“accessibility”和 “accessibilityTraversal”接口----設置-輔助功能-開啓系統或第三方輔助服務<br><br>
<b><font color=red>如果當前app存在漏洞,將會在頁面中輸出存在漏洞的接口方便程序員做出修改:</font></b>
</p>
<script type="text/javascript">
function check()
{
for (var obj in window)
{
try {
if ("getClass" in window[obj] or "getClassLoader" in window[obj]) {
try{
window[obj].getClass();
document.write('<span style="color:red">'+obj+'getClass</span>');
document.write('<br />');
}catch(e){
}
try{
window[obj].getClassLoader();
document.write('<span style="color:red">'+obj+'getClassLoader</span>');
document.write('<br />');
}catch(e){
}
}
} catch(e) {
}
}
}
check();
</script>
</body>
</html>
四、API Level >= 17 以上的 WebView
出於安全考慮,爲了防止 Java 層的函數被隨便調用,Google 在 4.2 版本之後,規定允許被調用的函數必須以 @JavascriptInterface 進行註解,所以如果某應用依賴的 API Level 爲 17 或者以上,就不會受該問題的影響 (注:Android 4.2 中 API Level 小於 17 的應用也會受影響) 所謂 @JavascriptInterface 註解,就是給前端 javascript 可調用的函數限制了一個白名單,但是由於爲了更好的網頁與 app 交互,總是會暴露一些敏感的接口供前端 js 調用。爲了保護這些敏感接口的安全,一般通過校驗當前頁面的 host 的方式來限制在某些域內的 js 調用。
五、webview 域控制不嚴格與app克隆
思路:
當 app 未禁用 file 協議時,js 可通過 file 協議獲取到本地文件(存儲用戶 token 的文件),然後發送給攻擊服務器,攻擊者可通過恢復 token 克隆目標 app。攻擊者可以用惡意鏈接實現生成本地惡意攻擊 html,並傳遞惡意 html 的 file 路徑給可導出的組件,該組件加載訪問 html 文件執行其中的惡意 js,會導致私有目錄中的文件被攻擊者獲取。
原理:
使用 file 域加載的 js 代碼能夠進行同源策略跨域訪問。
防禦方法:
-
設置 activity 不可被導出,則無法傳遞惡意 html 的 file 路徑給可導出的組件。
-
webview 不開啓
webSettings.setJavaScriptEnabled(true);
,則 webview 無法執行 js。 -
webview 不開啓
setAllowUniversalAccessFromFileURLs(true);
,則 webview 無法將 token 發送到遠程服務器。 -
禁止 WebView 使用 File 協議
webView.getSettings().setAllowFileAccess(false);
webView.getSettings().setAllowFileAccessFromFileURLs(false);
,則 webview 無法獲取到本地文件。 -
具體的 activity 要根據實際情況進行限制。
Reference:
http://appscan.360.cn/blog/?p=25
http://www.droidsec.cn/webview-遠程代碼執行漏洞淺析/
https://www.freebuf.com/articles/terminal/160061.html
https://www.freebuf.com/articles/terminal/161277.html
推薦閱讀
||陌陌分享 | 文檔釣魚
| | 陌陌分享 | shellcode 分離免殺與不落地加載
陌陌安全
陌陌安全致力於以務實的工作保障陌陌旗下所有產品及億萬用戶的信息安全,以開放的心態擁抱信息安全機構、團隊與個人之間的共贏協作,以自由的氛圍和豐富的資源支撐優秀同學的個人發展與職業成長。