免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

偷看CPU的保险箱:skitter-creek-bath-salts从C6 stash挖出的5个隐藏寄存器

偷看CPU的保险箱:skitter-creek-bath-salts从C6 stash挖出的5个隐藏寄存器 偷看CPU的保险箱skitter-creek-bath-salts从C6 stash挖出的5个隐藏寄存器【免费下载链接】skitter-creek-bath-saltsUnlocking _everything_ on the CPU with DRAM scrambling项目地址: https://gitcode.com/gh_mirrors/sk/skitter-creek-bath-saltsskitter-creek-bath-salts 是一个用 DRAM scrambling内存地址打乱技术解锁 CPU 保护区域的开源安全研究项目它重编程内存控制器的底层地址翻译让 PSP 私有内存、SMM、微码补丁以及 CPU 深睡时藏起来的 C6 stash保险箱一览无余。这篇文章带你快速看懂它是如何从 C6 stash 里挖出 5 个平时看不见的 CPU 寄存器状态以及为什么这 5 个寄存器只是开胃菜。C6 stash是什么CPU深睡前的寄存处CPU 核心进入 C6 深度休眠时会被断电寄存器状态无处安放——于是 CPU 会把每个核心的完整 x86 架构上下文寄存到 DRAM 顶部的一段隐藏保留区里等唤醒时再恢复。这一段内存就是C6 stash位于物理内存顶端TOP_MEM 之上对操作系统、ring-0 甚至 CPU 自身都不可见在 AMD Family 16h 平台上它是一块8 MiB的保留区从 userspace/dram_carveouts.c 可以看到它紧挨着 8 MiB 的 PSP 私有内存两者加起来就是内存顶部的保险箱区每个休眠核心占一个16 KiB 保存区测试机上 4 个核心分别落在CC6_BASE {0, 0x4000, 0x8000, 0xc000}。换句话说CPU 把最私密的寄存状态明文放在了 DRAM 的电容里只是钥匙地址翻译藏在内存控制器深处。一张表看懂从C6 stash挖出的5个寄存器作者对每个核心保存区的逐字节扫描先顺手命中了这 5 个经典 x86 状态以下为例测平台上 core 0 的值完整命令见 README.md 的 C6 章节保存区偏移寄存器/状态挖出的值core 00x8b0GS 基址 / per-cpu base0xffff9be4e36000000x9a0CR3页表根0x0fd460000x9b8IA32_APIC_BASE0xfee009000xa38可变 MTRRbase/mask0x6f000000 / …08000xb10保存的 RIP0xffffffff8f3a0029有意思的细节藏在 APIC_BASE 那一列4 个核心里只有 core 0 的值是0xfee00900BSP 位被置位其余三个都是0xfee00800——引导处理器和它的三个打工AP就这样在保险箱里被当场抓包。但这 5 个寄存器 ring-0 本来就能读真正让研究者兴奋的是保存区里其他东西ring-0 根本摸不到、也从未被公开文档讨论过的 CPU 内部寄存器状态正躺在那里等人行走。三步解锁如何读取C6保护内存完整命令清单整个流程分三步工具都在 userspace/ 目录跑之前请确认目标平台项目只在 AMD Family 16h 上验证过平台自检./userspace/platform_check——不在支持列表上的机器直接退出避免白折腾定位保险箱sudo ./userspace/dram_carveouts --region cc6会输出CC6_BASE和CC6_SIZEuserspace/dram_carveouts.c 里封装了CC6 位于 TOP_MEM0这一布局规则倒出数据用 userspace/dram_dump.c 通过已求解的别名映射读取sudo ./userspace/dram_dump --protected-pa $CC6_BASE --length 0x10000 \ $(printf -- --map %s data/maps/2x4gb_*.map) cc6.bin映射文件data/maps/下的.map是破解钥匙由 analysis/gather_aliases.py 收集地址别名、再交给 analysis/unspaghettify.py 用 z3 解出。仓库自带多种内存配置1x1gb ~ 2x4gb的现成映射按你机器的 DIMM 布局选对应前缀即可没有匹配的拓扑就按 USAGE.md 自己烤一份。为什么这些寄存器只是冰山一角C6 stash 保存区里最值钱的其实是0x1800 处的微码补丁副本核心掉入 C6 时易失的微码 RAM 会熄灭CPU 把加载中的补丁存进 stash唤醒时重新灌回——所以这一份副本正是核心下次醒来要执行的东西。作者从 stash 里抠出 0x5f0 字节后与系统固件里的微码比对fam16h 命中 68/94 个数据块确认抓到了正在跑的微码详见 README.md。再往下就是 userspace/dram_poke.c 的主场读得进去的别名同样写得进去。PSP 私有内存fTPM 的 RSA 引擎就住在这里、SMM 的 SMRAM都已被同一套 DRAM scrambling 管道逐一解锁——正如项目口号所说翻转内存控制器最后一个环节的一位保险箱里的一切都敞开了。动手前的检查清单与注意事项✅ 仅在自己的硬件上做实验DRAM_RW会实时改动内存控制器状态系统可能不稳定务必备好断电重启手段✅ 全程需要 root 权限先跑./userspace/platform_check排除不支持的平台✅ 想从零构建环境git clone https://gitcode.com/gh_mirrors/sk/skitter-creek-bath-salts后执行make构建 kernel/spaghettify.ko 内核模块与全部用户态工具✅ 完整工具链参数与原理见 USAGE.md快速上手示例见 README.md。一句话总结CPU 把秘密交给 DRAM 保管却忘了最底层的地址翻译可以被重编程。skitter-creek-bath-salts 证明保险箱的锁装在一致视图上而打乱坐标之后锁形同虚设。 【免费下载链接】skitter-creek-bath-saltsUnlocking _everything_ on the CPU with DRAM scrambling项目地址: https://gitcode.com/gh_mirrors/sk/skitter-creek-bath-salts创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表