内存不刷新会怎样?内存的物理攻击和旁路攻击
美国经济学家泰勒·科文2011年在《大停滞》中断言,人们已经摘完“所有低垂的果实”。同样的情况也发生在黑客界,曾经轻轻松松在充满漏洞的Windows上任意胡为的时代一去不复返了,Windows 10的自动更新甚至让大部分杀毒软件都成了摆设,系统的漏洞很快就可以得到弥补。在Windows和Linux操作系统上寻找漏洞越来越困难,黑客们慢慢地把目标瞄准了BIOS/固件甚至是硬件这些难啃的骨头。在BIOS界,安全问题已经变成重中之重。在发现漏洞后,如何像win10操作系统一样用push的方法分发漏洞补丁给所有的电脑用户,这个问题在考验安全专家的智慧。
在我脑海里,黑客们的画面是一群躲在小房间里,在沙发上一边往嘴里塞垃圾食物,一边不停诅咒的Nerd。长时间的缺乏锻炼和闭关,让他们都变成了不修边幅的大胖子。唯有如此,他们才能熬过漫长的黑夜,研究汇编代码,不停地尝试寻找漏洞。但我必须承认,在知道了他们充满创意的物理攻击和旁路攻击手段,让这种印象一扫而光。尽管他们让我的工作变得更加困难,还是得承认,他们充满创意,可以说是十分酷了。今天我就来给大家介绍两种典型的和内存相关的攻击和防守手段:一种是物理攻击cold boot,把内存迅速拔下,插到另一个内存读取器来分析密码等关键数据;一种是旁路攻击,也就是著名的row hammer。
ColdBook攻击
等等,拔下内存,内存没电内容不是丢失了吗,何来读取出来呢?DRAM能够存贮数据,实际上它的内存单元可以看作一个个小电容:
每个单元由一个电容和一个晶体管组成。电容负责存储,充过电时是1,没充过电是0,这就是内存是如何存储数据的。晶体管是个开关,用于选中该电容。正是因为内存每个单元如此简单,才能如此大规模组织起来,形成低价而密度很高的内存颗粒。
电容的问题是会慢慢放电(fading),这个过程叫做Decay:
所以要过一段时间就充电。JEDEC规定每过64ms就要refresh一次,也就是充电一次,这个由内存控制器来完成。这个64ms实际上是个余量非常大的时间间隔,你有没有想过如果我们不给内存刷新会发生什么?有人做过一个实验(参考资料1):
内存的Decay[Halderman et al., Lest We Remember: Cold Boot Attacks on Encryption Keys, 2008]
一张蒙娜丽莎的灰度图像,不刷新(充电),在间隔5秒、30秒、60秒和5分钟后读出来的样子,可以看到5秒钟后读出来,几乎看不出来有什么损失,甚至在1分钟后还可以勉强看出原理的样子,5分钟后才变成了黑白条(想想为什么不是全黑?)。也就是5秒钟,我们把这个内存从内存条拔下来,插到另一个内存读取器上就可以读出几乎全部内容!令安全问题雪上加霜的是,电容的放电过程随温度降低而下降,Decay的过程也随之变慢:
这是一个不冷冻(红框)和冷冻到零下50度(绿框)的数据错误对照表。可以看出60秒后,数据错误从41%下降到0,甚至在300秒(5分钟)后,数据错误率也只有0.000095,几乎可以忽略。于是一个天才的物理攻击计划产生了:
1.你在笔记本计算机上输入了银行密码。黑客派出美女把你吸引到另一个房间:
2. 你在丧失理智之前,聪明的锁住了电脑。因为你知道你有开机密码和Windows密码,而密码绝对安全,没人可以在不关机的情况下进入Windows。Bitlocker可以保证硬盘被拿走也没用。这下可以看看美女到底想干啥。
3.黑客物理上得到了你的笔记本。他拿出了小小的冷冻喷罐:
4. 轻轻松松把内存冷冻后,取下放入冷罐:
5. 换上一个另一个内存在笔记本上。冷冻的内存拿到另外一个地方进行分析:
6. 你回来发现电脑死机了,同时似乎有点水汽。哪来的水呢?你陷入了深深的思索。
7. 黑客从内存中导出(dump)所有的内容。开始脱机分析,找到被加密的密码,开始解密(详见参考资料1,也比较有意思)。
8. 未来的某天,你的账号金钱莫名失踪,你欲哭无泪。
作为意志不坚定的我,想想就脊背发凉。如何防止这种物理攻击呢,不近女色?其实还有更好的办法,TPM组织提出了MOR特性。其原理是启动后,操作系统发现内存有秘密后,会让硬件锁住内存,这种锁住,只有在同一台机器上再次启动该操作系统才能解开,而BIOS在下次开机后会把所有内存清零。这下轮到黑客欲哭无泪了。
Row Hammer
别被名字欺骗,Row hammer并不是物理工具,而是旁路攻击:
内存单元密密麻麻挤在一起:
Row Hammer的原理是:我们访问某个Row后,会在它周围形成电场,会让它周围的Row的内容decay变快。如果我们大量重复访问该Row,它的旁边row decay会变得快到64ms的刷新频率都赶不上,从而我们可以改变旁边的row的内容。这就是Row Hammer名字的由来:就像用锤子反复砸某个Row。
也许你会说既然可以访问内存,干嘛不直接访问/修改想要改变的内存呢?也许黑客程序只有Ring 3的访问级别,而目标内存优先级比较高;也许目标内存在trust zone或者SGX内存中,只能旁敲侧击。
业界有很多方法来对付row hammer。一个简单的办法就是加快刷新速度,例如提高到32ms等,但提高刷新速度会提高功耗,加上内存单元随着制程的改善,越来越近,加剧了各个row之间的影响。还有很多更巧妙地办法,例如参考资料2的方法和TRR(Target Row Refresh)方法,具体细节感兴趣的同学可以参看相关资料。
结语
普通电脑用户也许永远也注意不到,一场没有硝烟的战争正在发生,矛在升级,盾也在变厚,黑客和安全专家的斗争也许永远都不会停止。我有时在想,为什么小时候手上拿着鞭炮扔着放,一点也不担心,现在却是远远不敢了。也许是知道了失误的后果,所谓无知者无畏,也就是如此罢。我在知乎上看到很多人讨论如何关掉Win10自动升级,说实话真提他们担心,他们知道这样做的后果吗?
参考资料
[1]: https://jhalderm.com/pub/papers/coldboot-cacm09.pdf
[2]: https://www.semanticscholar.org/topic/Row-hammer/701344
[3]: https://arxiv.org/pdf/1902.04444.pdf