权能允许 Linux 进程舍弃大多数类似于 root 的权限,同时保留执行其功能所需的部分权限。权能的原始实现使得经过创建分支和执行的进程无法继承权能,除非已经为正在执行的文件配置了文件权能。文件权能反过来又会带来安全风险,因为任何进程只要执行具有文件权能的文件,就能够获得这些权能。
Ambient 权能允许由 init 启动的系统服务在其 .rc
文件中配置权能,从而将配置放入单个文件中,而不是在 fs_config.c
文件中拆分配置。这意味着,对于由 init 启动的任何服务,您都可以使用与服务关联的 .rc
文件为该服务配置权能。
Ambient 权能是为由 init 启动的服务设置权能的首选机制(此方法可将服务配置的所有方面保存在单个 .rc
文件中)。我们建议您使用 Ambient 权能,而不是在 config.fs
文件中使用 caps 部分配置文件系统权能。
在为并非由 init 启动的服务设置权能时,请继续使用 fs_config.c
来配置文件系统权能。
启用 Ambient 权能
如需为给定的服务启用 Ambient 权能,请在 init 中使用 capabilities
关键字。如需详细了解当前的 init 语言,请参阅 init README.md。
例如,如需为 AOSP 的 wificond
服务启用 Ambient 权能,wificond
服务的 .rc 文件会设置相应的用户和群组,并使用 capabilities
关键字为该服务提供指定的权能:
service wificond /system/bin/wificond class main user wifi group wifi net_raw net_admin capabilities NET_RAW NET_ADMIN
参考实现
参考实现是 Android 通用内核 https://android.googlesource.com/kernel/common/
必需的补丁
必需的补丁程序已反向移植到所有相关的 Android 通用内核分支。
主要 Ambient 权能补丁 https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=58319057b7847667f0c9585b9de0e8932b0fdb08 已向后移植到:
- android-3.18:
- android-4.1:
一个小的安全修复程序 https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b7f76ea2ef6739ee484a165ffbac98deb855d3d3 已反向移植到:
- android-3.18:
- android-4.1:
验证
仿生单元测试包括针对 Ambient 权能的单元测试。除此之外,如果在 Android init 中对某项服务使用了“capabilities”关键字,然后检查该服务是否获得了预期的权能,则可以对此功能进行运行时测试。