“行锤”攻击的安全隐患是什么?

信息安全 已知漏洞 记忆
2021-08-15 02:47:53

我刚刚发现了Row Hammer攻击。根据描述,这听起来非常危险,但我想知道有多少百分比的设备实际上受到了这些影响。除了用支持 ECC 的 RAM 替换 RAM 之外,还有什么方法可以保护自己?

3个回答

基本的安全含义是非特权用户可以将他们的访问权限提升到根/内核级别。

谷歌的零项目测试了 2010 年至 2014 年间生产的29 台不同的笔记本电脑,发现 15 台易受攻击,14 台没有。他们确实警告说,这个样本量不足以被认为具有代表性,但仍然暗示这不太可能是一个孤立的问题。

原始的Flipping Bits in Memory without Accessing Them论文表明这个问题要广泛得多:

在我们分析的 129 个 DRAM 模块(包括 972 个 DRAM 芯片)中,我们在 110 个模块(836 个芯片)中发现了干扰错误。尤其是过去两年(2012 年和 2013 年)生产的所有组件都存在漏洞

减轻攻击的唯一真正方法是不要在您的系统上运行任意二进制文件,并且如果其他人可能有敌意,则不允许他们访问您的系统。这显然是共享计算资源(例如大学、托管设施等)的问题。云提供商可能容易受到攻击(据报道,来自 VM 内部的成功内存损坏,但它的可利用性还有待观察)。

使用 ECC 虽然不能保证安全,但可能会降低成功利用的可能性。完整的缓解措施是更新到采用某种防御措施的系统——无论是内存控制器还是主动检测并避免漏洞利用的 DRAM。目前尚不清楚此类控制器或 DRAM 的可用性,但已知它们存在。内存制造商已经意识到这个问题有一段时间了,LPDDR4 的规范包括缓解措施,因此未来的笔记本电脑将受到保护。

ECC RAM 不一定是免疫的;ECC 内存可靠地修复一位翻转并检测大多数两位翻转,这使得攻击更加困难,但在概念上并非不可行。

非 ECC RAM 不一定弱;事实上,根据 RAM 应该如何运行的定义,任何一位翻转都不应该发生。我们在这里谈论的是有缺陷的 RAM:RAM 不能正常工作。令人沮丧的事实是,此类缺陷比通常假设的要普遍得多,因为在正常情况下,此类缺陷不会经常(或根本不会)触发。

解决方案是获得无缺陷的 RAM。根本问题就变成了:我们如何检测RAM 有缺陷?著名的MemTest86工具包括“行锤”测试(至少从 v6 开始,在免费版本中可用)。


对于纯软件解决方案,可以想象由内核完成的“手动刷新”。对于物理 RAM 中的所有页面,一些内核线程会定期执行以下操作:

  • 锁定页面(即,将其标记为用户代码不可访问)。
  • 翻转页面中的所有位,确保缓存与相关操作码刷新。
  • 再次翻转所有位,再次使用缓存刷新。这将恢复页面中的原始数据。
  • 解锁页面。

如果用户态在刷新页面时访问该页面,则陷阱处理程序只是等待刷新完成,然后跳回该进程,以便再次尝试。

双重翻转旨在确保即使是试图遵循实际修改的智能硬件也会刷新数据并因此重写页面(这将重新填充 DRAM 芯片中的潜在井)。

在很大程度上,这个过程会模仿硬件已经为内存刷新所做的事情。那么这将是一个决定多久执行一次的问题;更频繁地刷新意味着在刷新上花费更多的 CPU/RAM 带宽,因此需要进行权衡。是否可以实现可接受的折衷取决于有多少 RAM、RAM 的速度以及 RAM 的缺陷程度。

在任何给定操作系统中的实现留给读者作为练习。我认为这可能会对分页/交换启发式产生重大影响(当分页或交换时,内核会尝试逐出最近未访问的页面,并且此计费由 MMU 本身完成;“刷新线程”将破坏这种信息收集)。

我在 DRAM 上工作了很多年,这是我的一些观点。据我所知,有很多研究试图解决这个问题,其中一些声称有解决方案。但正如我所见,他们中的大多数都没有完全的保护。所以,如果某个黑客能够成功触发这个炸弹,它可能是计算机世界的一颗大炸弹。它不仅是 DDR-3,而且在 2012 年至 2013 年之间制造的都是易受攻击的。实际上它可能发生在所有 DDR-3 甚至 DDR-4 上。这个问题是由当今更高密度的 DRAM 芯片引起的。存储在每个单元格中的数据会导致附近的单元格在对同一单元格进行大量读取时更改其包含。增加Refresh并不能解决问题,它只是减少被击中的机会。但它也会增加系统热量并减慢处理功率。事实上,当这种情况发生时,它变得更容易受到行锤击中。因此,提高刷新率并不是一个好的解决方案。ECC 不会解决问题,它只会让问题变得更加困难,因为 ECC 只能纠正 1 或 2 位错误。抱歉,我还没有看到任何好的解决方案,但如果我知道,我会在这里发布。