我正在考虑在虚拟机(最好是 QEMU)中试验一些 USB 设备。出于安全原因,我不想让它们与主机交互。
我尝试过的事情:
- 不做任何特殊处理。如果连接了 USB 设备,则在 VM 启动之前和 VM 停止之后,以及在 QEMU 运行时热插拔设备之后的短暂时间内(直到 QEMU 认领该设备之前),主机都会受到攻击。
authorized_default
将端口的属性 ( )设置/sys/devices/pci0000:00/0000:00:08.1/0000:05:00.4/usb3/authorized_default
为0
。然后,除了描述符交换之外,设备不会与主机交互,这很好。但是,QEMU 也无法访问该设备。如果我尝试在 QEMU 运行时将authorized
设备的属性 (/sys/devices/pci0000:00/0000:00:08.1/0000:05:00.4/usb3/3-3/authorized
) 设置为1
,则控制权不会转到 QEMU 客户机,而是转到主机。(即使它转到了客户机,在 VM 停止或以其他方式释放设备后,主机也会受到攻击。)
在这些实验中,我总是使用 QEMU-device usb-host,hostbus=3,hostport=3
将物理端口传递给客户机,或者-device usb-host,vendorid=0x04f3,productid=0x0235
将设备传递给客户机,在每种情况下,这两个选项的结果都是相同的。
我想到的一个(未经测试的)解决方案是在我不关心的机器上设置 USBIP 服务器,并将 VM 中的 USBIP 客户端连接到此服务器,但这需要 VM 客户端具有网络访问权限并支持 USBIP。这可能不是问题,但我希望有另一种方法。(现在,我有了一个新想法,也许可以将 USBIP 客户端实现合并到 QEMU 虚拟设备中。这降低了对客户端的要求,同时保证了主机的安全。不过,单机解决方案会更好。)
有没有什么办法可以在单台机器上安全地实现 USB 直通?
编辑:
我发现的另一个选项(并成功测试)是直通整个 USB 控制器。我的笔记本电脑有两个控制器,每个控制器控制总共四个 USB 端口中的两个。只有一个控制器由所需的内置设备(触摸板、蓝牙)使用。另一个控制器仅由相机使用,可以使用固件设置断开连接。这使得该控制器成为直通的理想候选者。不幸的是,这两个控制器与其他 PCI-e 设备共享相同的 IOMMU 组,因此除非我使用 ACS 覆盖补丁(例如在内核中linux-zen
)绕过 IOMMU 组,否则无法进行直通,这可能是一个潜在的安全风险(根据建筑维基链接本文, 和此 Reddit 帖子这就解释了为什么这个补丁是一个非常糟糕的想法)。然而,它却完全按照我的需要工作了。
编辑2: 在阅读了有关 ACS 覆盖补丁的安全性和稳定性影响的更多信息后,我想避免使用它。我可能会与专门的、不安全通过专用的不安全网络到我的安全的主机(具有适当的防火墙)翻译安全的USB/IP 数据包不安全内容不安全VM(反之亦然)。我最终可能会选择的另一个选择是坚持使用没有做任何特别的事选项,因为我将要实验的设备并不是那么恶意。
答案1
有没有什么办法可以在单台机器上安全地实现 USB 直通?
免责声明:我无法评论我将要建议的绝对安全性,如果你真的关心主机的安全/保障,那么不要忘记虚拟机逃逸漏洞是真实存在的...如果您认真对待此事,那么物理上独立的机器将是您的最佳选择。
实现您所要求的最接近的方法(即:将 USB 设备连接到虚拟机,使用接近于零与主机交互)的另一种方法是使用 PCIe 直通将物理 USB Root Hub 直接连接到 VM - 重要的是它是您通过的 PCIe 设备(即:根枢纽或控制器),而不是 USB 设备(即标准USB 集线器)。
如果操作正确,所有相关的 USB 端口和设备将“消失来自主办方,并将出现“在虚拟机中,被视为物理设备(而不是虚拟根集线器)。
您可能需要专用的 USB 附加卡来提供此功能 - 许多附加卡都有一个带有多个端口的单根集线器,但需要具有多个根集线器(理想情况下每个集线器一个端口)的卡 - 将“真实”USB 树传递给虚拟机。
关于配置这一点有很多资源,但需要注意的是,你的系统必须配置为启用 IOMMU,并且它必须可以运行(例如:AMD-Vi 或英特尔的 VT-d)...许多老年人或“桌面“主板无法正确支持此功能。
答案2
您能将设备与主机隔离吗?
据我所知没有(这里是 VMware)。
可以通过的主机硬件设备(通常为 USB)始终可供主机子系统使用。将其分配给客户机只是一种逻辑分配,因此主机和客户机都看不到插入的 USB 驱动器。