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
创建设置了 ZX_VMO_CHILD_NO_WRITE
标志的子 VMO 会从生成的句柄中明确移除 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)上。
不进行任何操作
另一种方法是让系统调用保持原样,并可能记录这样一个事实:成功生成的句柄可能无法调整大小,即使相应请求已被请求也是如此。