跳过内容

MASTG-TEST-0250: 引用 WebView 中的内容提供者访问

概述

此测试检查 WebView 中对内容提供者访问的引用,该访问默认启用,可以使用 WebSettings 类中的 setAllowContentAccess 方法禁用。 如果配置不当,可能会引入安全风险,例如未经授权的文件访问和数据泄露。

JavaScript 代码将有权访问设备上的任何内容提供者,例如

  • 由应用程序声明的, 即使它们未导出
  • 由其他应用程序声明的, 仅当它们已导出 并且它们没有遵循建议的 最佳实践 来限制访问时。

有关 setAllowContentAccess 方法、可访问的特定文件以及可以访问这些文件的条件的更多信息,请参阅 WebView 内容提供者访问

攻击场景示例

假设一个银行应用程序使用 WebView 来显示动态内容。 开发人员没有明确设置 setAllowContentAccess 方法,因此默认为 true。 此外,WebView 中启用了 JavaScript,以及 setAllowUniversalAccessFromFileURLs 方法。

  1. 攻击者利用漏洞(例如 XSS 缺陷)将恶意 JavaScript 注入到 WebView 中。 这可能通过 WebView 加载的未经适当验证的受损或恶意链接发生。
  2. 由于 setAllowUniversalAccessFromFileURLs(true),恶意 JavaScript 可以向 content:// URI 发出请求,以读取本地存储的文件或内容提供者公开的数据。 即使是来自应用程序的未导出的内容提供者也可以被访问,因为恶意代码与受信任的代码在同一进程和同一起源中运行。
  3. 攻击者控制的脚本将设备上的敏感数据泄露到外部服务器。

注意 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:// 检索文件内容将会失败。

步骤

  1. 使用像 semgrep 这样的工具来搜索对以下内容的引用
    • WebView 类。
    • WebSettings 类。
    • setJavaScriptEnabled 方法。
    • 来自 WebSettings 类的 setAllowContentAccess 方法。
    • 来自 WebSettings 类的 setAllowUniversalAccessFromFileURLs 方法。
  2. 获取在应用程序的 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

缓解措施

演示

MASTG-DEMO-0029:使用 semgrep 允许内容访问的 WebViews 的使用