Android 平台利用 Linux 基于用户的保护机制来识别和隔离应用资源。这可以将应用彼此隔离,并保护应用和系统免受恶意应用的侵害。为此,Android 会为每个 Android 应用分配一个独一无二的用户 ID (UID),并在其自己的进程中运行该应用。
Android 使用 UID 设置内核级应用沙盒。内核通过标准 Linux 设施(例如分配给应用的用户 ID 和群组 ID)在进程级别强制执行应用与系统之间的安全。默认情况下,应用无法彼此交互,并且对操作系统的访问权限有限。如果应用 A 尝试执行恶意操作(例如,读取应用 B 的数据或在未获得许可的情况下拨打电话),系统会阻止其执行此类操作,因为它没有相应的默认用户权限。该沙盒很简单、可审核,并且基于使用了数十年的 UNIX 风格的进程用户分离和文件权限。
由于应用沙盒位于内核中,因此这种安全模式扩展到了原生代码和操作系统应用。内核之上的所有软件(例如操作系统库、应用框架、应用运行时和所有应用)都在应用沙盒中运行。在某些平台上,开发者会受到特定开发框架、API 集或语言的约束。在 Android 上,对如何编写应用以强制执行安全性没有任何限制;在这方面,原生代码与解释型代码一样都在沙盒中运行。
保护措施
通常,要突破配置正确的设备中的应用沙盒,必须破坏 Linux 内核的安全性。但是,与其他安全功能类似,强制执行应用沙盒的各个保护措施并非坚不可摧,因此深度防御对于防止单个漏洞导致操作系统或其他应用受到攻击至关重要。
Android 依赖于许多保护措施来强制执行应用沙盒。这些强制措施是随着时间的推移而引入的,并且大大加强了最初基于 UID 的自主访问控制 (DAC) 沙盒。以前的 Android 版本包含以下保护措施
- 在 Android 5.0 中,SELinux 提供了系统与应用之间的强制访问控制 (MAC) 分离。但是,所有第三方应用都在相同的 SELinux 上下文中运行,因此应用间隔离主要由 UID DAC 强制执行。
- 在 Android 6.0 中,SELinux 沙盒扩展到跨每个物理用户的边界隔离应用。此外,Android 还为应用数据设置了更安全的默认值:对于
targetSdkVersion >= 24
的应用,应用主目录的默认 DAC 权限从 751 更改为 700。这为私有应用数据提供了更安全的默认值(尽管应用可以替换这些默认值)。 - 在 Android 8.0 中,所有应用都设置为使用
seccomp-bpf
过滤器运行,该过滤器限制了应用可以使用的系统调用,从而加强了应用/内核边界。 - 在 Android 9 中,所有
targetSdkVersion >= 28
的非特权应用都必须在各自的 SELinux 沙盒中运行,从而在每个应用的基础上提供 MAC。这种保护措施改进了应用分离,防止了替换安全默认值,并且(最重要的是)防止应用使其数据可供全世界访问。 - 在 Android 10 中,应用对文件系统的原始视图有限,无法直接访问 /sdcard/DCIM 等路径。但是,应用保留对其软件包特定路径的完全原始访问权限,这些路径由任何适用的方法返回,例如 Context.getExternalFilesDir()。
文件共享指南
将应用数据设置为可供全世界访问是一种不良的安全做法。访问权限授予所有人,并且无法将访问权限限制为仅限预期接收者。这种做法导致了信息泄露和混乱的副手漏洞,并且是针对具有敏感数据(例如电子邮件客户端)的应用的恶意软件最喜欢的目标。在 Android 9 及更高版本中,对于 targetSdkVersion>=28
的应用,明确禁止以这种方式共享文件。
在共享文件时,请使用以下指南,而不是使应用数据可供全世界访问
- 如果您的应用需要与其他应用共享文件,请使用内容提供程序。内容提供程序以适当的粒度共享数据,并且没有全世界可访问的 UNIX 权限的许多缺点(有关详细信息,请参阅内容提供程序基础知识)。
- 如果您的应用具有确实应该可供全世界访问的文件(例如照片),则它们必须是媒体特定的(仅限照片、视频和音频文件),并且使用 MediaStore 类进行存储。(有关如何添加媒体项的更多详细信息,请参阅从共享存储空间访问媒体文件。)
存储空间运行时权限控制通过 MediaStore 对强类型集合的访问。对于访问弱类型文件(例如 PDF)和 MediaStore.Downloads 类,应用必须使用 Intent(例如 ACTION_OPEN_DOCUMENT
Intent)。
要启用 Android 10 行为,请使用 requestLegacyExternalStorage
清单属性,并遵循应用权限最佳实践。
- 对于以 Android 9(及更低版本)为目标平台的应用,清单标志默认值为
true
。 - 对于以 Android 10 为目标平台的应用,默认值为 false。要暂时选择不使用以 Android 10 为目标平台的应用中的过滤存储视图,请将清单标志的值设置为
true
。 - 使用受限权限,安装程序允许许可的应用使用非沙盒存储空间。未列入许可名单的应用将在沙盒中运行。