RFC-0102:禁止 CHILD_NO_WRITE 搭配 CHILD_RESIZABLE

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

讓使用 ZX_VMO_CHILD_RESIZABLE 將 ZX_VMO_CHILD_NO_WRITE 傳送給 zx_vmo_create_child 時發生錯誤

問題
  • 77315
變更
作者
審查人員
提交日期 (年/月)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_set_size 可對使用 ZX_VMO_CHILD_RESIZABLE 建立的 VMO 子項執行,需要 ZX_RIGHT_WRITE,因為這麼做可能會導致修改 VMO 資料。

將這兩個標記傳遞至 zx_vmo_create_child 的組合將成功建立 VMO,並在呼叫 zx_vmo_set_size 時傳回控制代碼。從使用者的角度來看,相當難以理解,如要成功使用 ZX_VMO_CHILD_RESZIABLE 建立物件,只是導致調整大小作業失敗。這不僅會在立即產生的控制代碼上失敗,也無法產生可調整大小的控制代碼,因為處理權限無法升級。

設計

如果同時設定了 ZX_VMO_CHILD_NO_WRITEZX_VMO_CHILD_RESIZABLE 旗標,zx_vmo_create_child Syscall 就會在開始時檢查,如果立即傳回 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) 上,就會產生惡意指示,即使限制在頁面邊界上也是如此。

不執行任何動作

另一種做法是保留系統呼叫本身,並可能記錄在成功執行時產生的帳號代碼無法調整大小 (即使有人要求這麼做)。