Webview Attacks
WebView 配置与安全指南
WebView 漏洞概述
Android 开发的一个关键方面是正确处理 WebViews。本指南强调了关键配置和安全实践,以减轻与 WebView 使用相关的风险。
WebViews 中的文件访问
默认情况下,WebViews 允许文件访问。此功能由 setAllowFileAccess()
方法控制,自 Android API 级别 3(Cupcake 1.5)以来可用。具有 android.permission.READ_EXTERNAL_STORAGE 权限的应用可以使用文件 URL 方案(file://path/to/file
)从外部存储读取文件。
已弃用的功能:来自 URL 的通用和文件访问
来自文件 URL 的通用访问:此已弃用功能允许来自文件 URL 的跨源请求,由于潜在的 XSS 攻击,构成了重大安全风险。默认设置在针对 Android Jelly Bean 及更高版本的应用中被禁用(
false
)。要检查此设置,请使用
getAllowUniversalAccessFromFileURLs()
。要修改此设置,请使用
setAllowUniversalAccessFromFileURLs(boolean)
。来自文件 URL 的文件访问:此功能也已弃用,控制来自其他文件方案 URL 的内容访问。与通用访问一样,其默认设置为禁用,以增强安全性。
使用
getAllowFileAccessFromFileURLs()
检查,使用setAllowFileAccessFromFileURLs(boolean)
设置。
安全文件加载
为了在仍然访问资产和资源的同时禁用文件系统访问,使用 setAllowFileAccess()
方法。对于 Android R 及更高版本,默认设置为 false
。
使用
getAllowFileAccess()
检查。使用
setAllowFileAccess(boolean)
启用或禁用。
WebViewAssetLoader
WebViewAssetLoader 类是加载本地文件的现代方法。它使用 http(s) URL 访问本地资产和资源,符合同源策略,从而促进 CORS 管理。
loadUrl
这是一个常用函数,用于在 webview 中加载任意 URL:
Ofc,潜在攻击者绝不应该能够 控制应用程序将要加载的 URL。
JavaScript 和 Intent Scheme 处理
JavaScript:在 WebViews 中默认禁用,可以通过
setJavaScriptEnabled()
启用。建议谨慎操作,因为在没有适当保护的情况下启用 JavaScript 可能会引入安全漏洞。Intent Scheme:WebViews 可以处理
intent
scheme,如果管理不当,可能会导致漏洞。一个示例漏洞涉及一个暴露的 WebView 参数 "support_url",可以被利用来执行跨站脚本 (XSS) 攻击。
使用 adb 的利用示例:
Javascript Bridge
Android 提供了一项功能,使得 JavaScript 在 WebView 中能够调用 本地 Android 应用程序功能。这通过利用 addJavascriptInterface
方法实现,该方法将 JavaScript 与本地 Android 功能集成,称为 WebView JavaScript bridge。需要谨慎,因为此方法允许 WebView 中的所有页面访问注册的 JavaScript 接口对象,如果通过这些接口暴露敏感信息,则会带来安全风险。
对于目标 Android 版本低于 4.2 的应用程序,必须极其谨慎,因为存在一个漏洞,允许通过恶意 JavaScript 进行远程代码执行,利用反射进行攻击。
Implementing a JavaScript Bridge
JavaScript 接口 可以与本地代码交互,如示例所示,其中一个类方法被暴露给 JavaScript:
JavaScript Bridge 通过向 WebView 添加接口来启用:
通过 JavaScript 的潜在利用,例如,通过 XSS 攻击,可以调用暴露的 Java 方法:
为了降低风险,限制 JavaScript 桥接使用 仅限于随 APK 打包的代码,并防止从远程源加载 JavaScript。对于旧设备,将最低 API 级别设置为 17。
基于反射的远程代码执行 (RCE)
一种文档化的方法允许通过反射执行特定有效负载来实现 RCE。然而,
@JavascriptInterface
注解防止未经授权的方法访问,从而限制了攻击面。
远程调试
远程调试 可以通过 Chrome 开发者工具 实现,允许在 WebView 内容中进行交互和任意 JavaScript 执行。
启用远程调试
可以通过以下方式为应用程序中的所有 WebView 启用远程调试:
根据应用程序的可调试状态有条件地启用调试:
导出任意文件
演示使用 XMLHttpRequest 导出任意文件:
参考文献
Last updated