如果大家看过电影《孤注一掷》的话,应该对剧中主角保护证物硬盘的桥段印象深刻吧。由于 ROM 的非易失性的特征,即使电脑由于损坏无法使用,也可以用技术手段恢复其中的数据,所以不小心保护自己的硬盘可是会吃苦头的哦。

鉴于 ROM 这种非易失性的特性,它具有更大的安全风险,对于硬盘数据攻防的研究层出不穷;相对的,需要持续供电才能保存数据的 RAM 通常会被认为是更安全的。但是也有例外,比如 这个项目,使用 cold boot attack(以下用冷启动攻击代称) 来读取内存中的数据。那么到底冷启动攻击是什么呢?这就

让我康康!

RAM 和低温休眠仓

RAM 大致可以分为两类,SRAM 和 DRAM,前者的使用触发器 来实现,而后者则靠一个定期刷新的 MOS 电容来实现。

sram dram

不管哪一种,本质都是根据电容是否存储电荷来存储数据的。电容中的电荷在失去能量供给后会被释放,也就失去了记录数据的能力。

但是由于放电本身也需要时间,因此失去能量供给的 RAM 还是能在很短的时间内维持数据。特定条件下,这种维持数据的能力甚至能持续数小时甚至一周!这种现象被称为 Data remanence

那么这种条件是什么呢?

科幻作品中经常会能看到低温休眠仓或人体冷冻技术,通过降低体温进入休眠状态,维持人体最低程度的生命体征,以期能够在未来重新唤醒。

cryonics

对于 RAM 而言,这并非科幻而是现实!低温真的会延长数据残留的时间。在 “Cold-Boot Resistant Implementation of AES in the Linux Kernel” 中,作者将内存冷冻到特性-50摄氏度,内存中的数据在数分钟内几乎没有损失,之后数据才开始慢慢丢失。

freeze

Cold Boot Attack

一些保密程度较高的项目通常不允许对硬盘中的数据进行拷贝,硬盘中的数据也会做加密,这样就算拿到硬盘也未必可以得到想要的数据。

相对的读入内存的数据通常是未加密的,加密相关的密钥信息也可能被保存在内存中,但内存的访问又受到操作系统的保护。这种时候就轮到冷启动攻击大展身手了。

这种攻击有一定的时效性,攻击者要有备而来,对内存进行:

偷袭!

  1. 准备一个可以用闪存启动的迷你操作系统
  2. 对系统进行冷重启(也就是断电重启)来启动这个迷你操作系统
  3. 操作及时的话,内存数据尚未丢失,可以使用迷你系统 dump 出数据

这样我们就可以访问那些受原本操作系统保护的内存数据了。

智能手机通常不存在 reset 按钮,可以直接通过拔电池来冷重启;实在无法冷重启的话,还可以直接拔内存,总之就别讲什么武德了。

这些方案在切换系统时的时间花销会很长,我们前面提到的通过低温延长数据残留时间的方法就可以派上用场了。准备好液氮或者冷却喷雾吧

freeze spray

@hanfractuosity 在 github 上发布了一个特别有意思的项目以展示这种攻击。

ramrecovery

整个项目由两个树梅派,一个修改过的 USB hub,以及一个裸金属 kernel 组成。

  1. 树梅派A会把一张蒙娜丽莎写入内存
  2. 断电重启后,USB hub 会在一个指定的延迟后,让树梅派A使用闪存中的系统
  3. 切换系统后,裸金属会读取树梅派A中残留的内存数据
  4. 残留的数据被写入树梅派B

由于有定制的 USB hub 来快速冷重启切换系统,因此不需要用冷冻法来延缓数据丢失。如果把冷启动的延迟设置为 0.75 秒,那么恢复的蒙娜丽莎就像下面这样

image_0.75

尽管出现了很多噪声,但是大致还是能看出原图的。根据作者的说法,如果不进行冷却的话,大约 1s 以后数据基本就全部丢失了。

对策

根据 wiki,这种攻击方案有一些常见的防御手段:

  1. 物理隔离:机房锁死,内存焊死,那么冷启动这个前提就不存在了。
  2. 内存加密:对内存数据做加密以防止攻击者得到真实数据。加密的密钥可以写在寄存器中。
  3. 清理数据:在重启的时候根据上次关机的状态清除数据;或者异常关机时随机写入脏数据。
  4. 外部密钥:不向内存里写入敏感信息,使用外部的硬件密钥来代替(类似银行的 U 盾之类)。

这里有 XBOX 对其安全方案的设计,其中就有涉及到的硬件内存加密,感兴趣的观众可以去看看,我看不懂😎

xbox_mem_hashing

结语

第一篇技术分享博客完成啦!尽管和我从事的工作没啥关系,不过查资料的时候还是蛮开心的。希望能让大家有所收获。

This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.

CC BY-SA 4.0