這些功能允許 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 通用核心分支。
- 安卓-3.18:
- 安卓-4.1:
- 安卓-3.18:
- 安卓-4.1:
驗證
仿生單元測試包括環境能力的單元測試。除此之外,在 Android init 中為服務使用「capability」關鍵字,然後檢查該服務是否獲得了預期的功能,將允許對此功能進行運行時測試。