環境能力

這些功能允許 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=b7f76ea2ef6739ee484a165ffbac98deb855d3d3d39ee484a165ffbac98deb855d3d3d3

驗證

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