借助此类权能,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”关键字,然后检查该服务是否获得了预期的权能,则可以对该功能进行运行时测试。