一、漏洞简介
近期,社区在QEMU-KVM虚拟化平台的vhost内核模块中发现了一个缓冲区溢出漏洞(CVE-2019-14835),可能在虚拟机热迁移过程中被滥用,拥有特权的Guest用户可以将长度无效的描述符传递给宿主机,并升级其在宿主机上的特权,进而通过此漏洞实现虚拟机逃逸攻击,操纵虚拟机使宿主机内核崩溃或在物理机内核中执行恶意代码,控制宿主机。
二、virtio 网络简介
virtio是为虚拟机开发的标准化开放接口,用于访问简化的设备,如块设备和网络适配器。virtio-net是一个虚拟以太网卡,是virtio迄今为止支持的最复杂的设备。
图 1 vhost-net / virtio-net架构
virtio网络有2层(如图1所示):
1、Control plane:用于主机和客户之间建立和终止Data plane的能力交换协商
2、Data plane:用于在主机和客户端之间传输实际数据
其中,Control plane基于virtio规范,定义如何在Guest和Host之间创建控制平面和数据平面,为了性能Data plane并没有采用virtio规范,而是使用了vhost协议来进行数据传输。
由图1中可以看出,virtio中位于Guest的组件为virtio-net,作为前端运行在Guest内核空间,位于Host的组件为vhost-net,作为后端运行在Host内核空间。
图 2 virtio 网络数据传输
在实际的Data plane通信过程中,发送和接收是通过专用的队列完成的(如图2所示),对于每个虚拟cpu都会创建一个发送和一个接收队列。
以上描述了Guest如何使用virtio网络将包传递给主机内核。为了将这些包转发给在同一主机上或在主机(如internet)之外运行的其他客户机,需要使用OVS。
OVS是一个软件交换机,它允许在内核中转发数据包。它由用户空间部分和内核部分组成(如图3所示):
用户空间:包括用于管理和控制交换机的数据库(ovsdb-server)和OVS守护进程(OVS -vswitchd)
内核空间:包括负责数据路径或转发平面的ovs内核模块