当 DRAM 控制器寄存器击穿 CPU 内存隔离:理解 skitter-creek-bath-salts 的风险

2026-08-23 37 预计阅读时间: 1 分钟
来源: infoq.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:11 分钟

CPU 的权限级别通常被视为内存安全边界:普通用户进程不能读取内核、虚拟机监控器或其他租户的数据。然而,安全研究员 Christopher Domas 开发的开源硬件安全工具 skitter-creek-bath-salts 展示了一个更底层的问题:如果非特权软件能够操纵内存控制器中的地址翻译寄存器,CPU 建立的访问隔离可能被绕过。

这类问题的关键不在于某个操作系统 API 配置错误,而在于处理器、内存控制器和物理地址映射之间的信任关系。它因此可能影响云计算平台、机密计算环境以及依赖硬件隔离的安全边界。

内存隔离边界并不只有页表

在常见的操作系统模型中,虚拟地址访问会经过多级转换:

用户虚拟地址
    -> 进程页表
    -> CPU 物理地址
    -> 内存控制器地址翻译
    -> DRAM 地址

操作系统主要管理页表、页权限和虚拟机内存映射。硬件则继续负责把物理地址映射到内存通道、Rank、Bank、Row 和 Column 等 DRAM 位置。

这意味着,内存访问的最终边界不只由页表决定。如果某些内存控制器翻译寄存器能够被不应拥有权限的软件修改,那么攻击者可能改变物理地址到 DRAM 位置的解释方式。处理器仍然按照原有权限检查执行指令,但检查通过后的地址可能被重新导向到受保护区域。

需要注意的是,这并不等同于普通用户可以直接写入任意硬件寄存器。漏洞成立的前提取决于具体处理器、平台固件、寄存器暴露方式、权限配置以及操作系统是否限制了相关访问路径。

skitter-creek-bath-salts 暴露了什么

根据公开摘要,skitter-creek-bath-salts 的核心思路是操纵内存控制器地址翻译寄存器,从而干扰 CPU 的权限边界。这种方式把攻击面从传统的软件漏洞扩展到了硬件配置状态:

  • 攻击者不一定需要先获得内核代码执行权限。
  • 受影响的边界可能不只是一个进程,还可能涉及内核或虚拟机内存。
  • 云平台上的风险取决于租户是否能够触达相关硬件控制接口。
  • 机密计算依赖硬件隔离,因此必须把内存控制器和固件纳入威胁模型。

这类研究的价值在于提醒工程团队:ring 3ring 0 的隔离只是软件执行权限的一部分。真正的安全边界还包括微架构寄存器、固件初始化流程、平台管理接口和物理地址重映射逻辑。

防守方可以怎样做初步排查

在没有明确厂商修复方案之前,防守工作应从资产识别和接口收敛开始。下面的命令不会验证漏洞,也不会修改硬件寄存器;它只用于收集主机信息、检查常见设备节点和记录当前内核日志,适合作为初步排查脚本的起点。

运行前请确认你有主机管理员授权,并根据发行版调整日志和设备路径:

#!/usr/bin/env bash
set -u

printf '%s\n' '== CPU and kernel ==' 
uname -a
lscpu | sed -n '1,35p'

printf '%s\n' '== DMI information ==' 
for f in sys_vendor product_name bios_vendor bios_version; do
  if [[ -r "/sys/class/dmi/id/$f" ]]; then
    printf '%-16s %s\n' "$f" "$(<"/sys/class/dmi/id/$f")"
  fi
done

printf '%s\n' '== Potential low-level device access ==' 
find /dev -maxdepth 1 \( -name 'msr*' -o -name 'mem' -o -name 'port' \) -printf '%M %u:%g %p\n' 2>/dev/null || true

printf '%s\n' '== Relevant kernel messages ==' 
dmesg --level=err,warn 2>/dev/null \
  | grep -Ei 'memory controller|dram|iommu|mtrr|firmware|hardware error' \
  | tail -n 100 || true

排查结果应进入资产清单,而不是直接作为“已受保护”的证明。重点关注以下信息:

  1. CPU 型号、主板型号和 BIOS/UEFI 版本是否位于厂商公告的受影响范围。
  2. 是否存在不必要的低层设备访问权限,尤其是 /dev/mem/dev/msr 等接口。
  3. 云主机、裸机和虚拟机的硬件暴露面是否不同。
  4. BIOS、微码、内核和虚拟化平台是否已经完成更新。
  5. 监控系统是否记录了异常的设备访问、内核模块加载和固件配置变化。

可以通过最小权限规则降低一部分暴露面。例如,下面的 udev 规则只是示意,具体设备节点名称和权限必须依据发行版及厂商文档验证,不能直接当作通用补丁:

# /etc/udev/rules.d/90-restrict-low-level-memory.rules
# 示例:将低层内存访问设备限制为 root 使用。
KERNEL=="mem",  MODE="0600", OWNER="root", GROUP="root"
KERNEL=="msr",  MODE="0600", OWNER="root", GROUP="root"
KERNEL=="port", MODE="0600", OWNER="root", GROUP="root"

应用这类规则前,应确认不会破坏监控、调试或硬件管理组件。更重要的是,设备节点权限收紧只能减少一种访问路径,不能替代 BIOS、微码、内核和云平台层面的修复。

云计算和机密计算需要重新划定边界

对于普通服务器,攻击者可能需要先在主机上执行非特权代码;对于多租户云环境,真正需要回答的问题是:租户代码能否影响宿主机或虚拟机监控器管理的内存控制器状态。

云平台运营方应将以下内容纳入验证范围:

  • 裸机实例与虚拟机实例是否使用不同的寄存器隔离策略。
  • 虚拟机监控器是否允许客户机访问可能间接触达硬件配置的接口。
  • 同一物理主机上的租户是否共享相关内存控制器状态。
  • 主机迁移、重启和固件升级后,寄存器是否被可靠地重新初始化。
  • 机密计算的证明流程是否覆盖了固件、微码和内存控制器配置,而不只是 CPU 安全启动状态。

对于使用可信执行环境的系统,不能只验证“代码运行在隔离区域内”。还需要确认隔离区域之外的特权软件和硬件配置路径不会改变内存访问的实际目标。否则,证明了执行环境的完整性,却遗漏了内存控制器这一关键组成部分。

工程上的采用建议

这项研究不应被简化为“某个工具可以读写内存”的单点问题。更准确的理解是:硬件隔离边界由多个组件共同构成,任何一个可写的底层翻译状态都可能影响上层安全模型。

落地时可以按以下顺序推进:

  • 建立 CPU、主板、BIOS、微码和虚拟化平台的版本清单。
  • 按厂商公告确认具体型号和配置是否受影响。
  • 收紧 /dev/mem/dev/msr/dev/port 以及自定义硬件管理接口的权限。
  • 在测试环境中验证固件、微码和内核更新,不要仅依赖操作系统补丁。
  • 对云平台增加跨租户内存读取和硬件配置篡改测试,但只在授权实验环境执行。
  • 把内存控制器寄存器和地址翻译状态加入机密计算的威胁建模与证明审计。

在漏洞细节和厂商修复仍持续演进时,最稳妥的策略是把这类系统视为“硬件、固件、虚拟化和操作系统共同组成的安全边界”,并为每一层建立可验证的最小权限和更新流程。


相关推荐