Android 中的安全增強式 Linux

在 Android 安全性模型中,Android 會使用安全增強式 Linux (SELinux),針對所有程序 (甚至是使用 root/superuser 權限 (Linux 功能) 執行的程序) 強制執行強制存取控制 (MAC)。許多公司和機構都參與了 Android 的 SELinux 導入作業。有了 SELinux,Android 就能更妥善地保護及限制系統服務、控管應用程式資料和系統記錄檔的存取權、減少惡意軟體的影響,並保護使用者免於遭受行動裝置程式碼的潛在缺陷影響。

SELinux 採用預設拒絕原則運作:凡是未明確允許的項目都會遭到拒絕。SELinux 可在兩種全域模式下運作:

  • Permissive 模式:會記錄權限拒絕事件,但不會強制執行。
  • 強制模式,會記錄權限拒絕事件,並強制執行。

Android 包含強制執行模式的 SELinux,以及預設在 AOSP 上運作的對應安全性政策。在強制執行模式中,系統會防止禁止的動作,並將所有違規嘗試記錄到 dmesglogcat。開發時,您應先使用這些錯誤來改善軟體和 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 從只針對少數重要網域 (installdnetdvoldzygote) 執行政策,改為針對所有網域 (超過 60 個網域) 執行政策。具體違規事項如下:

  • 在 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 政策,請參閱下列資源。