实现 Ambient 权能

借助此类权能,Linux 进程可以舍弃大多数类似于 root 的权限,同时保留执行其权能所需的权限。此类权能的原始实现使得经过 fork + exec 处理的进程无法继承权能,除非正在执行的文件已配置文件权能。而文件权能会带来安全风险,这是因为任何进程只要执行具有文件权能的文件,则一律会获得这些权能。

Ambient 权能允许系统服务在其 .rc 文件中配置各项权能,从而将其所有配置放入单个文件中,而不必将权能配置单独放入 fs_config.c 文件中。

参考实现

参考实现是 Android 通用内核 https://android.googlesource.com/kernel/common/

必需的补丁程序

必需的补丁程序已反向移植到所有相关的 Android 通用内核分支。

主要 Ambient 权能补丁程序 https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=58319057b7847667f0c9585b9de0e8932b0fdb08 已反向移植到:

一个小的安全修复程序 https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b7f76ea2ef6739ee484a165ffbac98deb855d3d3 已反向移植到:

版本低于 3.18 的内核所需的内存泄漏修复程序 https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=6d6f3328422a3bc56b0d8dd026a5de845d2abfa7 已反向移植到:

验证

仿生单元测试包括针对 Ambient 权能的单元测试。此外,如果在 Android init 中为某项服务使用“capabilities”关键字,然后检查该服务是否获得了预期的权能,则可以对 Ambient 权能进行运行时测试。