RFC-0251:無根存取

RFC-0251:無 Root 存取權
狀態已接受
區域
  • 驅動程式
說明

取代根資源,存取經過微調的資源

Gerrit 變更
作者
審查人員
提交日期 (年-月-日)2023-11-20
審查日期 (年-月-日)2024-06-05

摘要

這份 RFC 詳細說明如何建立精細調整的資源,以及為何要建立精細調整的資源,而非存取根資源。最終目標是完全根除根源資源。由於這項資源廣泛使用,我們必須徹底瞭解如何有效移除這項資源,同時不會破壞目前依賴這項資源的眾多部分。

提振精神

根層級資源是一項強大的能力,可讓您存取硬體資源,並在系統中提供大量的高度特權存取權。根資源可存取其構成資源。以往,要將根資源拆分為其構成元素,一直是一件困難的事,因為只有核心、板卡驅動程式庫或指定裝置驅動程式,才有能力為更專門的資源指定有效範圍。雖然這種透過 component-manager 將根資源傳遞至元件,以便存取專用資源的模式相當方便,但並未遵循最低權限原則。我們應該只傳送元件所需的資源,並完全移除根資源。

相關人員

講師:leannogasawara@google.com

審查者:

需求條件

在應公開更精細資源的地方使用根資源。大部分的呼叫網站都已更新,可存取專屬資源。在目前無法這樣做的情況下,必須定義、路由及公開新的資源,讓系統遵循最低權限原則。

設計

component-manager 可為每項資源代管服務,並個別轉送每種資源。這項功能已為許多資源實作,但正式的設計應是處理所有資源類型,而非使用根資源存取專用資源。

實作

在仍使用根資源的地方,我們應找出程序所需的特定資源,並建立權限較低的更精細資源。新的資源會傳送至元件,而非傳送至根資源。應存在的精細資源清單如下:

  • CPU 資源:取得及設定 CPU 效能參數
  • 偵錯資源:用於存取各種核心偵錯系統呼叫
  • 能源資訊資源:存取能源消耗資訊
  • debuglog 資源:啟用讀取及寫入 debuglog 的功能
  • 螢幕緩衝區資源:取得及設定啟動載入器螢幕緩衝區
  • 管理程序資源:建立可在管理程序中執行的虛擬機器
  • info 資源:用於核心統計資料
  • iommu 資源:由 iommu 管理員使用
  • ioport 資源:存取 x86 ioport 的閘道
  • irq 資源:中斷物件的閘道存取權
  • mexec 資源:用於啟動系統
  • mmio 資源:mmio 的閘道存取權
  • msi 資源:用於在 PCI 上分配 MSI 範圍
  • 電源資源:操控 CPU 電源
  • 設定檔資源:用於建立排程器設定檔
  • smc 資源:平台裝置通訊協定用於存取 SMC 範圍
  • vmex 資源:將 VMOs 標示為可執行

這些新資源將取代目前依賴根資源的系統呼叫,讓每個呼叫都能取得最小許可權,以便正常運作。

針對每個新識別的資源:

  • 如果資源對應於範圍資源,則應具有其自身定義的類別,而沒有 base。包括 ioport、irq、mmio 和 smc 資源。
  • 對於所有其他資源,資源類型將是系統資源,並具有新定義的基礎類型。
  • 除了根資源之外,現有的核心系統呼叫也會更新,以便接受及驗證更精細的資源。
  • 元件管理員需要引入新服務,才能為新資源提供句柄。
  • 呼叫位置和相應的 cml 檔案會更新,以便使用更精細的資源。

當所有需要存取根資源的呼叫都已替換為更專門的資源時,即可從 driver-managercomponent-manager 中移除 fuchsia.boot.RootResource 服務。您可以將其曝光程度從政策檔案中移除,這樣如果未來有程式設計師嘗試在資源完全移除前使用該資源,就必須進行安全性審查。

在此階段,核心只會建立根資源,並將其傳遞至使用者空間,做為系統的第一個程序。您可以變更核心,停止建立資源,並更新其系統呼叫,只針對更精細的資源進行驗證。根資源應不再存在。

在 component_manager 中代管的新服務應如下所示:



@discoverable
closed protocol IommuResource {
    strict Get() -> (resource struct {
        resource zx.Handle:RESOURCE; }
    );
};


成效

預計不會有任何變動。

安全性考量

這項 RFC 會縮小根資源的表面區域,並相應將其高度特權存取權縮小到只限於核心,進而提升系統安全性。最初公開根資源是因為這樣做比較方便。使用者空間不應有權存取根資源,尤其是在有更精細資源的簡單實作方式時。在下游,您需要維護更多資源,但元件應負責瞭解所需的特定資源,而非使用功能強大的根資源。

隱私權注意事項

這項 RFC 不會影響隱私權。

測試

component-manager 中已有現有構成資源的測試。新資源可以複製這個範例,確保資源能正常運作。從 cml 移除 fuchsia.boot.RootResource 通訊協定路由時,如果仍有對根資源的呼叫,CICQ 就會中斷。只要通過 CICQ,即可測試新資源是否運作,以及是否不再需要根資源。

說明文件

建立新資源時,也需要更新 resource documentation。許多測試都會參照簡稱為 root_resource 的假資源。變數名稱也應更新,以便在適用情況下參照更具體的資源。

缺點、替代方案和未知事項

替代做法:不採取任何行動

這項 RFC 的替代做法是讓問題持續存在。系統會正常運作,且需要維護的資源較少。不過,現況違反了「程式只能存取所需資源」的承諾。使用者空間中沒有任何項目需要存取根資源。根資源是一項強大的能力,可執行超出必要範圍的作業。經過精細調整的資源轉送功能,可讓開發人員更輕鬆地確保其元件僅能存取必要的最低權限。

另一種做法是使用根工作。所有其他工作都會繼承這個程序,就像根資源可以建立所有其他資源一樣。雖然可以用根工作取代根資源,但這無法解決減少存取權的問題,也無法提供更精細的存取權解決方案。

未來工作

自今日起,元件或驅動程式庫程式架構不再提供根資源,核心測試也不再提供根資源。並未透過政策檔案提供。它仍由核心建立,並在資源檢查中驗證。移除驗證是根資源移除作業的最後一步。