BUGTRAQ ID: 29183
CVE(CAN) ID: CVE-2008-1943
Xen是可用于Linux内核的一种虚拟化技术,允许同时运行多个操作系统。
Xen中超虚拟化帧缓冲区(PVFB)后端没有验证前端的帧缓冲区描述,这可能允许恶意用户导致拒绝服务或使用特制的前端入侵特权域Dom0。
帧缓冲区是由以下参数描述的:
在启动时fb_len是固定大小,前端可以通过发送XENFB_TYPE_RESIZE事件修改其他参数。如果存在后端配置参数videoram的话,xenfb_read_frontend_fb_config()会根据这个参数限制fb_len。xenfb_map_fb()使用fb_len映射前端的帧缓冲区,除非有videoram参数的限制,否则前端就可以使该函数映射任意大小。
xenfb_register_console()和xenfb_on_fb_event()向QEMU的DisplayState对象传送width、height、depth和rowstride参数。如果参数允许的话,DisplayState对象直接操作帧缓冲区(shared_buf为true),否则分配大小为height * width * depth/8的内部缓冲区(shared_buf为false)。
xenfb_on_fb_event()使用width和height参数确定升级事件的区域,然后将该区域传送给xenfb_guest_copy();xenfb_invalidate()将完整的屏幕区域传送给xenfb_guest_copy();除非shared_buf为true,否则xenfb_guest_copy()将参数区域(x,y,w,h)拷贝到内部缓冲区,这会拷贝h块内存;从0开始计算的第i次拷贝将共享帧缓冲区的w * depth/8字节 + offset + (y + i) * row_stride + x * depth/8拷贝到了内部缓冲区 + (y + i) * ds->linesize + x * ds->depth/8。(这里ds->linesize和ds->depth是后端所指定的内部缓冲区)
上述拷贝操作会导致读取读取共享的帧缓冲区并越界写入到内部缓冲区。前端可以利用这个漏洞写入到任意后端内存,导致拒绝服务或入侵特权域。
RedHat已经为此发布了一个安全公告(RHSA-2008:0194-01)以及相应补丁:
RHSA-2008:0194-01:Important: xen security and bug fix update
链接:<a href=“https://www.redhat.com/support/errata/RHSA-2008-0194.html” target=“_blank”>https://www.redhat.com/support/errata/RHSA-2008-0194.html</a>
补丁下载:
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:
<a href=“http://xenbits.xensource.com/xen-unstable.hg?diff/53195719f762/tools/ioemu/hw/xenfb.c” target=“_blank”>http://xenbits.xensource.com/xen-unstable.hg?diff/53195719f762/tools/ioemu/hw/xenfb.c</a>
<a href=“http://xenbits.xensource.com/xen-unstable.hg?diff/9044705960cb/tools/ioemu/hw/xenfb.c” target=“_blank”>http://xenbits.xensource.com/xen-unstable.hg?diff/9044705960cb/tools/ioemu/hw/xenfb.c</a>