功能允許 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已被反向移植到:
- 安卓3.18:
- 安卓4.1:
一個小的安全修復https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b7f76ea2ef6739ee484a165ffbac98deb855d3d3已被反向移植到:
- 安卓3.18:
- 安卓4.1:
驗證
仿生單元測試包括環境能力的單元測試。除此之外,在Android init 中為服務使用“capabilities”關鍵字,然後檢查該服務是否獲得了預期的功能,將允許對該功能進行運行時測試。