RFC-0102:使用 CHILD_RESIZABLE 禁止 CHILD_NO_WRITE | |
---|---|
狀態 | 已接受 |
區域 |
|
說明 | 讓使用 ZX_VMO_CHILD_RESIZABLE 將 ZX_VMO_CHILD_NO_WRITE 傳送給 zx_vmo_create_child 時發生錯誤 |
問題 | |
變更 | |
作者 | |
審查人員 | |
提交日期 (年/月) | 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_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_WRITE
和 ZX_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) 上,就會產生惡意指示,即使限制在頁面邊界上也是如此。
不執行任何動作
另一種做法是保留系統呼叫本身,並可能記錄在成功執行時產生的帳號代碼無法調整大小 (即使有人要求這麼做)。