当前位置: 首页 > 科技观察

OS-VirtualizationSecurityKA-ModernHardwareExtensionsforMemoryProtection

时间:2023-03-12 08:20:29 科技观察

ModernHardwareExtensionsforMemoryProtection此外,虽然分段大部分已失效,但除了分页之外还有许多其他形式的硬件支持内存保护。例如,许多机器支持缓冲区边界检查,有些机器可以追溯到四分之一个世纪或更早。然而,为了说明相应的原语,我们将看看现代通用处理器中可用的内容,主要关注Intelx86系列。这里的重点不是我们认为这个处理器更重要,甚至是X或Y特性在未来会很重要(这是有争议的,很难预测),而是这仍然是一个非常活跃的领域今天的硬件开发。作为第一个例子,考虑命运多舛的英特尔内存保护扩展(MPX),它增强了英特尔的主力处理器以确保数组指针不会偏离数组边界(防止缓冲区溢出等漏洞被利用)。为此,一组新的小寄存器可以存储少量数组的下限和上限,并且新的MPX指令会在取消引用指针之前检查数组指针的值是否越界。即使在仅在用户空间中使用MPX的系统中,操作系统也可以发挥作用,例如,在遇到缓冲区边界违规时处理硬件引发的异常。MPX因这些边界寄存器太少而受到严厉批评,导致性能开销很大。此外,MPX不支持多线程,这可能会导致旧代码中的数据竞争。有人可能会争辩说MPX是硬件供应商试图向他们的CPU添加新的内存安全功能的一个很好的例子,不幸的是,这并不总是成功的。最近,英特尔在其处理器9中添加了内存保护密钥(MPK)。英特尔MPK允许将PTE(图2)中以前未使用的四个位设置为16个“密钥”值之一。此外,它添加了一个新的32位寄存器,每个键包含2位,以指示是否允许读取或写入标有该键的页面。MPK允许开发人员跨少量(在本例中为16个)保护域对内存进行分区,例如,仅允许特定的加密库访问加密密钥。虽然非特权用户进程可以更新寄存器的值,但只有特权操作系统代码才能用键标记内存页。一些处理器设计支持更高级别的内存保护,使用ARM术语我们称之为内存标签扩展(MTE10)。这个想法简单而强大。处理器为每个对齐的内存块(其中一个块为16字节)分配硬件中所谓的“标记”。同样,每个指针也得到一个令牌。标记通常不是很大,比如4位,所以它们可以存储在64位指针值的最高字节中,我们实际上并没有真正使用它(事实上,ARM支持顶部字节忽略功能,使硬件显式屏蔽上面的最高字节)。每当一个程序分配N字节的内存时,分配器将分配四舍五入为16字节的倍数,并为其分配一个随机标记。它还将相同的标记分配给指向内存的指针。从现在开始,只有当指针中的标记与它所指的内存的标记匹配时,才允许取消引用指针,从而有效地防止了大多数空间和时间内存错误。同时,一些处理器,尤其是低功耗设备中的处理器,甚至根本没有成熟的MMU。相反,它们有一个更简单的内存保护单元(MPU),它仅以类似于上面讨论的MPK功能的方式保护内存。在MPU设计中,操作系统定义了许多具有特定内存访问权限和内存属性的内存区域。例如,ARMv8-M处理器上的MPU最多支持16个区域。同时,MPU监控处理器的所有内存访问(包括指令获取和数据访问),并在检测到访问违规时引发异常。请注意,在上面,我们假设操作系统需要保护免受不受信任的用户应用程序的侵害。当操作本身不受信任时,会出现一种特殊情况。也许您正在受损操作系统或云中运行对安全敏感的应用程序,并且您不确定是否信任云提供商。通常,您可能希望在不信任任何其他软件的情况下保护您的数据和应用程序。为此,处理器可以提供硬件支持以在安全、隔离的环境中运行极其敏感的代码,在ARM的“TrustedZone”中称为可信执行环境,或者在Intel的软件保护扩展(SGX)中即时运行。土地。它们提供略有不同的原语。例如,在SGX飞地中运行的代码旨在成为普通用户进程的一部分。它使用的内存一离开处理器就始终被加密。此外,SGX提供硬件支持来执行证明,以便(可能是远程的)一方可以验证代码是否在enclave中运行并且它是正确的代码。另一方面,ARMTrustZone将运行正常操作系统和用户应用程序的“正常世界”与通常运行其自己的较小操作系统和少量安全敏感应用程序的“安全世界”分开。正常世界中的代码可以以类似于应用程序调用操作系统的方式调用安全世界中的代码。ARMTrustZone(或Intel的SMM模式,稍后讨论)等特殊环境的一个有趣应用是使用它来监视常规操作系统的完整性——希望在它造成严重破坏之前检测到任何隐蔽的恶意软件或rootkit。虽然这些可信环境的各个方面与操作系统安全性有很大的重叠,但我们认为它们大多不在本知识领域的范围之内。我们还应该注意到,近年来,硬件TEE提供的安全性一再被各种侧通道所破坏,这些侧通道从所谓的安全世界泄露信息。再次切换齿轮,可能是操作系统很好,但硬件不是。恶意或故障硬件可能会使用系统的直接内存访问(DMA)来读取或覆盖内存中它们无法访问的敏感数据。此外,对于某些标准(例如USB-C上的Thunderbolt),计算机的PCIe链路可能会直接暴露给用户插入计算机的设备。不幸的是,用户可能很难确定看起来像显示器电缆或电源适配器的东西不包含一些旨在损坏计算机的恶意电路。作为部分补救措施,当今的大多数架构都带有一个特殊的MMU,用于传输到设备和从设备传输的数据。这种称为IOMMU的硬件用于将设备虚拟地址映射到物理地址,完全模仿图2.2中所示的基于页面的保护,但现在用于DMA设备。换句话说,设备可以访问虚拟内存地址,IOMMU将其转换为实际物理地址,检查权限,如果页面未映射到设备或保护位与请求的访问不匹配,则停止。虽然这样做可以提供一些针对恶意设备(或驱动程序)的保护,但重要的是要认识到IOMMU旨在促进虚拟化,实际上不应被视为适当的安全解决方案。有很多事情都可能出错。例如,管理员可能想要撤销设备对内存页面的访问权限。由于更新IOMMU页表是一项缓慢的操作,因此操作系统延迟此操作并将其与其他操作进行批处理的情况并不少见。结果是可能会有一小段时间,在此期间设备仍然可以访问内存页面,即使看起来这些权限已被撤销。最后,我们可以观察到,单位表面积晶体管数量的增加使CPU供应商能够在其芯片上放置越来越多的硬件扩展,而上面讨论的绝不是现代处理器中唯一与安全相关的扩展。其他示例包括密码单元、内存加密、有效切换扩展页表的指令和指针验证(硬件检测指针值的修改)。毫无疑问,未来几代人会出现更多功能,而操作系统将不得不进行调整以以有意义的方式使用它们。在硬件安全CyBOK知识区中可以找到关于这些问题的更广泛的视角。