Ambient 权能

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

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 已反向移植到:

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

验证

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