近日,奇安信代码安全实验室研究员为Red Hat报告多个漏洞(CVE-2020-14364、CVE-2020-10756、 CVE-2020-12829、 CVE-2020-14415、 CVE-2020-15863和CVE-2020-16092),并协助其修复,其中CVE-2020-14364(数组越界读写漏洞)可直接造成虚拟机逃逸且影响范围巨大。8月24日,QEMU官方更新了安全补丁,修复了此漏洞(CVE-2020-14364)。QEMU的USB后端在实现USB控制器与USB设备通信时存在越界读写问题,成功利用该漏洞可越界读写某一个堆之后 0xffffffff 的内容,可轻易实现完整的虚拟机逃逸。
奇安信 CERT
安全通告近日,奇安信代码安全实验室研究员为Red Hat报告多个漏洞(CVE-2020-14364、CVE-2020-10756、 CVE-2020-12829、 CVE-2020-14415、 CVE-2020-15863和CVE-2020-16092),并协助其修复,其中CVE-2020-14364(数组越界读写漏洞)可直接造成虚拟机逃逸且影响范围巨大。8月24日,QEMU官方更新了安全补丁,修复了此漏洞(CVE-2020-14364)。QEMU的USB后端在实现USB控制器与USB设备通信时存在越界读写问题,成功利用该漏洞可越界读写某一个堆之后 0xffffffff 的内容,可轻易实现完整的虚拟机逃逸。
Red Hat发布了补丁更新公告以及致谢公告,公开致谢奇安信代码安全实验室研究人员:
漏洞描述QEMU(quick emulator)是一款由Fabrice Bellard等人编写的免费的可执行硬件虚拟化开源托管虚拟机(VMM)QEMU主要提供两种功能给用户使用。一是作为用户态模拟器,利用动态代码翻译机制来执行不同于主机架构的代码。二是作为虚拟机监管器,模拟全系统,利用其他VMM(Xen, KVM, etc)来使用硬件提供的虚拟化支持,创建接近于主机性能的虚拟机。8 月 24 日,QEMU 官方更新了安全补丁,修复了一处数组越界读写的漏洞(CVE-2020-14364)。
QEMU的 USB 仿真器中存在越界读/写访问问题。当处理来自 guest 的 USB 数据包时,如果do_token_{in,out}例程中的 'USBDevice->setup_len' 超过USBDevice->data_buf[4096],则会产生越界读/写访问问题。Guest 用户可利用该缺陷使 QEMU 进程崩溃,从而导致拒绝服务或可能以主机上QEMU 进程的权限执行任意代码。该漏洞能够直接造成虚拟机逃逸且影响范围巨大。
复现截图:
风险等级奇安信 CERT风险评级为:高危
风险等级:蓝色(一般事件)
影响范围QEMU全版本
处置建议参考以下补丁进行漏洞修复:
https://www.openwall.com/lists/oss-security/2020/08/24/3/1
技术分析QEMU的USB后端在实现USB控制器与USB设备通信时存在越界读写漏洞可能导致虚拟机逃逸USB总线通过创建一个USBpacket对象来和USB设备通信.
Usbpacket对象中包含以下关键内容
struct USBPacket { /* Data fields for use by the driver. */ int pid; uint64_t id; USBEndpoint *ep; ....};
其中pid表明packet的类型,存在三种类型in,out,setup,ep指向endpoint对象,通过此结构定位目标usb设备.
数据交换为usbdevice中缓冲区的data_buf与usbpacket对象中使用usb_packet_map申请的缓冲区两者间通过usb_packet_copy函数实现,为了防止两者缓冲区长度不匹配,传送的长度由s->setup_len限制
case SETUP_STATE_DATA: if (s->setup_buf[0] & USB_DIR_IN) { int len = s->setup_len - s->setup_index; if (len > p->iov.size) { len = p->iov.size; } usb_packet_copy(p, s->data_buf + s->setup_index, len); s->setup_index += len; if (s->setup_index >= s->setup_len) { s->setup_state = SETUP_STATE_ACK; } return; }
漏洞存在于s->setup_len赋值的过程do_token_setup中.
s->setup_len &#61; (s->setup_buf[7] <<8) | s->setup_buf[6]; if (s->setup_len > sizeof(s->data_buf)) { fprintf(stderr, "usb_generic_handle_packet: ctrl buffer too small (%d > %zu)\n", s->setup_len, sizeof(s->data_buf)); p->status &#61; USB_RET_STALL; return; }
虽然进行了校验&#xff0c;但是由于在校验前&#xff0c;s->setup_len的值已经被设置导致之后的do_token_in或者do_token_out中使用usb_packet_copy时会产生越界读写漏洞。
参考资料[1] https://access.redhat.com/security/cve/cve-2020-14364
时间线2020年8月25日&#xff0c;奇安信 CERT发布安全风险通告奇安信 CERT
奇安信CERT致力于
第一时间为企业级客户提供
安全风险通告和有效的解决方案