Ambient 权能

权能允许 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 已向后移植到:

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

验证

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