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网络安全的问题,其余非安全漏洞方面的坑这里就很少说~

作开发越久,越以为本身不会的太多;若是文中有错误之处,麻烦指出,多谢!

相关文章
相关标签/搜索