關(guān)于 WebView 的安全問(wèn)題

一張圖

有一天,老大和我說(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)

  1. 在不需要讀取本地文件的應(yīng)用中建議設(shè)置禁止 Webview 使用 File 協(xié)議。
webview.setAllowFileAccess(false);
  1. 在不需要通過(guò) file uri 加載的 Javascript 讀取其他的本地文件的應(yīng)用中建議設(shè)置禁止權(quán)限
webview.setAllowFileAccessFromFileURLs(false);
  1. 在不需要通過(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的安全公告

最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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