| RFC-0102:禁止使用 CHILD_NO_WRITE 和 CHILD_RESIZABLE | |
|---|---|
| 狀態 | 已接受 |
| 區域 |
|
| 說明 | 將 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_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 等可變指令長度架構上,即使僅限於在頁面界線進行也是如此。
不執行任何動作
另一種做法是保留系統呼叫,並記錄產生的控制代碼可能無法調整大小 (即使要求調整大小也一樣)。