環境能力

功能允許 Linux 進程放棄大多數類似 root 的特權,同時保留它們執行其功能所需的特權子集。功能的原始實現使 fork+exec 的進程無法繼承功能,除非正在執行的文件配置了文件功能。反過來,文件功能會帶來安全風險,因為任何執行具有文件功能的文件的進程都將能夠獲得這些功能。

環境功能允許由 init 啟動的系統服務在其.rc文件中配置功能,將配置放入單個文件中,而不是在fs_config.c文件中拆分配置。這意味著對於由 init 啟動的任何服務,您可以使用與該服務關聯的.rc文件來配置該服務的功能。

環境功能是為 init 啟動的服務設置功能的首選機制(此方法將服務配置的所有方面保存在單個.rc文件中)。我們建議使用環境功能,而不是使用config.fs文件中的 caps 部分來配置文件系統功能

init 未啟動的服務設置功能時,請繼續使用fs_config.c配置文件系統功能。

啟用環境功能

要為給定服務啟用環境功能,請使用 init 中的capabilities關鍵字。有關當前 init 語言的詳細信息,請參閱init README.md

例如,要為 AOSP 服務wificond啟用環境功能, 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 通用內核分支。

主要環境功能補丁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已被反向移植到:

驗證

仿生單元測試包括環境能力的單元測試。除此之外,在Android init 中為服務使用“capabilities”關鍵字,然後檢查該服務是否獲得了預期的功能,將允許對該功能進行運行時測試。