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_WRITE
和 ZX_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_WRITE
和 ZX_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 等可變指令長度架構中,可能會導致惡意指令的形成,即使只限於在頁面邊界執行也一樣。
不執行任何動作
另一個做法是保留系統呼叫,並可能記錄以下事實:即使要求產生的句柄可能無法調整大小,但在成功時仍會產生句柄。