安全
概述
本章说明 QEMU 设计上承诺满足的安全要求,以及安全部署原则。
安全要求
QEMU 支持多种用途,安全要求各不相同。社区约定了用户可以依赖的总体要求, 用来界定安全支持范围。
虚拟化用途
包括云、VPS 托管、传统数据中心和桌面虚拟化。这些用途依靠硬件虚拟化扩展, 以接近原生的速度在物理 CPU 安全执行客户机代码。
以下实体视为不可信,即可能存在缺陷或恶意行为:
客户机
面向用户的接口,例如 VNC、SPICE、WebSocket
网络协议,例如 NBD、热迁移
用户提供的文件,例如磁盘镜像、内核、设备树
直通设备,例如 PCI、USB
涉及这些实体的缺陷,会按其能否在实际场景造成损害评估;能造成损害则按安全 缺陷处理。
适用此安全支持政策,必须:
使用 KVM、HVF 等虚拟化加速器
使用下列机器类型之一
其他机器可能也能配合加速器,提高可信工作负载性能,但不提供客户机隔离或 安全保证,属于非虚拟化用途。
按目标架构划分,支持的机器类型为:
- aarch64
virt- i386, x86_64
microvm,xenfv,xenpv,xenpvh,pc,q35- s390x
s390-ccw-virtio- loongarch64:
virt- ppc64:
pseries- riscv32, riscv64:
virt
非虚拟化用途
此类用途包括 TCG 模拟。原则上,TCG 及其设备模拟代码应满足与虚拟化相同的 安全要求,但出于历史原因,大量代码编写时没有考虑这些要求。
目前非虚拟化用途的缺陷不作为安全缺陷处理,用户不得依赖它提供客户机隔离 或任何安全保证。
安全边界范围
即使影响上述虚拟化用途,也并非所有场景都在安全范围内。以下准则用于判断 采用完整安全处理流程,还是视为普通缺陷。
assert/abort: 若触发需要客户机内核权限或 root,是客户机自行造成 的拒绝服务,不视为安全漏洞,最多作为加固问题。若非特权账户可触发, 则可能按安全缺陷处理。
vhost-user/vfio-user 后端: 后端与 QEMU 共同映射共享内存。进程分离 旨在提高运行韧性和灵活性,并支持独立软件提供者,不构成安全边界。因此, 后端缺陷导致 QEMU 崩溃或异常,不按安全漏洞处理,但应作为加固问题修复。
内存分配边界: QEMU 正常情况下也可能使用远超客户机 RAM 的内存。 最坏用量应视为实际上无上限。部署时需考虑内存峰值,并采取措施维持主机 服务。Linux OOM killer 通常终止引发过量使用的进程,提供一定保护。因此, 过度或无界分配通常不列为安全漏洞,但应作为加固问题修复。
客户机行为退化: 某些缺陷使虚拟设备不正常,例如错误的虚拟 IOMMU 无法提供预期隔离。如果攻击需要客户机内核权限或 root,且只使虚拟设备 行为变差,视为自行造成的服务退化,最多是加固问题。若非特权账户可触发, 则可能按安全问题处理。
嵌套虚拟化: 安全范围是防止第二层客户机逃逸到第一层。如前所述, 仅客户机内核/root 可利用、且只影响其自身服务或可用性的情况可能排除。 嵌套 PCI 设备分配时,第二层内核可能触发影响第零层 QEMU 的缺陷。 这些问题应修复,但目前不按安全漏洞分级处理。
低严重性影响: 总体上,判为低影响的问题通常不按安全缺陷处理,也不 分配 CVE,而在时间允许时作为普通缺陷修复。
架构
本节介绍满足安全要求的设计原则。
客户机隔离
隔离是将客户机代码限制在虚拟机内。客户机取得主机执行控制称为虚拟机逃逸。 隔离也包括 CPU、内存、磁盘、网络限额,客户机不得超出资源限制。
模拟设备构成客户机可见的攻击面。客户机不能控制 QEMU,但设备缺陷可能允许 恶意客户机在 QEMU 内执行代码,从而逃逸并以主机 QEMU 进程身份活动。
客户机常相互交互、共享资源。恶意客户机不得控制其他客户机或访问其数据。 除用户明确共享外,磁盘镜像和网络流量必须相互保护。
最小权限原则
每个组件只拥有执行功能所必需的权限。对 QEMU 而言,每个进程只访问所属 客户机的资源。
理想情况下,QEMU 不应访问客户机本身无法访问的资源。这样即使逃逸到 QEMU, 客户机也得不到额外能力,因为它原本就能访问相同资源。
遵循该原则即可满足隔离要求,例如客户机 A 只能访问 a.img,不能访问 B 的 b.img。
现实中,QEMU 必须访问一些客户机不可用的资源,例如主机系统调用。因此逃逸 后,客户机可以进一步调用主机接口。
新功能必须遵循最小权限。技术上无法做到时,应清楚记录风险,让用户理解 启用功能的取舍。
隔离机制
多种机制可实现隔离与最小权限。除 Linux seccomp 外,均由 libvirt 等启动 QEMU 的管理工具部署,且依赖具体平台,下面简述 Linux 情况。
最基本的机制是以非特权用户运行。为方便访问 /dev/net/tun 等设备而用 root 启动,会带来巨大风险。可通过文件描述符传递授权非特权进程访问设备,或 配置 UNIX 组以访问 /dev/kvm、/dev/net/tun 等节点。有些发行版默认已有相关组。
SELinux、AppArmor 在传统 UNIX 进程和文件权限之外施加限制,阻止 QEMU 访问不必要的主机进程和文件。
资源限制和 cgroup 控制器约束 CPU 时间、内存、I/O 带宽等吞吐与用量。
Linux 命名空间让进程、文件系统等资源对 QEMU 不可见,只授予必要资源。
QEMU 的 --sandbox 启用 seccomp,禁用不需要的系统调用,缩小主机内核 攻击面。
敏感配置
用户和管理应用应了解以下可能影响安全的配置。
监视器控制台(QMP 和 HMP)
监视器可动态控制 QEMU 的许多运行行为,众多命令会访问主机文件系统或启动 外部进程。
例如 migrate 可启动任意进程以传输迁移数据流,blockdev-add 可打开任意文件, 作为虚拟磁盘向客户机暴露内容。
除非通过 SELinux、AppArmor 或命名空间另行限制,否则应将控制台视为具有 与 QEMU 运行账户相同的权限。
承载控制台的字符后端同样需要防止恶意第三方未经授权连接或中间人攻击。 许多字符后端不能满足这一要求,不应承载监视器。
一般建议仅通过本机 Unix 域套接字暴露。TCP 后端只有同时启用 TLS 加密和 客户端授权策略时才合适。
监视器是特权控制接口,只应向可信管理程序或用户开放。