實作 SELinux

SELinux 設定為預設拒絕,代表 核心中有掛鉤,但政策必須明確允許。這個 是指政策檔案包含大量 規則、類型、類別、權限等等徹底考量 SELinux 則不在本文件的討論範圍內,但只需瞭解如何撰寫 現在,政策規則在推出新 Android 裝置時至關重要。另有 目前我們已提供大量有關 SELinux 的資訊。請參閱支援 說明文件,瞭解建議資源。

金鑰檔案

如要啟用 SELinux,請將 最新 Android 核心,然後整合 system/sepolicy 目錄。編譯時,這些檔案會構成 SELinux 核心安全 以及適用於上游 Android 作業系統

一般而言,我們不建議您修改 system/sepolicy 檔案 請改為在 /device/manufacturer/device-name/sepolicy 目錄。在 Android 8.0 以上版本中,您對這些檔案所做的變更應該 只會影響供應商目錄中的政策。如要進一步瞭解 Android 8.0 以上版本中的公共政策,請參閱 在 Android 中自訂 SEPolicy 8.0 以上版本。無論 Android 版本為何,這些檔案都會經過修改:

政策檔案

結尾為 *.te 的檔案是 SELinux 政策來源檔案, 定義網域和標籤你可能需要在 /device/manufacturer/device-name/sepolicy, 但建議你盡可能更新現有檔案。

內容檔案

