【计算机系统】幽灵漏洞Spectre vulnerability
再来回顾一下
Spectre vulnerability(幽灵漏洞)
201X的大部分安全隐患都来自于cpu而不是软件bug
cpu漏洞来自于推测执行(亦作预测执行、投机性执行,英语:Speculative execution)
是优化技术的一类,采用这个技术的计算机系统会根据现有信息,利用空转时间提前执行一些将来可能用得上,也可能用不上的指令。如果指令执行完成后发现用不上,系统会抛弃计算结果,并回退执行期间造成的副作用(如缓存)。
推测执行的目标是在处理器系统资源过剩的情况下并行处理其他任务。推测执行无处不在。
举例
假设某程序的结构如下:
从网络上下载一个数据A,耗时30秒。
如果下载A成功,则直接给出A的答案。
如果下载A失败,则计算30秒的算数B,并给出这个答案。
如果没有推测执行功能,那么当A下载后发现失败,那么就要再花30秒做算术B,总共耗时1分钟。但是,由于下载过程中CPU是空转,CPU可以认识到反正闲着也是闲着,不如暂时把A当作失败,并根据此提前算出B。这样如果将来需要到B,就节省了30秒的时间。就算不需要,也没有浪费处理器时间。
spectre的目的是读取内存
许多进程和kernel都在内存里,比如
Security keys
Private user data (bank details)
而spectre可以读取任意的内存地址
Bounds checking检测越界
好的代码应该在读入array之前检测是否越界
内存通常在进程的地址空间里
来看一下Speculative execution的代码实例
在执行代码期间,处理器会先获得所有的buf[n],并保存到tmp里,方便代码执行的效率。
Side channels暗道
可以理解为把内存中的数据走私出来
我们可以自己写代码来黑别人的代码,也就是读取别人代码的adress space
虚拟机的使用
当user program想调用kernel memory的数据怎么办?非常困难
这时候kernels implement the “Berkeley Packet Filter” (BPF)
– Very limited language, interpreted by the kernel, to process headers
– Not limited enough!
VMs allow guests to use extended BFP (eBFP)
• A Spectre gadget written in eBPF can leak hypervisor code
– (Hypervisor is like a kernel, with each VM like a process)
如何解决spectre?
Not a software bug. No complete software solution
• Simple hardware solutions are expensive
– e.g., “disable speculative execution”
• Update CPU “firmware” (interpreter of ISA to microarchitecture)
• New instructions to control branch predictions (e.g., clear training)
• Latest hardware fixes: more separation of internal data storage