Android 中的安全增強型 Linux

作為 Android安全模型的一部分,Android 使用 Security-Enhanced Linux (SELinux) 對所有進程實施強制訪問控制 (MAC),即使是以 root/超級用戶權限運行的進程(Linux 功能)。許多公司和組織為 Android 的SELinux 實施做出了貢獻。借助 SELinux,Android 可以更好地保護和限制系統服務,控制對應用程序數據和系統日誌的訪問,減少惡意軟件的影響,並保護用戶免受移動設備代碼中潛在缺陷的影響。

SELinux 根據默認拒絕原則運行:任何未明確允許的內容都將被拒絕。 SELinux 可以在兩種全局模式下運行:

  • Permissive模式,其中記錄權限拒絕但不強制執行。
  • 強制模式,其中記錄強制執行權限拒絕。

Android 包括處於強制模式的 SELinux,以及默認跨 AOSP 運行的相應安全策略。在強制模式下,不允許的操作被阻止,所有嘗試的違規行為都由內核記錄到dmesglogcat 。開發時,您應該使用這些錯誤來完善您的軟件和 SELinux 策略,然後再強制執行它們。有關更多詳細信息,請參閱實施 SELinux

SELinux 還支持per-domain permissive模式,其中可以允許特定域(進程),同時將系統的其餘部分置於全局強制模式。域只是標識安全策略中的一個進程或一組進程的標籤,其中所有標有相同域的進程都被安全策略同等對待。 Per-domain permissive 模式允許將 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 、 voldnetd )強制執行轉變為對所有域(超過 60 個域) zygote執行。具體來說:

  • 在 Android 5.x 及更高版本中,一切都處於強制模式。
  • 除了init以外的任何進程都不應在init域中運行。
  • 任何通用拒絕(對於block_devicesocket_devicedefault_service )都表示設備需要一個特殊的域。

Android 6.0 通過降低我們政策的許可性來強化系統,包括更好地隔離用戶、IOCTL 過濾、減少暴露服務的威脅、進一步收緊 SELinux 域以及極其有限的/proc訪問。

Android 7.0 更新了 SELinux 配置以進一步鎖定應用程序沙箱並減少攻擊面。此版本還將單體媒體服務器堆棧分解為更小的進程,以減少它們的權限範圍。有關更多詳細信息,請參閱使用更多 Linux 內核防禦保護 Android強化媒體堆棧

Android 8.0 更新了 SELinux 以使用Treble ,它將較低級別的供應商代碼與 Android 系統框架分開。此版本更新了 SELinux 政策,允許設備製造商和 SOC 供應商更新他們的部分政策,構建他們的鏡像( vendor.imgboot.img等),然後獨立於平台更新這些鏡像,反之亦然。

雖然可以在設備上運行更高/更新的平台(框架)版本,但不支持相反的情況;供應商映像 ( vendor.img/odm.img ) 的版本不能比平台 ( system.img ) 新。因此,較新的平台版本可能會引入 SELinux 兼容性問題,因為平台 SELinux 策略的版本比策略的供應商 SELinux 部分更新。 Android 8.0 模型提供了一種保持兼容性的方法,以防止不必要的同時 OTA。

其他資源

如需幫助構建有用的 SELinux 策略,請參閱以下資源。 Android 不使用某些 SELinux 概念,請在考慮外部文檔時參閱特定性部分。