Android WebView安全方面的一些坑

公司一款app有將近兩年沒有更新了,雖然用戶量不大,可是由於與第三方有合做,出現問題時須要進行維護;沒想到最近第三方對他們全部的軟件進行了網絡安全掃描,這款Android app也未能倖免...html

Android安全問題(WebView)

由於app是13年左右開發的,維護也只是到1六、17年左右就終止了,因此,掃描出很多漏洞;由於是採用了webview+html混合開發,所以,須要解決一些webview相關的問題:android

1、webview隱藏接口問題(任意命令執行漏洞)

android webview組件包含3個隱藏的系統接口:searchBoxJavaBridge_, accessibilityTraversal以及accessibility,惡意程序能夠經過反射機制利用它們實現遠程代碼執行;該問題在Android4.4如下版本出現。 因而,在Android3.04.4之間的版本,咱們經過移除這些隱藏接口,來解決該問題:web

// 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");
    }
複製代碼

2、addJavascriptInterface任何命令執行漏洞

webview中使用jshtml進行交互是一個不錯的方式,可是,在Android4.2(16,包含4.2)及如下版本中,若是使用addJavascriptInterface,則會存在被注入js接口的漏洞;在4.2以後,因爲Google增長了@JavascriptInterface,該漏洞得以解決。安全

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

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;
    }
複製代碼

3、繞過證書校驗漏洞

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);
    }
複製代碼

4、allowFileAccess致使的File域同源策略繞過漏洞

若是webview.getSettings().setAllowFileAccess(boolean)設置爲true,則會面臨該問題;該漏洞是經過WebViewJavascript的延時執行和html文件替換產生的。 解決方案是禁止WebView頁面打開本地文件,即app

webview.getSettings().setAllowFileAccess(false);
複製代碼

或者更直接的禁止使用JavaScriptide

webview.getSettings().setJavaScriptEnabled(false);
複製代碼

因爲業務上的緣由,這個解決方案其實並不怎麼理想,若是有更好的解決方案,歡迎指教!ui

原文:簡書ThinkinLiu 博客: IT老五url

這是都是關於WebView網絡安全的問題,其餘非安全漏洞方面的坑這裏就很少說~

作開發越久,越以爲本身不會的太多;若是文中有錯誤之處,麻煩指出,多謝!

相關文章
相關標籤/搜索