WebView使用漏洞

开发中有使用到WebView,使用过程中遇到一些比较坑的问题。这里总结一下,便于回头看,少走弯路。

说到WebView,这就牵扯到android 和 javascript的交互。

webSettings.setJavaScriptEnabled(true); //设置webview支持js

WebView使用中主要有三种漏洞:

  • 任意代码执行漏洞

  • 密码明文存储漏洞

  • 域控制不严格漏洞

具体分析:

1.1 WebView 任意代码执行漏洞

出现该漏洞的原因有三个:

  • WebView 中 addJavascriptInterface接口
  • WebView 内置导出的 searchBoxJavaBridge_对象
  • WebView 内置导出的accessibility 和 accessibilityTraversalObject 对象
  • 1.11 addJavascriptInterface 接口引起远程代码执行漏洞

    A. 漏洞产生原因—–
    :::::::::::::::
    》》JS调用Android的其中一个方式是通过addJavascriptInterface接口进行对象映射,所以,漏洞产生原因是:当JS拿到Android这个对象后,就可以调用这个Android对象中所有的方法,包括系统类(Java.lang.Runtime 类),从而进行任意代码执行。比如:可以执行命令获取本地设备的SD卡中的文件等信息从而造成信息泄露等。
    :::::::::::::
    B. 解决方案 ——
    :::::::::::::
    》》android 4.2版本以后在本地方法上加@JavascriptInterface注解以避免漏洞攻击
    》》android 4.2版本以前采用拦截prompt()进行漏洞修复。

  • 1.12 searchBoxJavaBridge_接口引起远程代码执行漏洞

    A. 漏洞产生原因—–
    :::::::::::
    》》在Android 3.0以下,Android系统会默认通过searchBoxJavaBridge_的Js接口给 WebView 添加一个JS映射对象:searchBoxJavaBridge_对象。该接口可能被利用,实现远程任意代码。
    :::::::::::
    B. 解决方案——
    》》删除searchBoxJavaBridge_接口。
    (通过调用该方法删除接口-removeJavascriptInterface() );
    :::::::::::

  • 1.13 accessibility和 accessibilityTraversal接口引起远程代码执行漏洞
    ::::

    A. 漏洞产生原因
    ::::
    》》 在Android 3.0以下,Android系统会默认通过accessibility 和 accessibilityTraversal的Js接口给 WebView 添加一个JS映射对象:accessibility对象 和 accessibilityTraversal对象。该接口可能被利用,实现远程任意代码。
    :::
    B. 解决方案
    》》删除接口

1.2 密码明文存储漏洞

WebView默认开启密码保存功能 :mWebSettings.setSavePassword(true)

  • 开启后,在用户输入密码时,会弹出提示框:询问用户是否保存密码;
  • 如果选择”是”,密码会被明文保到 /data/data/com.package.name/databases/webview.db 中,这样就有被盗取密码的危险。

解决方案:

》》关闭密码保存提醒:mWebSettings.setSavePassword(false)

1.3 域控制不严格漏洞

  • webView.getSettings().setAllowFileAccess(false); // 设置是否允许 WebView 使用 File 协议
  • webView.getSettings().setAllowFileAccessFromFileURLs(true); // 设置是否允许通过 file url 加载的 Js代码读取其他的本地文件
  • webView.getSettings().setAllowUniversalAccessFromFileURLs(true); // 设置是否允许通过 file url 加载的 Javascript 可以访问其他的源(包括http、https等源)

一句话说明就是:使用 file 域加载的 js代码能够使用进行同源策略跨域访问,从而导致隐私信息泄露。


  • 最终解决方案:

  • 对于不需要使用 file 协议的应用,禁用 file 协议;
    // 禁用 file 协议;
    setAllowFileAccess(false);
    setAllowFileAccessFromFileURLs(false);
    setAllowUniversalAccessFromFileURLs(false);

    ::::::::::::::::
  • 对于需要使用 file 协议的应用,禁止 file 协议加载 JavaScript。
    // 需要使用 file 协议
    setAllowFileAccess(true);
    setAllowFileAccessFromFileURLs(false);
    setAllowUniversalAccessFromFileURLs(false);
    ::::::::::::::::
    // 禁止 file 协议加载 JavaScript
    if (url.startsWith("file://") {
    setJavaScriptEnabled(false);
    } else {
    setJavaScriptEnabled(true);
    }

你可能感兴趣的:(WebView与js)