新进程中的全内存加密如何防止 DMA 攻击?

信息安全 加密 身体的 记忆 tpm
2021-08-12 22:14:29

即将推出的 Intel CPU 有TME,当前的 AMD 处理器有SME

这些是全内存加密技术,可防止冷启动攻击等物理攻击

两者都支持从启动时加密整个 RAM,因此无需修改软件即可支持它们。

结合全盘加密和TPM 1(它解决了启动密钥问题,可以保证在没有用户输入的情况下启动未修改的软件一直到解锁磁盘加密),这应该允许在完全不受信任的环境中操作和安全启动机器,而无需人身安全(如有错误请纠正我)。机器要么启动未修改的软件,要么拒绝启动;由于全内存加密,无法在运行时提取加密密钥。

我不清楚这些技术能在多大程度上防止DMA 攻击通常,您可以通过这种攻击直接读取整个机器的内存,例如插入 PCIe 端口。如果所有内存都已加密,那么您可能不会。

  • GPU 等依赖 DMA 的设备在全内存加密的情况下如何工作?
  • 使用这样的设备会破坏全内存加密的好处,从而破坏没有物理安全的安全吗?

谢谢!


1请注意,传统的主板上 TPM 容易受到物理TPM 重置攻击总线间谍攻击,但在上述新处理器(例如 AMD EPYC)上,TPM 被集成 到处理器芯片中,因为它是 AMD SPS或 Intel的一部分分别,所以“弄乱电缆”应该是非常困难的。

1个回答

内存加密如何影响 DMA 攻击?

全内存加密并非旨在防止 DMA 攻击。这就是 IOMMU 的用途。IOMMU 使用一种用于DMA Remapping或 DMAR 的 ACPI 表进行配置。此表包含连接到PCH的每个支持 DMA 的设备使用的区域列表。然后,IOMMU 将限制对这些区域的内存访问,并且仅限于这些区域:

DMA 重新映射

GPU 等依赖 DMA 的设备在全内存加密的情况下如何工作?

有两种技术可以支持 DMA。第一个是利用 PCIe 上的内存访问仍然通过 PCH 的事实,这意味着芯片组有机会透明地加密和解密 DMA 缓冲区。另一种技术是简单地将用于 DMA 的页面标记为未加密。后一种技术可以防止 DMA 攻击,但很可能会实施前者。后一种技术更常见于基于实验软件的内存加密,例如vCageHyperCrypt正如我稍后解释的那样,这根本不是问题。

根据您提供的 TME 链接,在未提供加密的情况下支持单个排除范围。这个范围是为诸如 BIOS 之类的东西而设计的(它的组件在地址范围内加载得非常低)。由于它指定仅支持单个范围,这意味着它不能用于 DMA 缓冲区,因为它们分布在多个范围中。

此外,您应该将 TME 与TSME进行比较,而不是 SME。常规 SME 仅加密单个页面。另一方面,TSME 的行为更像 TME,它对几乎所有系统内存进行透明加密,因此软件无需明确支持该功能。

使用这样的设备会破坏全内存加密的好处,从而破坏没有物理安全的安全吗?

一点也不!当内存加密到位时,数据将被透明地解密并在设备请求时通过 PCIe 总线发送。这实际上与内存加扰没有什么不同,内存加扰是一种通过使用称为LFSR的算法加密内存来减少 DRAM 芯片上的 di/dt 的技术这个算法很弱,所以不用于保密,只是为了提高硬件的可靠性。TME 和 SME 只是将这一点提升到另一个层次,使用硬件加速加密和真正的强密码,而不是弱 LFSR 算法。

随着总线变得越来越快,1 或 0 的连续突发对设备造成很大压力。这可能会导致严重的、类似rowhammer 的干扰(一百万个1 中的单个0 不会很高兴)。它还可能导致电涌,因为每个充电的电容器都需要每 64 毫秒充电一次。内存加扰通过确保平均而言,无论实际存储的逻辑数据如何,存储在物理 DRAM 电容器中的每个位都有相同的机会成为 1 或 0,从而避免了这个问题。这在任何方面都不是 DRAM 独有的,并且被广泛的高速总线所采用。

