Google is committed to advancing racial equity for Black communities. See how.
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

實施SELinux

SELinux設置為default-deny,這意味著它在內核中具有掛鉤的每個單個訪問都必須由策略明確允許。這意味著策略文件包含有關規則,類型,類,權限等的大量信息。 SELinux的完整考慮不在本文檔的討論範圍之內,但是,在提出新的Android設備時,必須了解如何編寫策略規則。已經有關於SELinux的大量信息。請參閱支持文檔以獲取建議的資源。

關鍵文件

要啟用SELinux,請集成最新的Android內核 ,然後合併在system / sepolicy目錄中找到的文件。編譯後,這些文件將構成SELinux內核安全策略,並覆蓋上游的Android操作系統。

通常,您不應直接修改system/sepolicy文件。而是在/device/ manufacturer / device-name /sepolicy目錄中添加或編輯自己的設備特定的策略文件。在Android 8.0及更高版本中,您對這些文件所做的更改應僅影響供應商目錄中的策略。有關在Android 8.0及更高版本中分隔公共政策的詳細信息,請參閱在Android 8.0+中自定義SEPolicy 。無論Android版本如何,您仍在修改以下文件:

政策文件

*.te結尾的文件是SELinux策略源文件,用於定義域及其標籤。您可能需要在/device/ manufacturer / device-name /sepolicy創建新的策略文件,但應嘗試盡可能更新現有文件。

上下文文件

在上下文文件中,可以為對象指定標籤。

  • file_contexts為文件分配標籤,並由各種用戶空間組件使用。在創建新策略時,請創建或更新此文件以為文件分配新標籤。要應用新的file_contexts ,請重建文件系統映像或對要重新標記的文件運行restorecon 。升級時,作為升級的一部分,對file_contexts更改將自動應用於系統和用戶數據分區。通過向您的init添加restorecon_recursive調用,更改也可以自動應用於升級到其他分區。分區掛載後以board .rc文件讀寫。
  • genfs_contexts將標籤分配給不支持擴展屬性的文件系統,例如procvfat 。此配置是作為內核策略的一部分加載的,但更改可能不會對核心inode生效,需要重新引導或卸載並重新安裝文件系統才能完全應用更改。也可以使用context=mount選項將特定的標籤分配給特定的安裝,例如vfat
  • property_contexts為Android系統屬性分配標籤,以控制可以設置它們的進程。啟動過程中, init進程將讀取此配置。
  • service_contexts為Android活頁夾服務分配標籤,以控制哪些進程可以添加(註冊)和查找(查找)該服務的活頁夾引用。啟動期間, servicemanager進程將讀取此配置。
  • seapp_contexts為應用程序進程和/data/data目錄分配標籤。這種結構是通過讀zygote每個應用程序啟動和處理installd啟動過程中。
  • mac_permissions.xml根據應用程序的簽名和可選的包名稱為應用程序分配一個seinfo標記。然後, seinfo標記可用作seapp_contexts文件中的鍵, seapp_contexts所有帶有該seinfo標記的應用程序分配特定的標籤。啟動期間, system_server將讀取此配置。

BoardConfig.mk生成文件

編輯或添加策略和上下文文件後,更新您的/device/ manufacturer / device-name /BoardConfig.mk生成文件以引用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更新到位後,新的策略設置將自動構建到最終的內核策略文件中。有關如何在設備上構建Sepolicy的更多信息,請參見構建Sepolicy

實作

要開始使用SELinux:

  1. 在內核中啟用SELinux: CONFIG_SECURITY_SELINUX=y
  2. 更改kernel_cmdline參數,以便:
    BOARD_KERNEL_CMDLINE := 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產生的所有服務都應該有自己的服務。以下命令有助於揭示那些仍在運行的命令(但是所有服務都需要這種處理):
    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策略以正確處理每個拒絕。請參閱“ 定制”中的示例。

您應該先從AOSP中的策略開始,然後再基於這些策略進行自定義。有關策略策略的更多信息並進一步了解其中一些步驟,請參閱《 編寫SELinux策略》

用例

以下是在製作自己的軟件和相關的SELinux策略時要考慮的漏洞利用的具體示例:

符號鏈接 -因為符號鏈接顯示為文件,他們往往讀成文件,這可能會導致攻擊。例如,某些特權組件(例如init )更改某些文件的權限,有時會被過度打開。

然後,攻擊者可能用符號鏈接替換這些文件以控制代碼,從而使攻擊者可以覆蓋任意文件。但是,如果您知道應用程序永遠不會遍歷符號鏈接,則可以禁止它與SELinux一起使用。

系統文件 -考慮只能由系統服務器修改的系統文件的類別。儘管如此,由於netdinitvold以root身份運行,因此他們可以訪問那些系統文件。因此,如果netd受到威脅,則可能會破壞這些文件,甚至可能破壞系統服務器本身。

使用SELinux,您可以將那些文件標識為系統服務器數據文件。因此,唯一對它們具有讀/寫訪問權限的域是系統服務器。即使netd受到威脅,儘管它以root身份運行,也無法將域切換到系統服務器域並訪問這些系統文件。

應用程序數據 -另一個示例是必須以root用戶身份運行但不能訪問應用程序數據的函數類。這是非常有用的,因為可以進行廣泛的聲明,例如與應用程序數據無關的某些域被禁止訪問Internet。

setattr-對於chmodchown命令,您可以標識關聯域可以執行setattr的文件集。可以禁止這些更改之外的任何內容,即使是root用戶也是如此。因此,應用程序可能會運行chmod並針對那些標有app_data_files chown進行chown ,而不是shell_data_filessystem_data_files chown進行chown