WebView File域信息泄漏(二)
写在前面
在上一篇文章中,说明了WebView关于File域三个Setting涉及到的功能、默认的参数设置,以及当这三个功能全部都开启的时候的一种攻击方式。
在本文中将继续说明,在File域默认的开启状况下,如何攻击完成敏感信息的泄漏。
攻击方式
Demo
在默认设置下,我们需要编写两个APP来具体的解释攻击流程,首先是Victim APP中的代码
1 | package com.example.webviewfiledemo; |
这次写的webviewfiledemo APP只是完成了加载WebView的最基本功能和配置,可以通过传入Intent的Extra部分提取URL并打开相应的URL。
下面是AttackWebView中的攻击代码:
1 | public class MainActivity extends AppCompatActivity { |
攻击流程解析
Em….个人感觉这种攻击方式还是很有意思的,首先,由于目标Activity在加载WebView的时候已经禁用了setAllowFileAccessFromFileURLs和setAllowUniversalAccessFromFileURLs,因此我们加载的javascript是不能够再次打开File域名(file://)下的文件了。但是由于setJavaScriptEnabled(true)和setAllowFileAccess(true)我们仍然可以让Victim APP加载File域下的文件也可以执行其中的JavaScript代码。
因此,攻击流程如下:
- Attack APP编写一个HTML文件,存放于自己APP sandbox的目录下。HTML文件中的javascript功能是延时读取自己文件中的内容。
- 调起Victim APP中的Activity去加载Attack APP编写好的HTML文件。
- 在延时读取的期间,Attack APP会删除HTML的文件,并创建一个软连接到攻击者想要读取的文件上。
- 这样,延时读取的内容就会是软连接到的文件内容,以此做到了隐私数据的泄漏。
当然,这种攻击方式仍有一些局限,作者在做此问题的复现的时候发现,在Android Q中,跨sandbox读取软链接创建的文件,会遭到SELinux的拦截从而无法泄漏数据。
WebView安全配置
对于WebView开发的安全”建议”(额,因为俺不是个Android开发,可能更多的就只是构想而已) :
对于不需要使用File协议的,设置setAllowFileAccess(false)
如非特殊情况,setAllowFileAccessFromFileURLs和setAllowUniversalAccessFromFileURLs设置为false。
对于Javascript Enable的问题,看到这个策略感觉还是很不错的
1
2
3
4
5
6
7
8setAllowFileAccess(true); //设置为 false 将不能加载本地 html 文件
setAllowFileAccessFromFileURLs(false);
setAllowUniversalAccessFromFileURLs(false);
if (url.startsWith("file://") {
setJavaScriptEnabled(false);
} else {
setJavaScriptEnabled(true);
}对于WebView传入的URL做严格的校验,特别是导出组件;
对于导出的JSAPI