论文名字太长了放标题会炸.jpg
Breaking Constant-Time Cryptographic Implementations Using Data Memory-Dependent Prefetchers
翻译一下是,使用数据内存相关的预请求器实现的对恒定时间密码学算法实现的攻击。
总结:基于缓存侧信道的,对于密码学相关算法的,在特定CPU上存在的微架构漏洞。
侧信道攻击
不是主信道就是侧信道嘛。一般来说是,控制输入,在不知道输出,但是我们可以通过除了输出之外的方法获得一些信息。(比如,时间盲注其实也算是一种侧信道?)
eg:小明不知道自己表现怎么样,但是他发现面试官脸色很不好看,所以他知道,自己这次表现不好。
缓存侧信道
缓存分三层L1,L2,L3,每层访问速度都会变慢。所以,判断一个数据是否存在于缓存中,我们只需要访问并对比访问时间。
常见缓存侧信道攻击方法有三种:Prime+Probe,Flush+Reload,Flush+Flush
Prime&Probe
- Prime(填充)
- execute
- Probe(检测)
Flush+Reload
- Flush(清空)
- execute
- Reload(重加载)
Flush+Flush
- Flush(清空)
- execute
- Flush(再次清空)
上面这几种,都是在程序运行后,通过访问时间差距来判断信息。
密码学
为了避免侧信道攻击,密码学算法在设计时,往往会要求,在不同的条件下程序执行的大体时间相同。
a = input()
b = input()
passwd = 1
if passwd = 1
t = a
a = b
b = t 这样的设计就是不合理的,因为根据pass的值,程序运行会出现一定的时间长度变化。而正确写法是
a = input()
b = input()
passwd = 1
r = ~passwd + 1
t = (a ^ b) & r
a = a ^ t ^ r
b = b ^ t ^ r 这样运行的代码,无论 password怎么变,程序执行时间是相同的。所以叫做:Constant-Time Cryptographic Implementations
漏洞
在受影响的CPU设计(Apple SIlicon M1, M2, M3,以及部分Intel Raptor Lake 处理器)中,引入了一项技术(Data Memory-Dependent Prefetchers,DMP),会把缓存中类似于地址的数据从内存中读入。于是考虑上面经过优化的代码:我们构造一个输入a,b使得 a ^ b的值是一个指针。代码中,如果password(未知)是1,那么t就会变成a ^ b的值,从而某个这个构造出来的指针位置上的数据会被加载。运行完成后,我们访问这个指针位置上的数据,观察速度,就能根据不同password的行为得到一个明显的图标,从而确定password的值。
笔者在官网上给出了攻击更复杂的OpenSSL库中的Diffie-Hellman算法,Golang标准库中的RSA算法等常见加密实现的demo和代码。
影响与修复
Intel Raptor Lake似乎没有受到太大的影响(利用链更复杂,时间差距不明显)
由于是芯片中微架构的部分出现了问题,M1,M2是无法修复的,M3中,新增了DMP enable标志位,Apple在过去的更新中调整了标志位,通过禁用功能来修复。
这个漏洞技术含量很高,但是影响却并没有那么深远(?),利用难度较高,需要有本地执行权限,甚至root权限来获取shared memory;且很少有人用m系列普通芯片用于服务器架构,对工业影响也不大。
总结
有意思,但是不够有用。