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。
- 攻击者将恶意 HTML 文件注入到设备中(通过网络钓鱼或其他漏洞利用),放置在攻击者*知道* WebView 将会访问的位置(例如,通过逆向工程)。例如,用于显示应用程序条款和条件的 HTML 文件。
- 由于
setAllowFileAccess(true)
,WebView 可以加载恶意文件。 - 由于
setJavaScriptEnabled(true)
和setAllowFileAccessFromFileURLs(true)
,恶意文件中的 JavaScript(在file://
上下文中运行)能够使用file://
URL 访问其他本地文件。 - 攻击者控制的脚本将设备中的敏感数据泄露到外部服务器。
**注意 1**:必须将 setAllowFileAccessFromFileURLs
或 setAllowUniversalAccessFromFileURLs
设置为 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
的值**。
步骤¶
- 确定应用程序的
minSdkVersion
。 - 使用 semgrep 等工具搜索以下引用
WebView
类。WebSettings
类。setJavaScriptEnabled
方法。WebSettings
类中的setAllowFileAccess
、setAllowFileAccessFromFileURLs
和setAllowUniversalAccessFromFileURLs
方法。
请注意,在这种情况下,**缺少对 setAllow*
方法的引用尤其重要**,必须捕获,因为它可能意味着应用程序正在使用默认值,而在某些情况下,默认值是不安全的。因此,强烈建议尝试识别应用程序中的每个 WebView 实例。
观察¶
输出应包含使用上述方法的 WebView 实例列表。
评估¶
此测试的评估基于不同 Android 版本中的 API 行为。
失败
如果发生以下情况,测试将失败
setJavaScriptEnabled
显式设置为true
。setAllowFileAccess
显式设置为true
(或者当minSdkVersion
< 30 时根本未使用,继承默认值true
)。setAllowFileAccessFromFileURLs
或setAllowUniversalAccessFromFileURLs
之一显式设置为true
(或者当minSdkVersion
< 16 时根本未使用,继承默认值true
)。
通过
如果发生以下情况,测试将通过
setJavaScriptEnabled
显式设置为false
。setAllowFileAccess
显式设置为false
(或者当minSdkVersion
>= 30 时根本未使用,继承默认值false
)。setAllowFileAccessFromFileURLs
和setAllowUniversalAccessFromFileURLs
都显式设置为false
(或者当minSdkVersion
>= 16 时根本未使用,继承默认值false
)。