Mac 电脑的直接内存访问保护
为了在诸如 PCIe、FireWire、雷雳和 USB 等高速接口上实现高吞吐量,电脑必须支持外围设备的直接内存访问 (DMA)。也就是说,外围设备必须能够在没有 CPU 持续参与的情况下读取和写入 RAM。自 2012 年以来,Mac 电脑采用了多项技术来保护 DMA,实现了 PC 领域内最好且最为全面的 DMA 保护。
搭载 Apple 芯片的 Mac 的直接内存访问保护
Apple 片上系统针对系统中的每个 DMA 代理(包括 PCIe 和雷雳端口)包含一个输入/输出内存管理单元 (IOMMU)。由于每个 IOMMU 有自己的一套地址转换表以转换 DMA 请求,通过 PCIe 或雷雳连接的外围设备只能访问明确映射给其使用的内存。外围设备无法访问属于系统其他部分(如内核或固件)的内存或者分配给其他外围设备的内存。如果 IOMMU 检测到外围设备试图访问未映射给该外围设备使用的内存,会触发内核崩溃。
基于 Intel 的 Mac 的直接内存访问保护
基于 Intel 且支持 Intel 定向 I/O 虚拟化技术 (VT-d) 的 Mac 电脑在启动过程的非常早期阶段会初始化 IOMMU(启用 DMA 重映射)然后中断重映射,以减少各种类别的安全性漏洞。Apple IOMMU 硬件开始以默认拒绝策略运行,因此系统接通电源时,IOMMU 会立即自动开始阻止来自外围设备的 DMA 请求。软件初始化 IOMMU 后,IOMMU 将开始允许外围设备想要访问明确映射给其使用的内存区域的 DMA 请求。
【注】中断 PCIe 重映射在搭载 Apple 芯片的 Mac 上并非必要,因为每个 IOMMU 只处理自己外围设备的 MSI。
自 macOS 11 起,如果辅助 DMA 的 UEFI 驱动器与外部设备配对,所有搭载 Apple T2 安全芯片的 Mac 电脑都会在受限的 Ring 3 环境中运行此类固件。此属性有助于减少恶意设备在启动时以非预期方式与 UEFI 驱动器交互可能导致的安全性漏洞。它尤其减少了驱动器处理 DMA 缓冲时导致的漏洞的影响。