VirtualBox 3D加速功能存在高危漏洞分析(CVE-2018-3055/CVE-2018-3085)

本文详细分析了VirtualBox 3D加速功能中存在的两个高危漏洞(CVE-2018-3055信息泄露漏洞和CVE-2018-3085任意写漏洞),通过组合利用可实现从虚拟机 guest 端完全攻陷 host 端。漏洞涉及Chromium库的HGCM协议实现缺陷,已于2018年7月修复。

Better slow than sorry – VirtualBox 3D acceleration considered harmful

更新:漏洞利用代码和HGCM/Chromium接口库已发布在Github

VirtualBox的3D加速功能在今年遭遇了严峻的安全挑战。虽然官方文档明确警告不建议在不可信环境中使用该功能(强调原文):

不应允许不可信的客户系统使用VirtualBox的3D加速功能,就像不应允许不可信的主机软件使用3D加速一样。3D硬件驱动程序通常过于复杂而无法确保安全性,任何被允许访问它们的软件都可能危害运行它们的操作系统。此外,启用3D加速会让客户机直接访问VirtualBox主机进程中大量额外的程序代码,可能被用来崩溃虚拟机。

但这只说对了一半:VirtualBox虚拟机主机进程默认具有VBoxDrv内核驱动访问权限。因此,攻陷此类进程(即使以启动VM的用户权限运行)可实现本地权限提升,正如Jann Horn、James Forshaw和我在Insomni’hack 2018的演讲中详细阐述的那样(幻灯片9-22视频)。

本文将分析CVE-2018-3055(信息泄露漏洞)和CVE-2018-3085(设计缺陷漏洞),这两个漏洞组合利用可完全攻陷启用3D加速的VirtualBox。两个漏洞均在2018年7月关键补丁更新(VirtualBox 5.2.16版本)中修复。

技术背景

3D加速功能在代码中被称为"shared OpenGL",基于Chromium库实现分布式OpenGL渲染(注意:此Chromium与同名浏览器无关,早于其7年出现)。Chromium定义了描述OpenGL操作的网络协议,VirtualBox维护了Chromium的分支版本,并通过HGCM(主机-客户机通信管理器)隧道传输协议。

HGCM是一种简单的RPC协议,客户机连接HGCM服务后可通过缓冲区参数进行远程调用。关于HGCM和VirtualBox Chromium集成的更多细节,可参考Francisco Falcon在REcon 2014的演讲

漏洞分析

Chromium消息基础

Chromium消息通过CRMessage联合体表示,主要关注CR_MESSAGE_OPCODESCR_MESSAGE_REDIR_PTR两种类型。关键结构如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
typedef struct {
    CRMessageType          type;
    unsigned int           conn_id;
} CRMessageHeader;

typedef union {
    CRMessageHeader      header;
    CRMessageOpcodes     opcodes;
    CRMessageRedirPtr    redirptr;
    ...
} CRMessage;

CR_MESSAGE_OPCODES消息包含操作码数量前缀和特殊编码的字节数组。例如CR_WRITEBACK_EXTEND_OPCODE操作码会通过SET_WRITEBACK_PTR宏将指定偏移的数据写入响应缓冲区,形成"echo"原语。

CVE-2018-3055:越界WRITEBACK_PTR信息泄露

crUnpackExtendAreProgramsResidentNV函数中存在未校验的用户控制偏移:

1
2
3
4
5
6
void crUnpackExtendAreProgramsResidentNV(void)
{
    GLsizei n = READ_DATA(8, GLsizei);
    SET_WRITEBACK_PTR(20 + n * sizeof(GLuint));
    ...
}

攻击者通过控制n值可实现堆数据泄露,结合可控的消息分配大小,形成完美的信息泄露原语。

CVE-2018-3085:CR_MESSAGE_REDIR_PTR绝对地址写

crServerDispatchMessage函数处理CR_MESSAGE_REDIR_PTR类型消息时存在设计缺陷:

1
2
3
4
5
6
7
if (msg->header.type == CR_MESSAGE_REDIR_PTR) {
    msg = (CRMessage *) msg->redirptr.pMessage; // 完全控制消息指针
}
...
if (CRVBOXHGSMI_CMDDATA_IS_SETWB(pCmdData)) {
    *pCmdData->pcbWriteback = cbWriteback; // 实现任意地址写
}

通过特殊构造的CR_MESSAGE_REDIR_PTR消息,攻击者可完全控制后续处理的消息内容和写入位置。结合allow_redir_ptr标志的绕过技巧(通过glBegin/glEnd阻塞其他客户端),最终实现稳定的任意地址写原语。

漏洞组合利用

  1. 利用信息泄露漏洞获取关键内存地址
  2. 通过HGCM调用进行堆喷布局
  3. 构造恶意CR_MESSAGE_REDIR_PTR消息触发UAF
  4. 利用任意写原语劫持控制流

完整利用链可实现从虚拟机客户机完全攻陷VirtualBox主机进程,进而通过内核驱动实现本地权限提升。

参考资源

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计