功能允许 Linux 进程在保留执行其功能所需的权限子集的同时,放弃大多数类似 root 用户的权限。功能的原始实现使得 fork+exec 的进程无法继承功能,除非被执行的文件配置了文件功能。反过来,文件功能会带来安全风险,因为任何执行具有文件功能的文件的进程都可以获得这些功能。
环境功能允许由 init 启动的系统服务在其 .rc
文件中配置功能,从而将配置引入单个文件,而不是将配置拆分到 fs_config.c
文件中。这意味着对于任何由 init 启动的服务,您都可以使用与该服务关联的 .rc
文件来配置该服务的功能。
环境功能是为 init 启动的服务设置功能的首选机制(此方法将服务配置的所有方面都保留在单个 .rc
文件中)。我们建议使用环境功能而不是使用 caps 部分配置文件系统功能在 config.fs
文件中。
为非 init 启动的服务设置功能时,请继续使用 fs_config.c
配置文件系统功能。
启用环境功能
要为给定服务启用环境能力,请在 init 中使用 capabilities
关键字。有关当前 init 语言的详细信息,请参阅 init README.md。
例如,要为 AOSP 服务 wificond
启用环境能力,.rc 文件 for the wificond
服务会设置适当的用户和群组,并使用 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 通用内核分支。
主要的环境能力补丁 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
验证
Bionic 单元测试 包括针对环境能力的单元测试。除此之外,在 Android init 中为服务使用“capabilities”关键字,然后检查服务是否获得预期的能力,将允许对此功能进行运行时测试。