Google致力於提高黑人社區的種族平等。 怎麼看。
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

供應商初始化

初始化過程幾乎具有不受限制的權限,並且在引導過程中使用系統分區和供應商分區中的輸入腳本來初始化系統。這種訪問會在Treble系統/供應商拆分中造成巨大漏洞,因為供應商腳本可能會指示init來訪問文件,屬性等,這些文件,屬性等不構成穩定的系統-供應商應用程序二進制接口(ABI)的一部分。

通過使用單獨的安全性得到增強的Linux(SELinux)域vendor_init來運行/vendor具有特定於/vendor商的權限的命令,可以使用Vendor init來彌補這一漏洞。

機制

Vendor init在SELinux上下文u:r:vendor_init:s0的引導過程的早期派生了init的子過程。與默認的init上下文相比,此SELinux上下文的權限要少得多,並且它的訪問僅限於特定於供應商或穩定係統供應商ABI的文件,屬性等。

Init會檢查它加載的每個腳本,以查看其路徑是否以/vendor開頭,如果是,則標記它的命令,指示其命令必須在vendor init上下文中運行。每個內置的init都有一個布爾值註釋,該布爾值指定是否必須在供應商的init子進程中運行該命令:

  • 註釋大多數訪問文件系統的命令都可以在供應商初始化子過程中運行,因此要遵循供應商初始化SEPolicy。
  • 影響內部初始化狀態的大多數命令(例如,啟動和停止服務)在正常的初始化過程中運行。使這些命令知道供應商腳本正在調用它們來執行自己的非SELinux權限處理。

init的主要處理循環包含以下檢查:是否註釋了要在供應商子流程中運行的命令,並且該命令源於供應商腳本,則該命令通過進程間通信(IPC)發送到運行該命令的供應商init子流程。並將結果發送回init。

使用供應商初始化

默認情況下,供應商初始化是啟用的,並且其限制適用於/vendor分區中存在的所有初始化腳本。供應商初始化對於其腳本已經無法訪問僅系統文件,屬性等的供應商而言應該是透明的。

但是,如果給定供應商腳本中的命令違反了供應商初始化限制,則這些命令將失敗。失敗的命令在init內核日誌中有一行(從dmesg可見)從init指示失敗。 SELinux審核會伴隨由於SELinux策略而失敗的任何失敗命令。包含SELinux審核的失敗示例:

type=1400 audit(1511821362.996:9): avc: denied { search } for pid=540 comm="init" name="nfc" dev="sda45" ino=1310721 scontext=u:r:vendor_init:s0 tcontext=u:object_r:nfc_data_file:s0 tclass=dir permissive=0
init: Command 'write /data/nfc/bad_file_access 1234' action=boot (/vendor/etc/init/hw/init.walleye.rc:422) took 2ms and failed: Unable to write to file '/data/nfc/bad_file_access': open() failed: Permission denied

如果命令失敗,則有兩個選項:

  • 如果命令由於預期的限製而失敗(例如,如果命令正在訪問系統文件或屬性),則必須以僅通過穩定接口的高音友好方式重新執行該命令。 Neverallow規則阻止添加權限以訪問不屬於穩定係統供應商ABI的系統文件。
  • 如果SELinux標籤是新標籤,並且尚未在系統vendor_init.te被授予權限,也未通過Neverallow規則被排除在外,則可以在特定於設備的vendor_init.te向新標籤授予權限。

對於在Android 9之前啟動的設備,可以通過將data_between_core_and_vendor_violators類型屬性添加到特定於設備的vendor_init.te文件中來繞開永不禁止規則。

代碼位置

供應商初始化IPC的大部分邏輯位於system / core / init / subcontext.cpp中

命令表位於system / core / init / BuiltinFunctionMap中的BuiltinFunctionMap類中,並包含指示命令是否必須在供應商init子BuiltinFunctionMap運行的註釋。

供應商初始化的SEPolicy分為system / sepolicy中的private( system / sepolicy / private / vendor_init.te )和public( system / sepolicy / public / vendor_init.te )目錄。