Android WebView跨域访问漏洞

一、漏洞名称
Android WebView存在跨域访问漏洞
 
二、漏洞描述
       Android WebView存在跨域访问漏洞。该漏洞产生的原因是由于Android应用WebView开启了file域访问,且允许file域访问http域,未对file域的路径做严格限制所致。攻击者可以利用漏洞,远程获取APP中的所有本地敏感数据。
 
三、漏洞危害
攻击者利用该漏洞,可远程获取用户隐私数据(包括手机应用数据、照片、文档等敏感信息),还可窃取用户登录凭证,在受害者毫无察觉的情况下实现对APP用户账户的完全控制。由于该组件广泛应用于Android平台,导致大量APP受影响,构成较为严重的攻击威胁。
 
四、漏洞情况分析
WebView是Android用于显示网页的控件,是一个基于Webkit引擎、展现web页面的控件。WebView控件功能除了具有一般View的属性和设置外,还可对URL请求、页面加载、渲染、页面交互进行处理。
  该漏洞产生的原因是在Android应用中,WebView开启了file域访问,允许file域访问http域,且未对file域的路径进行严格限制所致。攻击者通过URL Scheme的方式,可远程打开并加载恶意HTML文件,远程获取APP中包括用户登录凭证在内的所有本地敏感数据。
  漏洞触发成功前提条件如下:
    1.WebView中setAllowFileAccessFromFileURLs 或setAllowUniversalAccessFromFileURLs API配置为true;
    2.WebView可以直接被外部调用,并能够加载外部可控的HTML文件。

五、影响范围
漏洞影响使用WebView控件,开启file域访问并且未按安全策略开发的Android应用APP。
 

六、漏洞修复建议,缓解措施

 厂商暂未发布解决方案,临时解决方案如下:
1. file域访问为非功能需求时,手动配置setAllowFileAccessFromFileURLs或setAllowUniversalAccessFromFileURLs两个API为false。
(Android4.1版本之前这两个API默认是true,需要显式设置为false,因未找到设置的接口,4.1版本之前暂不做操作,4.1版本后需要防止显示设置为true,如果设置为true的话,防止loadUrl的传参url为可被攻击的)
2. 若需要开启file域访问,则设置file路径的白名单,严格控制file域的访问范围,具体如下:

(1)固定不变的HTML文件可以放在assets或res目录下,file:///android_asset和file:///android_res 在不开启API的情况下也可以访问;

(2)可能会更新的HTML文件放在/data/data/(app) 目录下,避免被第三方替换或修改;

(3)对file域请求做白名单限制时,需要对“../../”特殊情况进行处理,避免白名单被绕过。
3. 避免App内部的WebView被不信任的第三方调用。排查内置WebView的Activity是否被导出、必须导出的Activity是否会通过参数传递调起内置的WebView等。
4. 建议进一步对APP目录下的敏感数据进行保护。客户端APP应用设备相关信息(如IMEI、IMSI、Android_id等)作为密钥对敏感数据进行加密。使攻击者难以利用相关漏洞获得敏感信息。





七、相关参考
参考1.     http://www.cnvd.org.cn/webinfo/show/4365
参考2.     http://www.cnvd.org.cn/flaw/show/CNVD-2017-36682
参考3.     http://blogs.360.cn/360mobile/2014/09/22/webview%E8%B7%A8%E6%BA%90%E6%94%BB%E5%87%BB%E5%88%86%E6%9E%90/


八、举例说明:WebView中的file协议。(http://blogs.360.cn/360mobile/2014/09/22/webview跨源攻击分析/)
我们通过一个简单示例和4个API来理解WebView中file协议的安全性,示例代码如下,4个API见4行注释,分别用(1)–(4)表示。
public class WebViewActivity extends Activity {
    private WebView webView;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_webview);
        webView = (WebView) findViewById(R.id.webView1);
        //webView.getSettings().setAllowFileAccess(false);                    (1)
        //webView.getSettings().setJavaScriptEnabled(true);                   (2)
        //webView.getSettings().setAllowFileAccessFromFileURLs(true);       (3)
        //webView.getSettings().setAllowUniversalAccessFromFileURLs(true); (4)
        Intent i = getIntent();
        String url = i.getData().toString();
        webView.loadUrl(url);
    }
 }
其中WebViewActivity为导出Activity,当其它应用启动此Activity时intent中的data直接被当做url来加载。通过drozer可以很方便的启动WebViewActivity,运行如下所示的命令,WebViewActivity会加载file:///data/local/tmp/attack.html

dz> run app.activity.start
–component com.example.webviewtest com.example.webviewtest.WebViewActivity
–action android.intent.action.VIEW
–data-uri file:///data/local/tmp/attack.html


