AMD 安全的加密虚拟化(SEV)和英特尔信任域扩展(TDX)旨在帮助为虚拟机提供更好的安全性,是两家公司在机密计算方面投资的关键要素。事实证明,他们在VM安全目标上有一个共同的敌人:x86 32位软件。
由于32位软件和潜在的VMM滥用,周四为Linux 6.7合并的补丁正在解决一个安全矢量。Intel TDX和AMD SEV不仅保护VM免受其他VM的侵害,还确保与VMM/Hypervisor本身分离。由于x86 32位语义,在这个日益关注安全的世界中存在问题。其中一块补丁合并昨天,Linux6.7在TDX和SEV上运行时,默认禁用了32位支持。英特尔Linux工程师Kirill Shutemov在补丁消息中解释说:
INT 0x80指令用于32位x86 Linux系统调用。内核期望接收INT 0x80指令导致的软件中断。但是,同一向量上的外部中断触发同一处理程序。
内核将向量0x80上的外部中断解释为来自用户空间的32位系统调用。
VMM可以在任何时间向任意向量注入外部中断。即使对于VMM不受信任的TDX和SEV访客也是如此。
总而言之,这允许不受信任的VMM在任何给定点触发int80系统调用处理。此时客户寄存器文件的内容定义了触发什么系统调用及其参数。它打开来宾操作系统,以便从VMM端进行操作。
默认情况下,禁用TDX和SEV的32位仿真。用户可以使用ia32_emulation=y命令行选项覆盖它。“
舒特莫夫在随后的补丁中已恢复 还有一些额外的变化:
“在TDX上禁用了32位模拟,以防止VMM在向量0x80上插入中断可能造成的攻击。
既然int80_emulation()已经检查了外部中断,就可以取消限制了。
为了区分软件中断和外部中断,int80_emulation()会检查与0x80向量相关的APIC ISR位。对于软件中断,此位将为0。
在TDX上,VAPIC状态(包括ISR)受到保护,不能被VMM操纵。ISR位由微码流在处理发布的中断期间设置。“
从昨天的补丁开始,在AMD SEV下运行的x86 32位软件支持在默认情况下仍然处于禁用状态。
所有这些改进AMD SEV和英特尔TDX安全性以防止VMM滥用INT 0x80的补丁都被设置为从Linux 6.0起支持的内核版本。
On the plus side, these changes for cleaning up the code did lead to the kernel getting rid of a bunch of Assembly-written entry code and replaced by C code.