RFC-0102:禁止 CHILD_NO_WRITE 搭配 CHILD_RESIZABLE

RFC-0102:禁止使用 CHILD_RESIZABLE 搭配 CHILD_NO_WRITE
狀態已接受
區域
  • 核心
說明

將 ZX_VMO_CHILD_NO_WRITE 和 ZX_VMO_CHILD_RESIZABLE 傳遞至 zx_vmo_create_child 時,會發生錯誤

問題
Gerrit 變更
作者
審查人員
提交日期 (年-月-日)2021-05-25
審查日期 (年-月-日)2021-06-10

摘要

此 RFC 建議將 ZX_VMO_CHILD_NO_WRITEZX_VMO_CHILD_RESIZABLE 的組合傳遞至 zx_vmo_create_child 視為錯誤。

提振精神

使用 zx_vmo_create_child 建立子項 VMO,並將 ZX_VMO_CHILD_NO_WRITE 旗標設為明確移除產生句柄中的 ZX_RIGHT_WRITE。由於此時這是新建立的 VMO 唯一的句柄,且其權限永遠無法升級為包含 ZX_RIGHT_WRITE,因此無法產生任何具有 ZX_RIGHT_WRITE 的 VMO 額外句柄。

在使用 ZX_VMO_CHILD_RESIZABLE 建立的 VMO 子項上執行的大小調整作業 (zx_vmo_set_size) 需要 ZX_RIGHT_WRITE,因為這可能會導致修改 VMO 資料。

將這兩個旗標傳遞至 zx_vmo_create_child 的組合會成功建立 VMO,並傳回一個句柄,如果呼叫 zx_vmo_set_size,就會發生錯誤。從使用者觀點來看,如果成功使用 ZX_VMO_CHILD_RESZIABLE 建立物件,但大小調整作業卻失敗,會造成極大的困惑。不僅無法產生立即產生的控制代碼,也無法產生可調整大小的控制代碼,因為控制代碼權利無法升級。

設計

zx_vmo_create_child 系統呼叫會在開始時檢查是否已設定 ZX_VMO_CHILD_NO_WRITEZX_VMO_CHILD_RESIZABLE 標記,如果已設定,就會立即傳回 ZX_ERR_INVALID_ARGS

實作

所有變更都可以在單一 CL 中實作。

成效

不相關。

回溯相容性

目前沒有已知的使用情境。

安全性考量

無。

隱私權注意事項

無。

測試

新增單元測試來驗證限制條件。

說明文件

zx_vmo_create_child 的 API 說明文件需要更新。

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

專用右側大小調整控點

ZX_RIGHT_WRITE 會用於限制 zx_vmo_set_size 作業,因為調整大小會透過截斷或零延伸來修改 VMO。這是一組非常有限且可預測的修改項目,因此可以擁有專屬權利,與任意修改項目區隔開來。

即使有這類專屬權利,ZX_VMO_CHILD_NO_WRITE 幾乎肯定也會想移除該權限,因為 ZX_VMO_CHILD_NO_WRITE 的目的是防止程式碼修改。截斷和零延伸的組合,特別是在 x86 等可變指令長度架構中,可能會導致惡意指令的形成,即使只限於在頁面邊界執行也一樣。

不執行任何動作

另一個做法是保留系統呼叫,並可能記錄以下事實:即使要求產生的句柄可能無法調整大小,但在成功時仍會產生句柄。