您当前的位置:安全博客 > 安全漏洞 > WebView File域同源策略绕过漏洞浅析

WebView File域同源策略绕过漏洞浅析

阿里无线安全团队发表于2015年03月12日

作者:行里

1. WebView File域同源策略绕过漏洞描述

      2013年10月份,外部爆出FireFox Android版存在file域同源策略绕过漏洞,可造成cookie等敏感信息泄露,黑客可利用该漏洞获取FireFox的所有文件。低版本的Android系统WebView组件也存在同样的漏洞[1],应用程序一旦使用WebView并支持File域,就会受到该漏洞的攻击。该漏洞源于:JavaScript的延时执行能够绕过file协议的同源检查,并能够访问受害应用的所有私有文件,即通过WebView对Javascript的延时执行和将当前Html文件删除掉并软连接指向其他文件就可以读取到被符号链接所指的文件,然后通过JavaScript再次读取HTML文件,即可获取到被符号链接所指的文件。
      大多数使用WebView的应用都会受到该漏洞的影响,恶意应用通过该漏洞,可在无特殊权限下盗取应用的任意私有文件,尤其是浏览器,可通过利用该漏洞,获取到浏览器所保存的密码、Cookie、收藏夹以及历史记录等敏感信息,从而造成敏感信息泄露; 

2. WebView file域同源策略绕过漏洞影响范围

      Android 系统

3.WebView file域同源策略绕过漏洞漏洞详情

1) 漏洞位置:

      WebView 

2) 漏洞触发前提条件:

      WebView没有禁止使用file域;
      WebView打开了对JavaScript的支持;

3) 漏洞原理:

      通过WebView对Javascript的延时执行和将当前Html文件删除掉并软连接指向其他文件就可以读取到被符号链接所指的文件,然后通过JavaScript再次读取HTML文件,即可获取到被符号链接所指的文件。

4. WebView file域同源策略绕过漏洞漏洞证明

1) 利用WebView的file域协议读取任意可读文件或受害应用的私有文件。

      开启支持File域协议的WebView的Java代码片段: 


      用以下命令查看hosts文件“/system/etc/hosts”:
 
      结果显示如下图:
         
      用以下命令查看应用私有文件“databases/webview.db”:
 
      结果显示如下图:
 
      2) 利用file协议读取任意可读文件或受害应用的私有文件并上传至远程服务器(此处仅仅alert)。
      开启支持JavaScript执行的WebView的Java代码片段:
 
      恶意HTML代码片段:
 
      用以下命令启动应用的WebView启动恶意HTML代码窃取文件:
 
 
      3) 利用WebView对Javascript的延时执行和将当前Html文件删除掉并软连接指向其他文件就可以读取到被符号链接所指的文件,然后通过JavaScript再次读取HTML文件,即可获取到被符号链接所指的文件,从而造成如所保存的密码、Cookie等敏感信息泄露。详细攻击步骤请见下面描述:

    应用的主要Activity或导出的WebView Activity: 

    开启支持JavaScript执行的并未禁止File域协议的WebView的Java代码片段: 
 
      攻击WebView的构造的恶意HTML代码片段[1]:
 
      攻击受害应用WebView的代码片段:
 
      攻击结果如下图显示读取到了该受害应用的私有文件”databases/webview.db”,并可将其传送至远程服务器(此处仅仅alert):

5. WebView File域同源策略绕过漏洞修复建议

1. 将不必要导出的组件设置为不导出[2]

      如果应用的组件不必要导出,阿里聚安全建议显式设置所注册组件的“android:exported”属性为false;

2. 如果需要导出组件,禁止使用File域

      如果应用的需要导出包含WebView的组件,阿里聚安全建议禁止使用File域协议:
myWebView.getSettings. setAllowFileAccess(false);

3. 如果需要使用File协议,禁止File协议调用JavaScript

      如果应用的WebView需要使用File域协议,阿里聚安全建议禁止File域协议调用JavaScript:
myWebView.getSettings. setJavaScriptEnabled(false);


引用

[1] https://code.google.com/p/chromium/issues/detail?id=144866 
[2] http://developer.android.com/training/articles/security-tips.html




安全漏洞