MASTG-TEST-0250: 引用 WebView 中的内容提供者访问
概述¶
此测试检查 WebView 中对内容提供者访问的引用,该访问默认启用,可以使用 WebSettings
类中的 setAllowContentAccess
方法禁用。 如果配置不当,可能会引入安全风险,例如未经授权的文件访问和数据泄露。
JavaScript 代码将有权访问设备上的任何内容提供者,例如
- 由应用程序声明的, 即使它们未导出。
- 由其他应用程序声明的, 仅当它们已导出 并且它们没有遵循建议的 最佳实践 来限制访问时。
有关 setAllowContentAccess
方法、可访问的特定文件以及可以访问这些文件的条件的更多信息,请参阅 WebView 内容提供者访问。
攻击场景示例
假设一个银行应用程序使用 WebView 来显示动态内容。 开发人员没有明确设置 setAllowContentAccess
方法,因此默认为 true
。 此外,WebView 中启用了 JavaScript,以及 setAllowUniversalAccessFromFileURLs
方法。
- 攻击者利用漏洞(例如 XSS 缺陷)将恶意 JavaScript 注入到 WebView 中。 这可能通过 WebView 加载的未经适当验证的受损或恶意链接发生。
- 由于
setAllowUniversalAccessFromFileURLs(true)
,恶意 JavaScript 可以向content://
URI 发出请求,以读取本地存储的文件或内容提供者公开的数据。 即使是来自应用程序的未导出的内容提供者也可以被访问,因为恶意代码与受信任的代码在同一进程和同一起源中运行。 - 攻击者控制的脚本将设备上的敏感数据泄露到外部服务器。
注意 1: 我们不考虑 minSdkVersion
,因为无论 Android 版本如何,setAllowContentAccess
默认为 true
。
注意 2: 提供程序的 android:grantUriPermissions
属性在这种情况下无关紧要,因为它不影响应用程序本身访问其自己的内容提供者。 它允许其他应用程序临时访问提供程序中的 URI,即使设置了诸如 permission
属性或 android:exported="false"
等限制。 此外,如果应用程序使用 FileProvider
,则必须按照 定义 将 android:grantUriPermissions
属性设置为 true
(否则您将收到 SecurityException: Provider must grant uri permissions"
)。
注意 3: allowUniversalAccessFromFileURLs
在攻击中至关重要,因为它放宽了默认限制,允许从 file://
加载的页面访问来自任何来源的内容,包括 content://
URI。
如果未启用此设置,则以下错误将出现在 logcat
中
[INFO:CONSOLE(0)] "Access to XMLHttpRequest at 'content://org.owasp.mastestapp.provider/sensitive.txt'
from origin 'null' has been blocked by CORS policy: Cross origin requests are only supported
for protocol schemes: http, data, chrome, https, chrome-untrusted.", source: file:/// (0)
虽然对外部服务器的 fetch
请求仍然有效,但通过 content://
检索文件内容将会失败。
步骤¶
- 使用像 semgrep 这样的工具来搜索对以下内容的引用
WebView
类。WebSettings
类。setJavaScriptEnabled
方法。- 来自
WebSettings
类的setAllowContentAccess
方法。 - 来自
WebSettings
类的setAllowUniversalAccessFromFileURLs
方法。
- 获取在应用程序的 AndroidManifest.xml 文件中声明的所有内容提供者。
观察¶
输出应包含
- WebView 实例的列表,包括以下方法及其参数
setAllowContentAccess
setJavaScriptEnabled
setAllowUniversalAccessFromFileURLs
- 在应用程序的 AndroidManifest.xml 文件中声明的内容提供者列表。
评估¶
失败
如果以下所有条件都为真,则测试失败
setJavaScriptEnabled
显式设置为true
。setAllowContentAccess
显式设置为true
或根本不使用(继承默认值true
)。setAllowUniversalAccessFromFileURLs
方法显式设置为true
。
您应该使用在观察步骤中获得的内容提供者列表来验证它们是否处理敏感数据。
注意: 将 setAllowContentAccess
方法设置为 true
本身并不代表安全漏洞,但它可以与其他漏洞结合使用,以扩大攻击的影响。 因此,建议在应用程序不需要访问内容提供者时,将其显式设置为 false
。
通过
如果以下任何条件为真,则测试通过
setJavaScriptEnabled
显式设置为false
或根本不使用(继承默认值false
)。setAllowContentAccess
方法显式设置为false
。setAllowUniversalAccessFromFileURLs
方法显式设置为false
。