Android WebView安全方面的一些坑

ThinkinLiu發表於2019-03-03

公司一款app有將近兩年沒有更新了,雖然使用者量不大,但是因為與第三方有合作,出現問題時需要進行維護;沒想到最近第三方對他們所有的軟體進行了網路安全掃描,這款Android app也未能倖免...

Android安全問題(WebView)

因為app是13年左右開發的,維護也只是到16、17年左右就終止了,所以,掃描出不少漏洞;因為是採用了webview+html混合開發,因此,需要解決一些webview相關的問題:

一、webview隱藏介面問題(任意命令執行漏洞)

android webview元件包含3個隱藏的系統介面:searchBoxJavaBridge_, accessibilityTraversal以及accessibility,惡意程式可以通過反射機制利用它們實現遠端程式碼執行;該問題在Android4.4以下版本出現。 於是,在Android3.04.4之間的版本,我們通過移除這些隱藏介面,來解決該問題:

    // 19  4.4  Build.VERSION.KITKAT
    // 11  3.0  Build.VERSION_CODES.HONEYCOMB
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB 
        && Build.VERSION.SDK_INT < 19 && webView != null) { 
        webView.removeJavascriptInterface("searchBoxJavaBridge_");
        webView.removeJavascriptInterface("accessibility");
        webView.removeJavascriptInterface("accessibilityTraversal");
    }
複製程式碼

二、addJavascriptInterface任何命令執行漏洞

webview中使用jshtml進行互動是一個不錯的方式,但是,在Android4.2(16,包含4.2)及以下版本中,如果使用addJavascriptInterface,則會存在被注入js介面的漏洞;在4.2之後,由於Google增加了@JavascriptInterface,該漏洞得以解決。

解決該問題,最徹底的方式是在4.2以下放棄使用addJavascriptInterface,採用onJsPrompt或其它方法替換。或者使用一些方案來降低該漏洞導致的風險:如使用https並進行證照校驗,如果是http則進行頁面完整性校驗,如上面所述移除隱藏介面等。

    public boolean onJsPrompt(WebView view, String url, String message,String defaultValue, JsPromptResult result) {
        result.confirm(CGJSBridge.callJava(view, message));
        Toast.makeText(view.getContext(),"message="+message,Toast.LENGTH_LONG).show();
        return true;
    }
複製程式碼

三、繞過證照校驗漏洞

webviewClient中有onReceivedError方法,當出現證照校驗錯誤時,我們可以在該方法中使用handler.proceed()來忽略證照校驗繼續載入網頁,或者使用預設的handler.cancel()來終端載入。 因為我們使用了handler.proceed(),由此產生了該“繞過證照校驗漏洞”。 如果確定所有頁面都能滿足證照校驗,則不必要使用handler.proceed()

    @SuppressLint("NewApi")
    @Override
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
        //handler.proceed();// 接受證照
        super.onReceivedSslError(view, handler, error);
    }
複製程式碼

四、allowFileAccess導致的File域同源策略繞過漏洞

如果webview.getSettings().setAllowFileAccess(boolean)設定為true,則會面臨該問題;該漏洞是通過WebViewJavascript的延時執行和html檔案替換產生的。 解決方案是禁止WebView頁面開啟本地檔案,即

    webview.getSettings().setAllowFileAccess(false);
複製程式碼

或者更直接的禁止使用JavaScript

    webview.getSettings().setJavaScriptEnabled(false);
複製程式碼

由於業務上的原因,這個解決方案其實並不怎麼理想,如果有更好的解決方案,歡迎指教!

原文:簡書ThinkinLiu 部落格: IT老五

這是都是關於WebView網路安全的問題,其他非安全漏洞方面的坑這裡就不多說~

做開發越久,越覺得自己不會的太多;如果文中有錯誤之處,麻煩指出,多謝!

相關文章