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_OPCODES
和CR_MESSAGE_REDIR_PTR
两种类型。关键结构如下:
|
|
CR_MESSAGE_OPCODES
消息包含操作码数量前缀和特殊编码的字节数组。例如CR_WRITEBACK_EXTEND_OPCODE
操作码会通过SET_WRITEBACK_PTR
宏将指定偏移的数据写入响应缓冲区,形成"echo"原语。
CVE-2018-3055:越界WRITEBACK_PTR信息泄露
在crUnpackExtendAreProgramsResidentNV
函数中存在未校验的用户控制偏移:
|
|
攻击者通过控制n
值可实现堆数据泄露,结合可控的消息分配大小,形成完美的信息泄露原语。
CVE-2018-3085:CR_MESSAGE_REDIR_PTR绝对地址写
crServerDispatchMessage
函数处理CR_MESSAGE_REDIR_PTR
类型消息时存在设计缺陷:
|
|
通过特殊构造的CR_MESSAGE_REDIR_PTR
消息,攻击者可完全控制后续处理的消息内容和写入位置。结合allow_redir_ptr
标志的绕过技巧(通过glBegin
/glEnd
阻塞其他客户端),最终实现稳定的任意地址写原语。
漏洞组合利用
- 利用信息泄露漏洞获取关键内存地址
- 通过HGCM调用进行堆喷布局
- 构造恶意
CR_MESSAGE_REDIR_PTR
消息触发UAF - 利用任意写原语劫持控制流
完整利用链可实现从虚拟机客户机完全攻陷VirtualBox主机进程,进而通过内核驱动实现本地权限提升。