翻译自:https://www.zerodayinitiative.com/blog/2018/8/28/virtualbox-3d-acceleration-an-accelerated-attack-surface
翻译人:Agostop
VirtualBox 是目前由Oracle Corporation开发和维护的一个免费的虚拟机管理程序。虽然可能鲜为人知,但它是VMware WorkStation和Microsoft Hyper-V的直接竞争对手。VirtualBox 3D加速功能使用Chromium库实现,我们从2017年7月开始接收它的漏洞。Oracle在他们的文档中警告不要启用3D加速功能,因为这个功能可能会带来安全隐患并且暴露受攻击面。很少有人知道这个3D加速功能的实现代码很老,几乎可以追溯到2001年,是的,就是2001年。
在这篇博文中,我详细介绍了从2017年7月开始通过ZDI计划收到的不同类型的漏洞。我们收到的第一批漏洞是Vasily Vasiliev发现的,从那以后,这一领域的研究蓬勃发展,我们开始在这个受攻击面上接收更多的漏洞。
注意,想要触发或利用漏洞,必须手动开启3D加速功能
由于Chromium允许OpenGL图形渲染,所以当启用3D加速功能时,OpenGL应用程序会发送渲染相关命令给运行着Chromium服务器的管理程序。当开启这个选项的时候,并不会生成任何警告或者对话框来提醒用户该选项的开启会暴露更大的受攻击面。
接下来的讨论展示了影响OpenGL渲染命令的不同漏洞。
这个经典的整数溢出漏洞存在crUnpackExtendProgramParameters4fvNV方法中,是由Vasily Vasiliev最早发现的,来看具体代码:
用户可以控制num变量,通过发送给num特定的值,可以在位置[1]发生整数溢出,导致params被分配很小的空间。之后在位置[2],num被用在一个循环中,可以使变量params溢出。
Oracle在[1]处添加了大小检查以避免溢出,这个漏洞已在Oracle4月份的补丁发布中修复,并且被分配为CVE-2018-2830。有趣的是,这个漏洞同时被另外一个发现者Marche147发现,这表明多名研究人员正在研究OpenGL的受攻击面。Alisa Esage发现了一个具有相同攻击模式的非常相似的漏洞ZDI-18-686,在7月补丁发布中修复。
同样是由Vasily Vasiliev发现,但这个漏洞比前一个漏洞更严重,因为我们可以控制写入的地址和写入的值,漏洞的原理很简单:
在[1]处,变量address用来作为TrackMatrix阵列中元素的索引,在这种情况下,address是用户可控的,所以可以被用来做越界写入。
补丁在[1]处添加了额外的检查以确保地址不超过maxVertexProgramEnvParams。这个漏洞也在 Oracle4月份的补丁发布中修复,分配了CVE-2018-2835。
欢迎回到90年代!这是在现代管理程序代码中你永远不会想到的一种基于堆栈的缓冲区溢出漏洞,是我最喜欢的漏洞类型之一,我们来看看代码:
用户控制了变量mapsize和数组values,之后在[1]位置,mapsize用于一个循环复制的操作中,最终导致了变量数组fvalues的溢出。
Oracle通过在函数的最开头([1]位置)添加了对mapsize的大小检查来修补此漏洞,以确保fvalues之后不会再溢出。 该漏洞在Oracle的2018年1月修补版本中进行了修复,并分配了CVE-2018-2686。
这个漏洞也是被Vasily Vasiliev所发现。糟糕的是,这种漏洞模式在代码中出现了很多次,来看看代码:
由于变量n是用户可控的,可以在[1]处触发整数溢出,导致给变量pLocalprogs分配一个比较小的空间,之后在位置[2],n被用在一个复制循环中,从而可以使pLocalProgs也产生溢出。
和预期的一样,Oracle在[1]处添加了一个检查,以避免函数crAlloc中产生溢出。该漏洞在Oracle的2018年1月修补版本中进行了修补,并被分配了CVE-2018-2687。
这是能够触发这个漏洞的PoC代码,在Ubuntu访客VMs下使用。
重用旧代码来渲染OpenGL图形并不是最好的选择,尤其是当需要在虚拟机管理程序中使用时。凡事也要看到好的一面,如果使用者不考虑代码的过时和不安全性,对于代码审计人员来说也算是件好事。☺
你可以看我的Twitter@AbdHariri,关注我们团队以了解最新的漏洞利用技术和安全补丁。