操作系统/虚拟化安全知识域:用于内存保护的现代硬件扩展

安全 应用安全
每个表面积的晶体管数量不断增加,使CPU供应商能够在其芯片上放置越来越多的硬件扩展,而上面讨论的那些绝不是现代处理器中唯一与安全相关的扩展。其他示例包括加密单元、内存加密、有效切换扩展页表的说明以及指针身份验证(硬件检测到指针值的修改)。

用于内存保护的现代硬件扩展

此外,虽然分段大多已失效,但除了分页之外,还有许多其他形式的硬件支持用于内存保护。例如,许多机器都支持缓冲区边界检查,有些可以追溯到四分之一世纪或更长时间。但是,为了说明相应的基元,我们将看看现代通用处理器中可用的内容,主要关注英特尔x86家族。这里的重点不是我们认为这个处理器更重要,甚至不是功能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的“信任区”中称为可信执行环境,或者英特尔软件防护扩展(SGX)中的飞地。它们提供的基元略有不同。例如,在SGX安全区中运行的代码旨在成为正常用户进程的一部分。它使用的内存总是在离开处理器后立即加密。此外,SGX还提供硬件支持来执行证明,以便(可能是远程)方可以验证代码是否在安全区中运行以及它是正确的代码。另一方面,ARMTrustZone将运行正常操作系统和用户应用程序的“正常世界”与通常运行自己的较小操作系统以及少量安全敏感应用程序的“安全世界”隔离开来。正常世界中的代码可以调用安全世界中的代码,其方式类似于应用程序调用操作系统的方式。特殊环境(如ARMTrustZone)(或英特尔的SMM模式,稍后讨论)的一个有趣应用是使用它来监控常规操作系统的完整性-希望在它造成严重损害之前检测到任何隐形恶意软件或rootkit。尽管这些受信任环境的各个方面与操作系统安全性明显重叠,但我们认为它们大多超出了此知识领域的范围。我们还应该注意到,近年来,硬件可信执行环境提供的安全性一再被各种侧信道刺穿,这些侧信道从所谓的安全世界泄漏信息。

再次切换齿轮,可能是操作系统没问题,但硬件不是。恶意或故障硬件可能会使用系统的直接内存访问(DMA)来读取或覆盖内存中它们无法访问的敏感数据。此外,对于某些标准(例如USB-C上的Thunderbolt),计算机的PCIe链路可能会直接暴露在用户插入计算机的设备中。不幸的是,对于用户来说,很难确定看起来像显示器电缆或电源适配器的东西不包含一些旨在破坏计算机的恶意电路。作为部分补救措施,如今大多数架构都带有特殊的MMU,用于与设备之间传输的数据。该硬件称为IOMMU,用于将设备虚拟地址映射到物理地址,完全模仿图2中所示的基于页面的保护。2,但现在用于DMA设备。换句话说,设备可以访问虚拟内存地址,IOMMU将其转换为实际物理地址,检查权限,并在页面未映射到设备或保护位与请求的访问不匹配时停止。虽然这样做提供了一些针对恶意设备(或驱动程序)的保护措施,但重要的是要认识到IOMMU旨在促进虚拟化,实际上不应被视为适当的安全解决方案。有很多事情可能会出错。例如,管理员可能想要撤销设备对内存页面的访问权限。由于更新IOMMU页表是一个缓慢的操作,因此操作系统延迟此操作并将其与其他操作一起批处理的情况并不少见。结果是,可能有一小段时间窗口,在此期间设备仍然可以访问内存页面,即使它看起来这些权利已被撤销。

最后,我们可以观察到,每个表面积的晶体管数量不断增加,使CPU供应商能够在其芯片上放置越来越多的硬件扩展,而上面讨论的那些绝不是现代处理器中唯一与安全相关的扩展。其他示例包括加密单元、内存加密、有效切换扩展页表的说明以及指针身份验证(硬件检测到指针值的修改)。毫无疑问,未来几代将出现更多功能,操作系统将不得不进行调整才能以有意义的方式使用它们。这些问题的更广泛观点可以在硬件安全CyBOK知识领域中找到。

责任编辑:武晓燕 来源: 河南等级保护测评
相关推荐

2023-01-27 09:17:02

操作系统虚拟化内存

2023-01-09 00:08:37

2023-02-07 00:24:24

2023-01-08 00:31:14

2023-02-02 00:06:06

2023-01-31 00:10:32

2023-02-03 00:14:43

2018-07-27 05:08:58

2012-09-27 09:41:31

虚拟化

2010-11-17 10:14:13

Windows 8虚拟化

2009-06-17 15:39:00

本机内存硬件限制虚拟内存

2023-02-06 00:26:02

2011-03-28 16:27:49

现代网络操作系统网络虚拟化

2010-04-14 17:54:06

2013-03-22 09:05:48

操作系统虚拟化

2010-04-20 17:34:25

Unix操作系统

2009-02-17 17:09:59

虚拟化操作系统服务器

2020-03-10 19:34:08

CPU虚拟化调度

2020-12-02 17:58:33

LinuxKubernetes操作系统

2009-02-17 15:57:38

虚拟化传统操作系统威胁
点赞
收藏

51CTO技术栈公众号