
有一天,老大和我說(shuō),安卓的 webview 有很多漏洞你知不知道?
emmmmm...
作為一個(gè)三好公民,我真的從來(lái)沒(méi)有考慮過(guò)還會(huì)有人攻擊我做的 app,不過(guò)人心叵測(cè),居安思危,我還是去看了一下所謂的漏洞,在這里做個(gè)記錄,方便之后使用。
網(wǎng)絡(luò)上關(guān)于 Android WebView 漏洞的文章很多,原理的東西我不太懂,如果需要,可以看看我下面的參考鏈接,都講得很細(xì)。
這里我只簡(jiǎn)單記錄一下不同版本需要做的處理和注意事項(xiàng)。
1)addJavascriptInterface接口造成的代碼任意訪問(wèn)問(wèn)題
API <= 17
出于安全考慮,Google 在 API 17 中規(guī)定允許被調(diào)用的函數(shù)必須以@JavascriptInterface進(jìn)行注解,理論上如果 APP 依賴的 API 為 17 或者以上,就不會(huì)受該問(wèn)題的影響。但部分機(jī)型上,API 17 依然受影響,并且如果 APP 存在此漏洞,且 targetsdk < 17,那漏洞的影響可以覆蓋到 android4.4 的終端,如果 targetsdk >= 17 ,那么漏洞只會(huì)在低于 android4.2 的機(jī)型上觸發(fā)。相信@JavascriptInterface注解,大多數(shù)應(yīng)用都已經(jīng)加上了,如果需要適配低版本的系統(tǒng),可以參考 [1] 中的 js 攔截方法。
2)內(nèi)置 searchBoxJavaBridge_ 存在遠(yuǎn)程代碼執(zhí)行漏洞
API < 17
具體可以參考 [3],這個(gè)接口在 android4.2 以后已經(jīng)移除了,如果需要保證 4.2 以及之前的版本安全,需要調(diào)用:
webview.removeJavascriptInterface("searchBoxJavaBridge_");
之后又發(fā)現(xiàn)了與上面類似的不安全接口,通過(guò)下面的代碼移除:
//未知 api
removeJavascriptInterface("accessibility");
removeJavascriptInterface("accessibilityTraversal");
3)file 協(xié)議 -- WebView域控制不嚴(yán)格漏洞
API for all(其實(shí) android4.1 之后下面的值默認(rèn)為 false)
- 在不需要讀取本地文件的應(yīng)用中建議設(shè)置禁止 Webview 使用 File 協(xié)議。
webview.setAllowFileAccess(false);
- 在不需要通過(guò) file uri 加載的 Javascript 讀取其他的本地文件的應(yīng)用中建議設(shè)置禁止權(quán)限
webview.setAllowFileAccessFromFileURLs(false);
- 在不需要通過(guò) file uri 加載的 Javascript 讀取其他源的應(yīng)用中建議設(shè)置禁止權(quán)限,這里說(shuō)的源包括其他文件、https、http 等多樣的源。如果此設(shè)置是允許,則
setAllowFileAccessFromFileURLs不起做用。
webview.setAllowUniversalAccessFromFileURLs(false);
然而上面 2、3 在 api 16 以上才有,那么對(duì)于 api 16 之前的應(yīng)用或者需要加載本地頁(yè)面的應(yīng)用,我們需要下面的代碼:
//對(duì)于需要使用 file 協(xié)議的應(yīng)用,設(shè)置可以白名單或禁止 file 協(xié)議加載 JavaScript;
webview.setAllowFileAccess(true);
//這里是白名單控制、
//對(duì)于必須使用file URL對(duì)http域進(jìn)行訪問(wèn)時(shí),可對(duì)傳入的URL路徑范圍嚴(yán)格控制,
//設(shè)置允許訪問(wèn)的URL列表(不要遺漏路徑中可能出現(xiàn)的特殊情況如“../../”等,避免限制被繞過(guò))。示例代碼如下 :
webView.setWebViewClient(new WebViewClient(){
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if(url.startsWith("xxx")){
return true;
}
if(url.endsWith("xxx")){
return true;
}
if(url.equals("xxx")){
return true;
}
if(url.equalsIgnoreCase("xxx")){
return true;
}
return false;
}
});
4)WebView密碼明文存儲(chǔ)漏洞
API for all
WebView默認(rèn)開(kāi)啟密碼保存功能,如果該功能未關(guān)閉,在用戶輸入密碼時(shí),會(huì)彈出提示框,詢問(wèn)用戶是否保存密碼,如果選擇"是",密碼會(huì)被明文保到 /data/data/com.package.name/databases/webview.db
無(wú)論如何保存密碼到本地都是有安全風(fēng)險(xiǎn)的,因此應(yīng)謹(jǐn)慎地關(guān)閉這個(gè)提示框。
mWebView.setSavePassword(false)
以上。
感謝:
[1] 在WebView中如何讓JS與Java安全地互相調(diào)用
[2] WebView 遠(yuǎn)程代碼執(zhí)行漏洞淺析
[3] 支付寶錢(qián)包遠(yuǎn)程代碼執(zhí)行漏洞
[4] Android安全開(kāi)發(fā)之WebView中的大坑
[5] 關(guān)于xxxxx的安全公告