作為 Android安全模型的一部分,Android 使用安全增強 Linux (SELinux) 對所有進程實施強制存取控制 (MAC),甚至是使用 root/超級使用者權限(Linux 功能)運行的進程。許多公司和組織都為 Android 的SELinux 實作做出了貢獻。借助 SELinux,Android 可以更好地保護和限制系統服務、控制對應用程式資料和系統日誌的存取、減少惡意軟體的影響,並保護使用者免受行動裝置上潛在程式碼缺陷的影響。
SELinux 遵循預設拒絕原則:拒絕任何未明確允許的行為。 SELinux 可以在兩種全域模式下運作:
- 寬容模式,其中記錄權限拒絕但不強制執行。
- 強制模式,其中記錄並強制執行權限拒絕。
Android 包含強制模式下的 SELinux 以及預設在 AOSP 上運行的相應安全性原則。在強制模式下,禁止的操作會被阻止,所有嘗試的違規行為都會被核心記錄到dmesg
和logcat
。開發時,您應該使用這些錯誤來完善您的軟體和 SELinux 策略,然後再執行它們。有關更多詳細信息,請參閱實施 SELinux 。
SELinux 也支援每網域授權模式,在該模式下,特定網域(流程)可以被許可,同時將系統的其餘部分置於全域強制模式。域只是標識安全性策略中的一個進程或一組進程的標籤,其中標有相同域的所有進程都受到安全性策略的同等對待。每個網域的授權模式允許 SELinux 增量應用到系統中不斷增加的部分以及新服務的策略開發(同時保持系統的其餘部分強制執行)。
背景
Android 安全模型部分基於應用程式沙箱的概念。每個應用程式都在自己的沙箱中運行。在 Android 4.3 之前,這些沙箱是透過在安裝時為每個應用程式建立唯一的 Linux UID 來定義的。 Android 4.3及更高版本使用SELinux來進一步定義Android應用程式沙箱的邊界。
在 Android 5.0 及更高版本中,SELinux 是完全強制執行的,它建立在 Android 4.3 的授權版本和 Android 4.4 的部分強制執行之上。透過這項更改,Android 從對一組有限的關鍵網域( installd
、 netd
、 vold
和zygote
)強制執行轉向對所有網域(超過 60 個網域)強制執行。具體來說:
- 在 Android 5.x 及更高版本中,一切都處於強制模式。
- 除
init
之外的任何進程都不應在init
域中運行。 - 任何通用拒絕(對於
block_device
、socket_device
、default_service
)都表示裝置需要特殊域。
Android 6.0 透過減少策略的允許性來強化系統,包括更好地隔離使用者、IOCTL 過濾、減少暴露服務的威脅、進一步收緊 SELinux 領域以及極其有限的/proc
存取。
Android 7.0更新了SELinux配置,進一步鎖定應用沙箱並減少攻擊面。此版本還將整體媒體伺服器堆疊分解為更小的進程,以減少其權限範圍。有關更多詳細信息,請參閱使用更多 Linux 核心防禦措施保護 Android和強化媒體堆疊。
Android 8.0 更新了 SELinux 以與Treble配合使用,從而將較低級別的供應商代碼與 Android 系統框架分開。此版本更新了 SELinux 策略,以允許設備製造商和 SOC 供應商更新其部分策略、建構其映像( vendor.img
、 boot.img
等),然後獨立於平台更新這些映像,反之亦然。
雖然設備上可以運行更高/更新的平台(框架)版本,但不支援相反的情況;供應商映像 ( vendor.img/odm.img
) 的版本不能高於平台 ( system.img
)。因此,較新的平台版本可能會引入 SELinux 相容性問題,因為平台 SELinux 策略的版本比供應商 SELinux 部分策略的版本更新。 Android 8.0 模型提供了一種保留相容性的方法,以防止不必要的同步 OTA。
其他資源
如需建置有用的 SELinux 策略的協助,請參閱以下資源。
- SELinux Notebook ,SELinux 的最新參考。本文檔包含有關策略語言、每個關鍵字的含義以及如何計算安全上下文的更多詳細資訊。
- SELinux 策略實施的視覺化操作指南
- Linux 的安全增強
- 安全性增強型 (SE) Android:將靈活的 MAC 引入 Android
- 將 SELinux 實作為 Linux 安全模組
- 配置 SELinux 策略