Android WebView安全问题

Android安全问题(WebView)
因为app是13年左右开发的,维护也只是到16、17年左右就终止了,所以,扫描出不少漏洞;因为是采用了webview+html混合开发,因此,需要解决一些webview相关的问题:

一、webview隐藏接口问题(任意命令执行漏洞)
android webview组件包含3个隐藏的系统接口:searchBoxJavaBridge_, accessibilityTraversal以及accessibility,恶意程序可以通过反射机制利用它们实现远程代码执行;该问题在Android4.4以下版本出现。
于是,在Android3.0到4.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中使用js与html进行交互是一个不错的方式,但是,在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,则会面临该问题;该漏洞是通过WebView对Javascript的延时执行和html文件替换产生的。
解决方案是禁止WebView页面打开本地文件,即

    webview.getSettings().setAllowFileAccess(false);
或者更直接的禁止使用JavaScript

    webview.getSettings().setJavaScriptEnabled(false);
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值