Insecure Filesystem Access
不安全的文件系统访问
描述
应用程序使用不安全的权限(全局可读或全局可写)处理文件,或者将具有弱权限的外部存储设备(如SD卡)作为目标。
根据Android的安全性设计理念,文件仅用于实现信息持久化和临时保存(缓存),原则上应设为私有。应用程序之间的信息交换不应直接访问文件,而应通过Content Provider或Service等应用程序间联动系统进行交换。通过这种方式,可以实现应用程序间的访问控制。
全局可读权限
如果全局可读(World readable)文件存储了敏感信息(例如银行账户对账单或会话密钥存储文件),并且被未经授权的第三方访问,则可能会带来风险。
全局可写权限
如果全局可写(World writable)文件用于执行敏感操作(如URL列表或会话参数),则可能会带来风险。
外部存储
在目标平台为Android 9(API级别28)及更低版本的应用中,使用getExternalFilesDir()访问外部存储会授予其他应用读取和修改这些文件的权限。
对于运行Android 10(API级别29)或更高版本的设备,应用程序访问外部存储中文件的方法已发生改变。对于目标平台为Android 10的应用程序,系统默认提供过滤视图以显示外部存储中的文件。每个应用程序都可以将应用文件保存在特定于应用的目录中,并且始终对创建的文件具有读写访问权限,因此无需声明权限。
建议
-
原则上文件必须创建为私有文件:无论要存储的信息内容是什么,文件原则上应设置为私有。从Android安全性设计的角度来看,信息的交换及其访问控制应在Android系统中进行,如Content Provider和Service等;如果由于某种原因无法实现,则应考虑使用文件访问权限作为替代方法。
-
绝不能创建允许其他应用程序读/写访问的文件:当允许其他应用程序读/写文件时,无法控制文件中存储的信息。因此,从安全性和功能/设计角度来看,都不应考虑使用全局读写文件来共享信息。
-
使用外部设备(如SD卡)中存储的文件应为最低要求:将文件存储在外部存储设备(如SD卡)中,在安全性及功能方面均存在潜在问题。
- 原则上,敏感信息不应保存在外部存储设备的文件中。
- 如果敏感信息保存在外部存储设备的文件中,则应予以加密。
- 如果在外部存储设备的文件中保存了被其他应用或用户篡改会产生麻烦的信息,则应使用电子签名进行保存。
- 在读取外部存储设备中的文件时,应在验证所读取数据的安全性后再使用数据。
- 应用程序在设计时应假设外部存储设备中的文件可能随时被删除。
-
全局访问权限仅应在绝对需要时使用。建议使用其他应用程序间数据共享方法,而不是使用不安全的权限共享文件。
-
应用程序在设计时应考虑到文件的作用域。
链接
标准
- OWASP_MASVS_L1:
- MSTG_STORAGE_2
- OWASP_MASVS_L2:
- MSTG_STORAGE_2
- CWE_TOP_25:
- CWE_276
- PCI_STANDARDS:
- REQ_2_2
- REQ_6_2
- REQ_6_3
- REQ_7_3
- REQ_11_3
- OWASP_MASVS_v2_1:
- MASVS_STORAGE_2
- SOC2_CONTROLS:
- CC_2_1
- CC_4_1
- CC_6_1
- CC_7_1
- CC_7_2
- CC_7_4
- CC_7_5
- HIPAA_CONTROLS:
- SECURITY221
- SECURITY212
- SECURITY213