跳过内容

MASTG-TEST-0252: 引用 WebView 中的本地文件访问

概述

此测试检查对 Android WebView 使用的 WebSettings 类中的方法的引用,这些方法允许从各种来源加载内容,包括本地文件。如果配置不当,这些方法可能会引入安全风险,例如未经授权的文件访问和数据泄露。这些方法是

  • setAllowFileAccess:允许 WebView 从应用程序的内部存储或外部存储加载本地文件。
  • setAllowFileAccessFromFileURLs:允许本地文件中的 JavaScript 访问其他本地文件。
  • setAllowUniversalAccessFromFileURLs:删除任何跨域限制,允许该 JavaScript 跨域读取数据。无论此设置如何,JavaScript **始终可以将数据发送到任何来源**(例如,通过 POST);此设置仅影响读取数据(例如,代码不会收到对 POST 请求的响应,但数据仍会被发送)。

当这些设置组合在一起时,它们可以启用一种攻击,其中恶意 HTML 文件获得提升的权限,访问本地资源,并通过网络泄露数据,从而有效地绕过通常由同源策略强制执行的安全边界。

即使这些方法具有安全默认值并且**在 Android 10(API 级别 29)及更高版本中已弃用**,它们仍然可以显式设置为 true,或者在较旧版本的 Android 上运行的应用中使用其不安全的默认值(由于它们的 minSdkVersion)。

有关这些方法(默认值、弃用状态、安全隐患)、可以访问的特定文件以及可以访问的条件,请参阅Android WebView 本地文件访问设置

示例攻击场景:

假设一个银行应用程序使用 WebView 显示动态内容,并且开发人员启用了所有三个不安全的设置。此外,WebView 中启用了 JavaScript。

  1. 攻击者将恶意 HTML 文件注入到设备中(通过网络钓鱼或其他漏洞利用),放置在攻击者*知道* WebView 将会访问的位置(例如,通过逆向工程)。例如,用于显示应用程序条款和条件的 HTML 文件。
  2. 由于 setAllowFileAccess(true),WebView 可以加载恶意文件。
  3. 由于 setJavaScriptEnabled(true)setAllowFileAccessFromFileURLs(true),恶意文件中的 JavaScript(在 file:// 上下文中运行)能够使用 file:// URL 访问其他本地文件。
  4. 攻击者控制的脚本将设备中的敏感数据泄露到外部服务器。

**注意 1**:必须将 setAllowFileAccessFromFileURLssetAllowUniversalAccessFromFileURLs 设置为 true,攻击才能生效。如果两个设置都设置为 false,则会在 logcat 中显示以下错误

[INFO:CONSOLE(0)] "Access to XMLHttpRequest at 'file:///data/data/org.owasp.mastestapp/files/api-key.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)
[INFO:CONSOLE(31)] "File content sent successfully.", source: file:/// (31)

服务器将不会收到文件内容

[*] Received POST data from 127.0.0.1:

Error reading file: 0

**注意 2**:如 Android 文档所示,如果 allowUniversalAccessFromFileURLs=true,则**忽略 setAllowFileAccessFromFileURLs 的值**

步骤

  1. 确定应用程序的 minSdkVersion
  2. 使用 semgrep 等工具搜索以下引用
    • WebView 类。
    • WebSettings 类。
    • setJavaScriptEnabled 方法。
    • WebSettings 类中的 setAllowFileAccesssetAllowFileAccessFromFileURLssetAllowUniversalAccessFromFileURLs 方法。

请注意,在这种情况下,**缺少对 setAllow* 方法的引用尤其重要**,必须捕获,因为它可能意味着应用程序正在使用默认值,而在某些情况下,默认值是不安全的。因此,强烈建议尝试识别应用程序中的每个 WebView 实例。

观察

输出应包含使用上述方法的 WebView 实例列表。

评估

此测试的评估基于不同 Android 版本中的 API 行为

失败

如果发生以下情况,测试将失败

  • setJavaScriptEnabled 显式设置为 true
  • setAllowFileAccess 显式设置为 true(或者当 minSdkVersion < 30 时根本未使用,继承默认值 true)。
  • setAllowFileAccessFromFileURLssetAllowUniversalAccessFromFileURLs 之一显式设置为 true(或者当 minSdkVersion < 16 时根本未使用,继承默认值 true)。

通过

如果发生以下情况,测试将通过

  • setJavaScriptEnabled 显式设置为 false
  • setAllowFileAccess 显式设置为 false(或者当 minSdkVersion >= 30 时根本未使用,继承默认值 false)。
  • setAllowFileAccessFromFileURLssetAllowUniversalAccessFromFileURLs 都显式设置为 false(或者当 minSdkVersion >= 16 时根本未使用,继承默认值 false)。

缓解措施

演示

MASTG-DEMO-0032:使用 semgrep 允许本地文件访问的 WebView 的使用