[关闭]
@dyk 2015-07-10T04:41:10.000000Z 字数 1193 阅读 384

Memoir: Practical State Continuity for Protected Modules

ReadingNote

S&P'11

为了保护计算,一个安全的架构不仅需要保护那个软件,同样需要保护软件的操作时候的状态。如果软件回滚到一个正常但是老旧的版本,那么它很有可能发现错误。所以保护软件的状态不仅仅是保护状态的私密性与完整性。为了达到上上面说的目标,作者提出了Memoir,Memoir是第一能够保证软件模块状态的连续性的系统。换句话说,Memoir保护软件的状态保持持续并且不会被破坏。Memoir的最大贡献是在做到rollback resistance的同时并没有让系统更加的容易发生crash。Memoir实现了一个确定的模块,这个模块精确的将被保护模块的请求记录的总结存放在NVRAM里面。并且在发生crash的时候仅仅允许安全的命令重新执行。由于现在的硬件设备的NVRAM并不能频繁的进行读写,作者对这个问题也做出了优化。

作者为了确保其设计的正确性,作者给出了基于公理化的安全证明。作者还对Memoir的性能在真实的环境中进行了测试。

作者解决可信存储空间的不足,以及写入次数的限制,通过特别的数据结构将日志保护起来,只有在关机的时候才写入NVRAM。作者在基于Flicker的基础隔离了被保护的模块。

问题的解决有一下几个挑战:

  1. 单调的计数器,防止回滚攻击的一个简单的方法就是在状态中添加一个可信的单调的计数器。如果在计数器跟新的时候发生了crash,但是这个新值却没有写入持久的存储之中,将使系统不能正常的使用。额外的,更具上面的讨论,物理的可信计算器也有许多的限制(计数太慢几秒一次)。
  2. 允许重放,crash防止策略可能会允许不可信的代码重放它的输出。但是这个不可信的代码可能给出与前一次不同的输出,以发动重放攻击(两次不同的口令,进行暴力破解)。
  3. 两步确认,能够达到crash抵抗的特性的标准的技术就是两步确认协议。这个一标准要求参与组件都展示的给出运行的过程个结果,当协调器获得了所有成员的输出结果之后会让所有的组件commit他们的操作。并且与这个协议的私密性和完整性相比它的原子性更加的重要。与其在NVRAM中存放单调的计数器,作者在其中存放的是上一次运行状态和输出的加密值的hash。不可信的系统如果想要被保护的模块去执行一个请求的话,需要提供现在的状态的密文,以及上一次的输出的密文。如果现在的状态和输出都一样匹配存放的VNRAM中的值,那么被保护的模块将会执行这个步骤。这个策略是可以的但是对于Memoir来说有两个大的问题,1)开销却很大,执行每个命令都需要访问TPM,2)两部确认协议将会引发基于旁路的回滚攻击[^sidechannel]
  4. 在加密数据上面的计算, 被保护模块允许任意的模块直接在明文的数据上面进行操作。

Reference Related Work

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注