功能可讓 Linux 程序捨棄大部分類似根目錄的權限,同時保留執行功能所需的權限子集。在原始的功能實作中,除非執行的檔案已設定檔案功能,否則 fork+exec 的程序無法繼承功能。檔案功能本身會帶來安全風險,因為執行檔案的任何程序都可能取得這些功能。
透過環境功能,由 init 啟動的系統服務可在 .rc
檔案中設定功能,將設定匯入單一檔案,而非在 fs_config.c
檔案中分割設定。也就是說,對於 init 啟動的任何服務,您都可以使用與該服務相關聯的 .rc
檔案,設定該服務的功能。
對於由 init 啟動的服務,建議使用 Ambient 功能設定功能 (這個方法會將服務設定的所有層面保留在單一 .rc
檔案中)。建議您使用環境功能,而不是在 config.fs
檔案中,使用 caps 區段設定檔案系統功能。
為並非由 init 啟動的服務設定功能時,請繼續使用 fs_config.c
設定檔案系統功能。
啟用微光功能
如要為特定服務啟用環境功能,請在 init 中使用 capabilities
關鍵字。如要瞭解目前的初始化語言詳細資料,請參閱 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 已回溯移植至:
- 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」關鍵字,然後檢查服務是否取得預期功能,即可在執行階段測試這項功能。