我们知道因为sandbox的存在, Android中的各应用是相互隔离的,在一般情况下A应用是不能访问B应用的文件的,但不正确的使用WebView可能会打破这种隔离,从而带来应用数据泄露的威胁,即A应用可以通过B应用导出的Activity让B应用加载一个恶意的file协议的url,从而可以获取B应用的内部私有文件。我们分别分析4个API对WebView安全性的影响。
1)setAllowFileAccess
通过这个API可以设置是否允许WebView使用File协议,默认值是允许,如果不允许使用File协议,则不会存在下述的各种跨源的安全威胁,但同时也限制了webview的功能,使其不能加载本地的html文件。禁用File协议后,运行上述drozer命令会得到下图所示输出,图中所示的文件是存在的,但WebView禁止加载此文件,移动版的Chrome默认禁止加载file协议的文件。


2)setJavaScriptEnabled
通过此API可以设置是否允许WebView使用JavaScript,默认是不允许,但很多应用,包括移动浏览器为了让WebView执行http协议中的javascript,都会主动设置允许WebView执行Javascript,而又不会对不同的协议区别对待,比较安全的实现是如果加载的url是http或https协议,则启用javascript,如果是其它危险协议,如是file协议,则禁用javascript。禁用file协议的javascript可以很大程度上减小跨源漏洞对WebView的威胁。当然,禁用file协议的javascript执行并不能完全杜绝跨源文件泄露。例如,有的应用实现了下载功能,对于不可渲染的页面,会自动下载到sd卡中,由于sd卡中的文件所有应用都可以访问,于是可以通过构造一个file URL指向被攻击应用的私有文件,然后用此URL启动Activity,就可以在SD卡中读取被攻击应用的私有文件了。


3) setAllowFileAccessFromFileURLs
通过此API可以设置是否允许通过file url加载的Javascript读取其他的本地文件,这个设置在JELLY_BEAN以前的版本默认是允许,在JELLY_BEAN及以后的版本中默认是禁止的。下面的代码片段为对应于与drozer命令中的attack.html。

<script>
function loadXMLDoc()
{
    var arm = "file:///etc/hosts";
    var xmlhttp;
    if (window.XMLHttpRequest)
    {
        xmlhttp=new XMLHttpRequest();
    }
    xmlhttp.onreadystatechange=function()
    {
        //alert("status is"+xmlhttp.status);
        if (xmlhttp.readyState==4)
        {
              console.log(xmlhttp.responseText);
        }
    }
    xmlhttp.open("GET",arm);
    xmlhttp.send(null);
}
loadXMLDoc();
</script>

当AllowFileAccessFromFileURLs为true是,上述javascript可以成功读取/etc/hosts的内容,但设置为false时,上述脚本执行会导致如下错误,表示浏览器禁止从file url中的javascript读取其它本地文件。

I/chromium(27749): [INFO:CONSOLE(0)] “XMLHttpRequest cannot load file:///etc/hosts. Cross origin requests are only supported for HTTP.”, source: file:///data/local/tmp/attack.html


4) setAllowUniversalAccessFromFileURLs
通过此API可以设置是否允许通过file url加载的Javascript可以访问其他的源,包括其他的文件和http,https等其他的源。这个设置在JELLY_BEAN以前的版本默认是允许,在JELLY_BEAN及以后的版本中默认是禁止的。如果此设置是允许,则setAllowFileAccessFromFileURLs不起做用,假设下面的代码片段为对应于与drozer命令中的attack.html。

<script>
function loadXMLDoc()
{
    var arm = "http://www.so.com";
    var xmlhttp;
    if (window.XMLHttpRequest)
    {
        xmlhttp=new XMLHttpRequest();
    }
    xmlhttp.onreadystatechange=function()
    {
        //alert("status is"+xmlhttp.status);
        if (xmlhttp.readyState==4)
        {
             console.log(xmlhttp.responseText);
        }
    }
    xmlhttp.open("GET",arm);
    xmlhttp.send(null);
}
loadXMLDoc();
</script>

当AllowFileAccessFromFileURLs为true是,上述javascript可以成功读取http://www.so.com的内容,但设置为false时,上述脚本执行会导致如下错误,表示浏览器禁止从file url中的javascript访问其他源的资源。

I/chromium(28336): [INFO:CONSOLE(0)] “XMLHttpRequest cannot
load http://www.so.com/. Origin null is not allowed by
Access-Control-Allow-Origin.”, source: file:///data/local/tmp/attack.html



九、安全建议
1.对于不需要使用file协议的应用,禁用file协议
2.对于需要使用file协议的应用,禁止file协议调用javascript
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值