请注意,传统的主板上 TPM 容易受到物理 TPM 重置攻击 [...]

一旦您可以不受限制地物理访问机器,维护完整性就变得非常非常困难。攻击者可以简单地连接JTAG 探针并像木偶一样控制处理器。

DMA 攻击和 DMA 是如何工作的?

那么,如果您插入恶意 PCIe 设备会发生什么?首先,计算机将配置设备。如果驱动程序请求它(如果 PCIe 设备假装它是 WiFi 卡,通常就是这种情况),它将被赋予bus master,这允许它发起 DMA 攻击(这通常也称为恶意总线主控这个原因)。每个 PCI 或 PCIe 设备都是所谓的IOMMU 组的一部分。至少在没有 ACS 的情况下(参见Intel 文档中的第 4.3 节),每个 IOMMU 组都有自己的专用内存范围,并且该组中的任何设备都将受到相同的限制。

取自我问的一个问题,您可能会查看您的内核日志并看到如下内容:

DMAR: Setting identity map for device 0000:00:1d.0 [0xa95dc000 - 0xa95e8fff]
...
iommu: Adding device 0000:00:1d.0 to group 11

这意味着第 11 组中的任何设备,包括0000:00:1d.0,都只能从地址读取物理内存0xa95dc0000xa95e8fff内核配置为查看该内存区域以查找需要在它和设备之间共享的任何 DMA 缓冲区。

我描述了 DMA 的工作原理以及为什么在另一个答案中需要它。相关部分:

了解 DMA 存在的原因及其工作原理可能很有用。当支持 DMA 时,会设置一个专用的内存区域,并且控制器(无论是 ICH 还是 PCMCIA)直接将通过 IDE 读取的数据写入该内存区域(使用基于 DMA 的 UDMA 或 MDMA 协议)。从 CPU 的角度来看,它发出一个读取数据的命令,然后可以去做自己的事情,因为它知道一旦进程完成就会异步发出中断警报,请求的数据就在内存中等待它. 同样,如果它想通过 IDE 进行写入,它可以简单地用所需数据填充该内存区域并告诉控制器接受它。就像读取数据时一样,CPU 可以自由地去做自己的事情,而无需对传输进行微观管理。任务完成后,它将立即收到中断警报。这就是为什么在设备(GPU、NIC、使用 IDE 或 SATA 的存储设备等)之间传输数据的速度如此之快,并且需要如此少的 CPU 来执行。

IOMMU 的安全性如何?

有一些方法可以绕过 IOMMU 或降低其有效性。例如,英特尔上使用缺少 x2apic 和中断重映射的 VT-d1 的旧 IOMMU 很容易受到攻击,而地址转换服务或 ATS可以绕过限制然而,正确实现的 IOMMU 将完全防止 DMA 攻击读取任意系统内存。这是您将依赖的保护免受 DMA 攻击,而不是内存加密。内存加密旨在防止被动总线嗅探和冷启动攻击。

x86 上的内存管理非常复杂,其规范包括数千页密集的技术信息。所有这些复杂性都会产生奇怪的安全隐患,例如允许 GPU重新配置 IOMMU以降低安全性。虽然理论上,IOMMU 将阻止设备访问非法内存范围,但这项技术背后的复杂性以及随之而来的潜在漏洞是无止境的。

如果这还不够糟糕,IOMMU 依赖于限制设备的 DMAR 表由计算机的 OEM 管理。计算机附带损坏的 DMAR 表的情况并不少见,这会迫使计算机完全禁用 DMA 攻击保护。出于这个原因,一些操作系统(例如 Debian GNU/Linux)实际上默认禁用了 IOMMU!