对抗内存物理读取攻击的利器:Intel TME和AMD SME

对抗内存物理读取攻击的利器:Intel TME和AMD SME

内存条,这个我们电脑和服务器之中必备的重要数据临时存取器件,相信大家都已经十分熟悉。大家都认为,它之中的内容只要掉电了,就会消失。其实并不然,我在这篇文章中介绍了著名的ColdBoot攻击:

简单来说,就是利用内存单元的电容在低温下电子的惰性,通过冰冻内存条,然后快速将内存条物理转移到读取器中,来读取内存条中的机密信息。这种方法简单暴力,十分有效,有没有什么办法对抗呢?有矛就有盾,这个盾就是AMD的SME(Secure Memory Encryption)和Intel的TME(Total Memory Encryption)。

TME和SME

ColdBoot的物理攻击对信息系统的威胁是紧迫的。彼时,Intel已经有了SGX(Software Guard eXtensions)技术,它的安全enclave技术虽然并不是专门针对ColdBoot攻击的,但如果使用得当,可以某种程度缓解问题。

这次技术的带头人是AMD,它在Zen设计的时候就引入了SME,并在不久更进一步提出SEV(Secure Encrypted Virtualization)。Intel在随后Skylake才引入TME,并在Icelake中引入MKTME(Multi-Key Total Memory Encryption)。关于SEV和MKTME,我们今后专文介绍,今天我们重点介绍TME和SME,因为两者十分相似,我们就以TME来详述。

TME是怎么工作的?性能如何?

TME名字中的Total Memory就明示了它是一种全部内存加密技术。这个IP嵌入在内存控制器中,在内存写入时加密,在内存读取时解密,因此它是一种软件全透明的内存加密方案。

CPU每次在启动时,都会随机生成NIST标准的AES-XTS加密算法用到的秘钥(128bit),这个秘钥临时存在内存控制器中,掉电就会消失,而且为了安全,不能被外界获取(有一种情况例外,想想是什么情况)。每次总线送过来数据存储时,就用AES-XTS自动加密,再放在内存条中;如果是读取,从内存条中取出来后,用AES-XTS算法解密后再送出去。由于这一切都是在内存控制器IP中自动发生的,外部IP并不知道发生了什么,它们只看到数据进去,然后同样的数据又可以读出来。外部IP可以是带内的CPU、Cache Agent、QPI Agent或者是带外的设备,这样好多过去可以工作的技术可以叠加在TME上工作,包括已有的SGX,兼容性十分好。

在两个CPU的服务器中系统框图如下[1]

来源:参考资料1

这样内存条中实际上存储的是密文而不是明文,ColdBoot攻击这样就被防住了。对某些不能存储密文的情形(想想是哪些情况),TME还专门设计了排除寄存器,可以将某些内存区域排除在外。

这么加密又解密必然带来性能损失(Overhead),那么究竟损失了多少呢?据Intel统计并公布的数据是不到5%(统计数据)的性能损失。当然在数据密集型计算的时候,1%的性能损失也是不能容忍的,所以BIOS中有专门选项来开关TME。大部分情况下,这个选项是关闭的,但这时候就要冒着被ColdBoot攻击的风险。

结束后的思考题

TME集成在内存控制器中,这让它不但能够加密普通内存,也可以用在Intel的非易失内存上(傲腾)。TME加密的颗粒度太粗,防止了ColdBoot攻击,但这个透明的特点,让对内部攻击毫无反击之力,这就需要MKTME和SGX技术了,在这篇文章对其做了介绍:

最后是一个思考题:TME能不能防止DMA攻击呢?为什么?欢迎大家留言讨论。

欢迎大家关注本专栏和用微信扫描下方二维码加入微信公众号"UEFIBlog",在那里有最新的文章。关注公众号,留言“资料”,有一些公开芯片资料供下载。

参考

  1. ^Intel MKTME文档 https://www.intel.com/content/dam/develop/external/us/en/documents-tps/multi-key-total-memory-encryption-spec.pdf
编辑于 2023-01-13 10:29・IP 属地上海