內容檔案可讓您指定物件標籤。

  • file_contexts 會為檔案指派標籤,供各種用途使用 使用者空間元件建立新政策時,請建立或更新這個檔案 指派新標籤給檔案。套用新的file_contexts: 重新建立檔案系統映像檔,或在檔案上執行 restorecon, 升級時,file_contexts 的變更會 系統在 Google Cloud 產品/服務中 升級。升級到其他 方法是將 restorecon_recursive 呼叫新增至 init.board.rc 檔案,掛接分區後 讀取和寫入
  • genfs_contexts 會將標籤指派給檔案系統,例如 procvfat 不支援延長功能 屬性。這項設定已做為核心政策的一部分載入,但 這些變更可能不會套用至核心 inos (需要重新啟動或 卸載檔案系統再重新掛接,以完全套用變更。 特定標籤也可以指派給特定掛接項目,例如 vfat使用 context=mount 選項。
  • property_contexts 會將標籤指派給 Android 系統屬性 控管哪些程序可以設定這些規則這項設定會由 init 處理程序。
  • service_contexts 會將標籤指派給 Android 繫結器服務 控制可新增 (註冊) 及尋找 (查詢) 繫結器的程序 的參照。這項設定會由 servicemanager 處理程序。
  • seapp_contexts 會將標籤指派給應用程式程序,並且 /data/data 目錄。這項設定會由 每次應用程式啟動時的 zygote 處理量,並於 installd前完成 設定時間
  • mac_permissions.xml 會將 seinfo 標記指派給應用程式 視您的簽名 以及視需要使用的套件名稱而定 接著,seinfo 標記就能做為 seapp_contexts 檔案中,將特定標籤指派給所有應用程式 該 seinfo 標記。這項設定是由 system_server
  • keystore2_key_contexts 會將標籤指派給 KeyStore 2.0 命名空間。 這些命名空間由 KeyStore2 Daemon 強制執行。KeyStore 一直都是 提供的命名空間KeyStore 2.0 會額外強制執行政策 先前定義的命名空間詳細描述這種格式和慣例 請前往這裡

BoardConfig.mk makefile

編輯或新增政策和內容檔案後,請更新 /device/manufacturer/device-name/BoardConfig.mk createfile 來參照 sepolicy 子目錄和各個新政策檔案。 如要進一步瞭解 BOARD_SEPOLICY 變數,請參閱 system/sepolicy/README 檔案

BOARD_SEPOLICY_DIRS += \
        <root>/device/manufacturer/device-name/sepolicy

BOARD_SEPOLICY_UNION += \
        genfs_contexts \
        file_contexts \
        sepolicy.te

重新建構完成後,裝置就會啟用 SELinux。你現在可以 自訂 SELinux 政策,以配合您在程式碼中加入 Android 作業系統,詳情請參閱 自訂或驗證 與現有設定 驗證

新的政策檔案和 BoardConfig.mk 更新完成後, 最終核心政策檔案會自動內建政策設定。 如要進一步瞭解在裝置上如何建構這項政策,請參閱 建構隔離

實作

如何開始使用 SELinux:

  1. 在核心中啟用 SELinux: CONFIG_SECURITY_SELINUX=y
  2. 變更 kernel_cmdline 或 bootconfig 參數,以:
    BOARD_KERNEL_CMDLINE := androidboot.selinux=permissive
    BOARD_BOOTCONFIG := androidboot.selinux=permissive
    這項設定僅適用於首次開發裝置政策的情況。之後 有初始啟動政策,請移除這個參數, 強制執行,否則 CTS 會失敗。
  3. 以寬容模式啟動系統,並查看開機時遇到哪些拒絕情形:
    在 Ubuntu 14.04 以上版本:
    adb shell su -c dmesg | grep denied | audit2allow -p out/target/product/BOARD/root/sepolicy
    
    在 Ubuntu 12.04:
    adb pull /sys/fs/selinux/policy
    adb logcat -b all | audit2allow -p policy
    
  4. 評估類似 init: Warning! Service name needs a SELinux domain defined; please fix! 的警告輸出結果 驗證操作說明 和工具
  5. 識別裝置,以及其他需要加上標籤的新檔案。
  6. 為物件使用現有或新的標籤。查看 *_contexts 個檔案,即可查看先前如何為項目加上標籤 並運用標籤所代表的意義來指派新標籤理想情況下 會是符合政策的現有標籤,但有時候 必須套用新標籤,然後設定該標籤的存取權規則 。在適當的內容檔案中加入標籤。
  7. 找出應擁有自身安全性網域的網域/程序。 您可能需要為每項產品撰寫全新的政策。所有語言 例如,從 init 產生的服務,應有 下列指令有助於顯示持續執行中的 (但「ALL」) 服務需要這類治療:
    adb shell su -c ps -Z | grep init
    
    adb shell su -c dmesg | grep 'avc: '
    
  8. 查看「init.device.rc」,找出是否有任何 沒有網域類型並及早為他們提供網域 開發程序,避免在 init 或 否則將導致「init」存取位於以下位置: 自己的政策。
  9. 設定「BOARD_CONFIG.mk」以使用「BOARD_SEPOLICY_*」 變數。詳情請參閱 讀我資訊 ,以瞭解此設定的詳細資訊。system/sepolicy
  10. 檢查 init.device.rc 和 fstab.device 檔案, 確保每次使用 mount 時,都會對應到適當的 加上標籤的檔案系統,或 context= mount 選項 。
  11. 檢查各項拒絕要求並建立 SELinux 政策,以妥善處理每個拒絕政策。詳情請見 「自訂」一節中的範例。

建議您先從 Android 開放原始碼計畫開始處理政策,然後根據這些政策進行建構。 包括您自訂的內容如要進一步瞭解政策策略和 下文會詳細說明這些步驟 編寫 SELinux 政策

用途

以下列舉幾個應納入考量的漏洞 軟體及相關的 SELinux 政策:

符號連結:由於符號連結會顯示為檔案,因此通常 讀取為檔案,可能導致漏洞攻擊。例如,具有某些特殊權限 init 這類元件會變更特定檔案的權限 有時會出現過度開放的問題

接著,攻擊者可能會使用其所控制的程式碼的符號連結來取代這些檔案。 讓攻擊者能夠覆寫任意檔案。不過,如果你知道自己的 應用程式永遠不會週遊符號連結,您可以禁止該標記 SELinux

系統檔案:請考慮使用 且此動作只應由系統伺服器修改。然而,自 netd起, initvold 以根層級執行,因此可以存取 這些系統檔案因此,如果 netd 遭到入侵, 入侵這些檔案,也可能是系統伺服器本身。

使用 SELinux 時,您可以將這些檔案識別為系統伺服器資料檔案。 因此,系統伺服器是唯一擁有讀取/寫入存取權的網域。 即使 netd 遭到入侵,也無法將網域切換為 系統伺服器網域,並透過根層級存取系統檔案。

應用程式資料 - 另一個例子是, 必須以根層級執行,但不得存取應用程式資料。而這意味著 很實用,例如可以做出廣泛的斷言 例如,某些不相關的網域 禁止應用程式存取網際網路

setattr:適用於 chmodchown,您可以找出與專案相關聯的 網域可執行 setattr。任何外有可能是 因而禁止這些變更。所以應用程式可能會在執行時 並比較chmodchown app_data_files 但不含 shell_data_filessystem_data_files