跳过内容

MASWE-0007: 敏感数据以未加密形式存储在无需用户交互的共享存储中

Beta 版内容

此内容处于 beta 版,仍在积极开发中,因此随时可能发生变化(例如结构、ID、内容、URL 等)。

发送反馈

概述

应用程序经常选择将数据存储在外部存储中,因为它容量更大。然而,这种便利性带来了潜在的安全缺陷。一旦恶意应用程序获得相关权限,它就可以在未经用户同意或交互的情况下随时访问这些数据。此外,SD 卡等外部存储可以被恶意行为者物理移除并读取。即使外部存储由系统模拟,风险也可能源于不正确的文件权限或滥用用于保存文件的 API。在这种情况下,文件容易受到未经授权的访问、修改和删除,从而对应用程序构成安全威胁。

如果开发者需要更高的隐私和安全性,可以考虑切换到私有存储(Private Storage)或需要用户交互的共享存储(Shared Storage Requiring User Interaction)。但是,如果外部存储最适合应用程序,那么加密存储在外部存储中的数据是一种良好的实践。您可以在下面找到与使用外部存储相关的潜在安全影响和缓解措施。

影响

  • 机密性丢失:攻击者可以提取外部存储的敏感数据,例如个人信息以及照片、文档和音频文件等多媒体内容。

  • 安全材料丢失:攻击者可以提取密码、加密密钥和会话令牌,以促进额外的攻击,例如身份盗窃或账户接管。

  • 应用程序行为修改:攻击者可以篡改应用程序使用的数据,从而改变应用程序的逻辑。例如,他们可以修改描述高级功能状态的数据库,或者注入恶意负载以启用进一步的攻击,如 SQL 注入和路径遍历。

  • 下载代码修改:应用程序可以从互联网下载新功能,并在将其加载到进程之前将可执行代码存储在外部存储中。攻击者可以在应用程序使用此代码之前对其进行修改。

引入方式

这种威胁主要针对 Android 设备,因为它们允许使用外部存储。即使设备缺少物理外部存储,Android 也会模拟它以提供对外部存储 API 的访问。

  • 数据未加密存储:敏感数据以未加密形式存储在外部存储中。
  • 硬编码加密密钥:敏感数据在外部存储中被加密和存储,但密钥是硬编码在应用程序内部的。
  • 加密密钥存储在文件系统上:敏感数据在外部存储中被加密和存储,但密钥是与其一起存储或存储在另一个易于访问的位置。
  • 使用的加密不足:敏感数据被加密,但所使用的加密被认为不够强大。
  • 加密密钥重用:加密密钥在单个用户拥有的两台设备之间共享,从而可以在这些设备之间的外部存储中进行数据克隆。

在 iOS 上,与桌面操作系统或 Android 相比,应用程序无法直接写入或读取任意位置。iOS 维护严格的沙盒规则,这意味着应用程序只能访问其自己的沙盒文件目录。

缓解措施

存储在外部存储中的敏感数据应进行加密,并且用于数据加密的任何密钥(如果可用)应由设备的硬件支持密钥库保护。强烈不建议在应用程序内部硬编码加密密钥。您还可以考虑将文件存储在 私有应用沙盒或内部存储 中,并使用 Android 的 EncryptedFile API 包装器进行文件加密

警告

包括 EncryptedFileEncryptedSharedPreferences 类的 Jetpack 安全加密库 已被 弃用。然而,由于官方替代方案尚未发布,我们建议在有替代方案之前继续使用这些类。

测试

MASTG-TEST-0201: 运行时使用 API 访问外部存储 MASTG-TEST-0200: 写入外部存储的文件 MASTG-TEST-0202: 访问外部存储的 API 和权限引用