RFC-0102:禁止 CHILD_NO_WRITE 搭配 CHILD_RESIZABLE

RFC-0102:禁止使用 CHILD_NO_WRITE 和 CHILD_RESIZABLE
狀態已接受
區域
  • Kernel
說明

將 ZX_VMO_CHILD_NO_WRITE 傳遞至 zx_vmo_create_child 時,將 ZX_VMO_CHILD_RESIZABLE 設為錯誤

問題
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 等可變指令長度架構上,即使僅限於在頁面界線進行也是如此。

不執行任何動作

另一種做法是保留系統呼叫,並記錄產生的控制代碼可能無法調整大小 (即使要求調整大小也一樣)。