处理器级别漏洞会引起哪些安全隐患

处理器/DSP

875人已加入

描述

0x01 背景

meltdown(熔断)以及spectre(幽灵)从爆出到现在大概一个多星期时间了,spectre对应的CVE编号为 CVE-2017-5715 、 CVE-2017-5753 ,meltdown对应的CVE编号为 CVE-2017-5754

关于meltdown和spectre相关研究最早是在2016年 Blackhat USA大会上有过相关的描述和猜想,研究人员发现,在现代的处理器架构的用户模式下,存在泄露内存区不可访问区域的敏感信息可能性,但是当时还没有具体的实现方法,之后才被格拉茨技术大学和其他实验室研究人员共同研究出该漏洞猜想的利用方法。

处理器级别漏洞一般可以影响整个云计算基础设施的发展历史,cpu本身的架构同时也面临着严峻的考验。在看了遍大致原理之后,结合之前在公司上cissp课的时候老师讲过的side channel attack侧信道攻击的相关知识,算是把漏洞基本上弄懂了。首先我们先来看下几个需要掌握的概念。

乱序执行

在cpu的流水线工作中,cpu处理执行指令如果采用顺序的方式,在处理性能上会产生比较大的开销。现代处理器优化了cpu处理指令的方式,程序指令在同样的单位时钟周期内通过乱序执行。所以,可能造成一种提前将需要执行的指令进行预执行的可能。这种方式虽然提高了cpu的指令处理效率,但是可能会成为内核漏洞利用的一种手段。用wiki上的例子解释

1. b = a * 5

2. v = * b

3. c = a + 3

这里由于1与3可并发运行,而2之b无法随即获得,因此可以先计算乘法1与加法3,再运行2

地址空间

每个进程在内存地址中都有自己的独立的内存空间,内存空间以PLT页表映射的方式将内存实际地址映射成虚拟地址,同时定义了内核地址特权保护相关手段。这样的内存空间主要分为用户可访问内存地址和不可访问的内核地址空间,

cpu

分支预测

CPU执行一条指令,一般来说,最少也要经过从内存中取指令,将指令译码解析成微操作(μOP),微操作最终驱动硬件电路部件三个步骤(简称取指令、译码和执行),如果执行一条指令,要等到这三个步骤都完成后,才能执行下一条指令,则一条指令执行时间过长(用CPU硬件术语说就是消耗多个时钟周期),CPU运行速度就无法得到有效提高,循序执行就是必须执行完当前指令才能执行下一条指令的执行方式。 为了解决这种问题,现代cpu使用分支预测的方式提前预测cpu将要执行的指令。我们用通俗点的一句话概括这种机制: 如果某一段时间内某一条件跳转都走向某一固定分支,则可以预测这条条件跳转指令下一次很大可能也走向这一分支 。

隐藏信道攻击(side channel attack)

为了提高内存IO效率,通常将经常使用的数据存放在cache中,cpu缓存通过在较小和较快的内存中缓存常用的数据来减少慢速内存访问延时带来的成本。现代cpu具有多级缓存机制,这些缓存通常可以提供给cpu内存使用,也可以提供给其他缓存共享使用,PLT表也可能存放在缓存中。

我们用个通俗的例子来解释隐藏信道攻击的原理:假设现在有一个安全等级非常高的私密空间机构(类似于美国中央情报局),这个机构只能接受外部特定的情报消息(写),但不能将自己内部的一切信息泄漏给外部,(读),A是这个中央情报局的工作人员,B想拿到中央情报局的一些敏感资料供自己使用。B通过多种渠道认识了A,拿到了A的一些把柄,A的工作中也有B需要的敏感文件,A为了自己的名誉答应B的泄漏敏感文件要求。商量之后,B为了不让A暴露自己与A达成了一个协议;经过B的发现,A的办公室每天晚上12点左右关灯并且关灯的时间有偏差,B要求A通过一定的手段控制办公室的关灯时间以12点为分界点,十二点之前关灯信号计为1,十二点之后关灯信号记为0。这样B和A就源源不断的通过隐蔽的方式讲中央情报局的秘密泄露出来了。

隐藏信道攻击也称为旁路攻击,这种攻击攻击是利用缓存引入的时序的差异方式对cpu内存进行攻击的一种方式。漏洞poc使用的是基于Flush+Reload的方式对缓存进行泄漏,这种攻击利用最后一级缓存,利用clflush刷新目标内存位置。通过测量重新加载数据所需的时间,攻击者可以确定数据是否由另一个进程同时加载到缓存中。

0x02 Spectre攻击

在理解完上述的几个关键点之后,我们再来看看spectre这种攻击的真实利用过程。参考spectre attack上的代码片段

if(x 《 array1_size)

y = array2[array1[x] * 256]

代码片段中首先判断了用户进程是否越界访问数组的非法访问区域。在某种程度上,这种方式防止了处理器越界访问非法访问的敏感数据区域。然而,在乱序执行的条件下,假设攻击者可以操纵x的值(对应array[x] = k)泄露单个byte的内存值,此时array1_size和array2没有cache到缓存中,但是k已经存入cache缓存了。攻击者此时可以让cpu多次执行判断为真的指令,执行多次后cpu会将下一条指令预见性的读取,这时候只要攻击者突然改变x为非法访问内存值,则可以让cpu误读取非法区域中的值,达到泄露非法地址内存信息的目的。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分