返回资讯中心
外部精选
软件工程
#开发者实时流

Xen 曝 Xenbleed 漏洞:客户机可越权逃逸至 Dom0

来源标题:Xenbleed: Xen Guest to Dom0 Escape

Xen 披露名为 Xenbleed 的漏洞,攻击者可从客户机(Guest)逃逸到 Dom0 控制域。问题出在 gnttab_copy 的缓存键未包含 grant 引用或直接帧模式的选择位,且失败条目释放缓冲区后仍保留已锁定域,使后续同域操作跳过含 DOMID_SELF 检查的 gnttab_copy_lock_domain(),直接帧分支得以解析。代码节选显示相关校验仅在域 ID 匹配时才执行。

Hacker News 最新markasoftware2026/11/4 · 今天9 分钟阅读

以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

if ( !src->domain || op->source.domid != src->ptr.domid || !dest->domain || op->dest.domid != dest->ptr.domid ) gnttab_copy_release_buf(src); gnttab_copy_release_buf(dest); gnttab_copy_unlock_domains(src, dest); rc = gnttab_copy_lock_domains(op, src, dest if ( !src->domain || op->source.domid != src->ptr.domid || !dest->domain || op->dest.domid != dest->ptr.domid ) gnttab_copy_release_buf(src); gnttab_copy_release_buf(dest); gnttab_copy_unlock_domains(src, dest); rc = gnttab_copy_lock_domains(op, src, dest if ( !src->domain || op->source.domid != src->ptr.domid || !dest->domain || op->dest.domid != dest->ptr.domid ) gnttab_copy_release_buf(src); gnttab_copy_release_buf(dest); gnttab_copy_unlock_domains(src, dest); rc = gnttab_copy_lock_domains(op, src, dest

存在漏洞的缓存键包含两个 domain ID,却不包含用于选择 grant-reference 模式还是 direct-frame 模式的那几个标志位。查看源码。

某个条目在 grant 查找失败后释放了它的页缓冲区,却把已锁定的 domain 留给了下一个条目。当后续操作沿用相同的 domain ID 时,Xen 跳过了 gnttab_copy_lock_domain(),也就跳过了其中的 DOMID_SELF 检查。随后 direct-frame 分支便在缓存下来的外部 domain 内解析所选定的帧。

缓存为空时,Xen 本就执行了正确的规则。批量缓存则绕过了这条规则,为到达该操作另辟了一条路径。

CVE-2026-102703 涉及缓存的第二层。gnttab_copy_buf_valid() 在接受缓存中的数值匹配之前,需要要求 b->have_grant == has_gref。官方补丁加入了这项模式检查。我们的 invalid-grant 引导链触发的是 CVE-2026-102704;我们并未独立触发 CVE-2026-102703。

这个读取原语只需一个包含两个条目的 GNTTABOP_copy 批量操作即可完成。攻击者故意让第一次 grant 查找在 Xen 缓存 domain 之后失败。这样便丢弃了页状态,同时保留了 domain 缓存。第二个条目沿用相同的 domain ID,并把源操作数从 grant reference 改为 direct frame。

条目 0:将 dom0 指定为 grant-reference 源,使用无效引用 ~0U,并复制到 DOMID_SELF 中的一块临时页面。

缓存状态:Xen 锁定 dom0 和调用者的 domain。grant 查找以 GNTST_bad_gntref(-3)失败。页状态被释放;domain 锁仍留在缓存中。

条目 1:保留两个 domain ID,清除源 grant 标志,并把选定的 dom0 guest 帧号填入同一个操作数字段。

结果:domain 缓存命中,因此锁定时的权限检查不会执行。Xen 在 dom0 中解析该帧,并把它的字节复制进 guest。状态:0。

负向对照让这个绕过变得可见。一个独立的外部 direct-frame 复制从空缓存开始,返回 GNTST_permission_denied(-8)。在我们的验证中,同样的 direct-frame 操作在同一个批量中跟在 invalid-grant 引导之后便成功了。

交换源和目标,就能把读取变成写入。Hypercall 抢占可能在条目之间丢弃缓存,因此针对性探测会重试。这不需要时序竞争;我们在全新的 XenServer 上运行时,第一批就成功了。

我们首先针对一个由 dom0 中 fixture 分配的私有标记页测试了该原语。该 fixture 没有创建任何 grant,也没有公开它的地址或帧号。guest 扫描了候选的 dom0 帧,找到了 XEN_COPY_SECRET_A,并将其改为 XEN_COPY_SECRET_B。dom0 独立地报告了这个新值。

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →