如何确保一段代码永远不会离开CPU缓存(L3)?

时间:2013-10-25 13:41:06

标签: cpu low-level cpu-cache hypervisor trusted-computing

最新的英特尔XEON处理器拥有30MB的L3内存,足以容纳薄型1管理程序。

我有兴趣了解如何在CPU中保留这样的Hypervisor,即防止被刷新到RAM,或者至少在发送到内存/磁盘之前加密数据。

假设我们在裸机上运行,​​我们可以使用DRTM(延迟启动)来引导它,例如,我们从不受信任的内存/磁盘加载,但是如果我们可以解密()用于解密操作系统的秘密,并且在设置了适当的规则以确保发送到RAM的任何内容之后发生的秘密,我们只能加载真实的操作系统。加密。

P.S。我知道TXT的ACEA又称ACRAM(认证代码执行区域又称认证代码RAM)据说有这样的保证(即它限制在CPU缓存中)所以我想知道是否可以在此周围做一些技巧。

p.p.s。这似乎超出了目前的研究范围,所以我实际上并不确定答案是否可行到这一点。

1 个答案:

答案 0 :(得分:8)

你的问题有点模糊,但似乎可以归结为你是否可以将缓存行置于Xeon的锁定状态。答案似乎是否定的,因为在英特尔64或IA-32的英特尔文档中没有提到这样的功能......至少对于公开的型号而言。如果你可以在英特尔投入几百万美元,你可能会得到一个具有这种功能的定制Xeon。英特尔现在正在进入定制处理器业务。

缓存锁定通常在嵌入式处理器上可用。与许多ARM处理器等一样,英特尔XScale也具有此功能。

请注意,缓存锁定并不意味着永远不会在RAM中找到缓存的数据/指令。您似乎想要的是一种安全的私有内存(不是缓存),可能在微码级别。但这不是缓存,因为它与缓存的定义相矛盾......正如您可能知道的那样,过去十年中制造的每个Intel CPU都具有可更新的微码,它在CPU中相当安全地存储,但您需要拥有正确的加密签名密钥,用于生成cpu接受的代码(通过微代码更新)。您看起来想要的是相当于它,但是在x86 / x64指令级而不是微码级。如果这是您的目标,那么许可x86 / x64兼容的IP内核并添加加密保护的EEPROM就可以了。

未来的英特尔软件保护扩展(SGX),您在进一步的评论中提到(在您的问题之后,通过隐形物品实验室链接),并未解决您的管理程序代码永远不会以明确的方式存储在RAM中的问题。这是在新加坡交易所设计的,因此可以在被封锁之前扫描代码以查找病毒等。

最后,我无法评论私人核心的技术,因为我无法找到他们所做的真实技术描述。有关启动网站的Twitter评论和新闻文章没有提供这一点,他们的网站也没有。他们的商业模式归结为“相信我们,我们知道我们做什么”。我们有一天可能会看到他们的东西的真实安全描述/分析,但我现在找不到它。他们声称“PRISM证明”可能会让某人在NSA内部轻笑......

重要更新:显然可以在x86世界中实际禁止(整个)缓存写回RAM。这些是官方未记录的模式,在AMD中称为“缓存为RAM模式”,是英特尔的“无填充模式”。更多信息https://www.youtube.com/watch?v=EHkUaiomxfE英特尔(至少)保留了以https://software.intel.com/en-us/forums/topic/392495中讨论的奇怪方式打破“功能”的权利。

更新2:2011联想专利http://www.google.com/patents/US8037292讨论在Intel CPU上使用较新的(?)No-Eviction模式(NEM)将BIOS加载到CPU的缓存中。该方法可以用于其他类型的代码,包括主管。但是有一个很大的警告。除已经缓存的代码之外的代码运行速度非常慢,所以我不认为这在启动过程之外真的可用。有一些coreboot代码显示了如何启用NEM(https://chromium.googlesource.com/chromiumos/third_party/coreboot/+/84defb44fabf2e81498c689d1b0713a479162fae/src/soc/intel/baytrail/romstage/cache_as_ram.inc