Intel摊上事儿了!近日,中国网络空间安全协会官方发布了一篇文章:
此文一发,Intel股价直线下挫,跌幅达到3%!
好了,咱们搞技术的,还是来看一下,这篇文章中谈及到的Intel CPU漏洞都是些什么,问题真的有这么大吗?这篇文章我带领大家来简单回顾一下Intel CPU这些年的漏洞。
废话不多说,安全带系紧,开始发车!
谈及网络安全,大家更多想到的是应用程序的漏洞、网络服务的漏洞、操作系统的漏洞等等,却很少谈及硬件的漏洞。这不是说硬件没有漏洞,而是相对来说,硬件的漏洞更不容易被发现,真正让大众开始重视起硬件漏洞,那得从2018年初开始说起。
2018:熔断与幽灵漏洞
这一年,爆发了著名的熔断(Meltdown)与幽灵(Spectre)漏洞。
Meltdown 和 Spectre 是两个几乎同时被公开的硬件漏洞,它利用了现代处理器的分支预测和乱序执行机制来实现攻击,以此来绕过硬件级的安全隔离,允许攻击者读取处理器本应无法访问的数据。
听不太懂?简单理解就是这样的:咱们计算机上运行了很多程序,比如有微信,有浏览器,有音乐播放器等等。操作系统为了安全考虑,一个进程正常情况下只能访问自己的一亩三分地,别的进程的数据,以及操作系统内核中的数据,都是无法访问的。想要访问只能通过操作系统提供的一些“官方”途径。
而这俩漏洞可以不经这些“官方”途径,通过精心构造的编程手法,利用CPU的乱序执行、分支预测、缓存等硬件层面的优化机制,拿到本不应该拿到的数据。
为什么这些优化机制可以拿来做攻击呢?我们先来简单了解一下这些机制。
乱序执行
:CPU其实并不是按照我们反汇编看到的那样,一条一条按顺序执行的。为了提升执行效率,有一些不依赖于前面的指令是可以内部提前执行的,这就是乱序执行。
分支预测
:像面对if这样的判断,CPU会基于内部的历史记录来提前预测后面会进入哪个分支执行,是if分支,还是else分支,从而内部提前执行对应分支的一些指令。如果预测成功,那皆大欢喜,提前做了,提升性能。如果预测失败,内部就把这些数据清空,就当啥事也没发生一样。
但坏就坏在,并不是啥也没发生。老话说得好,要想人不知除非己莫为。你提前内部执行了这些代码,不可能啥痕迹也没留下。攻击者就找到了这么一个痕迹:缓存
。
CPU里面有个缓存,我们经常买电脑会关注CPU的缓存有多大,一级缓存、二级缓存、三级缓存等等。
缓存是CPU内部为了提升数据访问引入的存储设备,经常访问的数据,不要每次都找内存要了,太慢了,把它们放到离自己更近的缓存里面来,采用特别的电路存储,读写非常快。
然后这个幽灵漏洞是怎么一回事呢?前面说过,预测失败的时候,并不是什么也没发生,有可能内部提前执行的时候,会把内存中的数据放到缓存里面来。后面发现失败,并不会把缓存的数据又给清掉,这就是一个留下的痕迹。
假如攻击者精心构造做个局,让CPU提前预测并执行对应分支的指令,随后发现预测错误,但对应的内存已经进入缓存中来了。接着通过访问这些内存,通过时间快慢就能推测哪块内存被缓存过,进而从这个局里面反推出相关的数据内容。
如果还是听不懂,我之前做过两期视频,用讲故事的手法讲过这俩漏洞,大家可以戳下面视频卡片看看。
影响范围
:这两个漏洞的影响是全球性的,几乎所有现代计算设备都受到波及。包括企业服务器、个人电脑、手机等等。
2022:NativeBHI漏洞
NativeBHI,全称Branch History Injection,分支预测历史注入攻击,被称为幽灵漏洞2.0版本。
上一代的幽灵漏洞是编程误导CPU触发错误的分支预测,而这一次直接注入伪造的分支预测历史记录来操控处理器的执行流,达到读取其他进程数据的目的。
影响范围
:该漏洞影响了广泛的Intel处理器,尤其是在虚拟化环境中,攻击者可以突破虚拟机间的隔离,读取其他虚拟机或宿主系统的数据,这对云计算是极大的威胁。
2023. Downfall漏洞
Downfall 利用的是Intel的AVX指令集扩展在处理数据时的漏洞。该漏洞允许攻击者在同一系统上,利用某些指令泄露其他进程或虚拟机中的数据。特别是涉及浮点运算的应用程序容易受该漏洞影响。
影响范围
:该漏洞主要影响使用了AVX-512扩展的Intel处理器,尤其是在高性能计算、科学计算和加密任务中的应用。相对于熔断与幽灵漏洞,影响较小,但在特定场景下风险较大。
2023. Reptar漏洞
Reptar漏洞(CVE-2023-23583)是2023年由Google安全研究团队发现的Intel处理器漏洞,它主要通过利用冗余指令前缀(redundant prefixes)的处理缺陷来实现攻击。
先来看看啥是指令前缀。
指令前缀是指那些在指令前面加上的额外字节,这些字节用于修改指令的行为,比如禁用或启用某些功能。一些常见的前缀包括:
修改内存操作的行为,如使用不同的段寄存器(段前缀)。
改变操作数大小的前缀(如32位操作指令用16位操作前缀)。
控制字符串处理指令的重复执行(如 REP 前缀)。
通常,这些前缀是用于特定目的的,但是在某些情况下,当前缀与指令不兼容或没有意义时,这些前缀可能被处理器忽略。这些无效或冲突的前缀就被称为冗余前缀。
举个例子,一个典型的冗余前缀组合可能是:
66 67 90
其中,66是操作数大小前缀,67是地址大小前缀,90是NOP指令(无操作)。
在正常情况下,处理器会忽略这些冗余前缀,但在Reptar攻击中,攻击者通过构造包含冗余前缀的特殊指令序列,使处理器在执行过程中处理这些前缀时出现错误。这种错误会导致处理器在执行推测性分支时做出不正确的预测,允许攻击者通过侧信道技术(如测量缓存访问时间)获取敏感数据。即使这些投机执行最终被丢弃,推测执行过程中加载到缓存的数据仍可能被泄露。
2024. GhostRace漏洞
这个漏洞是今年才披露的,它同样与幽灵漏洞有关系,是幽灵漏洞结合同步机制的升级版。
要理解这个漏洞的攻击原理,得先从处理器的同步机制和投机执行这两个概念开始。
1. 竞态条件与同步机制
竞态条件通常指多个线程同时访问共享资源时,如果没有正确的同步措施,系统行为可能会不可预测,甚至导致数据被破坏或泄露。为了防止竞态条件,操作系统会使用同步原语(如锁、互斥量)来确保一个线程在操作某个共享资源时,其他线程不会同时操作。
举个例子,假设有两个线程,线程A和线程B,它们都需要访问同一个变量x。
为了防止同时修改x导致数据冲突,系统会使用锁来保证只有一个线程在任意时刻可以操作x。当线程A在修改x时,线程B必须等待,直到线程A完成操作并释放锁。
2. 投机执行中的问题
前面说过,在现代处理器中,为了提升性能,使用了投机执行技术。当CPU遇到一个条件判断时,它会提前“猜测”哪个分支会被执行,并开始提前执行该分支的指令。如果猜测正确,这些操作就可以直接使用,节省时间;如果猜测错误,则会丢弃这些结果。
问题就出现在投机执行期间:
CPU可能会在同步机制尚未生效之前,提前访问到共享资源。
尽管最终处理器会丢弃错误的执行路径,但这段执行过程中访问的数据可能已经被加载到缓存中,攻击者可以通过侧信道推测出敏感数据。
GhostRace攻击正是利用了处理器在投机执行中的这个弱点。它发现,在投机路径上,操作系统用于防止竞态条件的同步机制(如锁)可以被绕过,使得攻击者能够访问本应被保护的数据。
具体来说,还是那两个线程,线程A和线程B,它们都需要访问共享变量x,并且系统使用锁来保护x。在正常情况下:
线程A会先获得锁,然后访问和修改x;
线程B在等待锁时无法访问x。
但在投机执行过程中,当线程B发出访问x的请求时,CPU可能会在确认线程A是否释放锁之前,提前投机执行线程B的代码。
如果线程B在投机执行期间读取了x的值,即使最终投机执行结果被丢弃,读取的x值可能已经进入缓存。攻击者可以通过观察缓存状态,利用侧信道技术推测出x的值,从而泄露本应受到保护的敏感数据。
2024. Indirector漏洞
CPU内部的优化机制远不止乱序执行、分支预测和缓存这些,在间接调用的场景下,也有一个优化机制。
什么是间接调用呢?就是我们C语言里面看到的通过指针来调用函数:
void (*func_ptr)();
func_ptr = get_function();
func_ptr();
编译成汇编指令以后,一般就是call eax
这样的指令,调用的地址是在寄存器中,运行的时候动态确定的。这家伙常规的分支预测和乱序执行就没办法了,因为你不知道eax等会儿是个什么东西啊。
为了解决这个问题,Intel又搞了一个间接调用预测的优化机制,根据它内部一套复杂的算法来预测可能会调用哪个地址的函数。你先别管它是咋预测的,总之它确实做到了。
而这个Indirector漏洞就是针对这种优化措施研究出来的攻击方式,攻击者深入研究了Intel CPU内部用来预测间接调用的实现原理,然后精心构造程序欺骗CPU,使得CPU在投机执行期间提前执行了错误的指令,而不是程序预期的函数,实现攻击。
以上就是本次中国网络空间安全协会发文提到的这些个Intel的漏洞攻击原理了。
从Intel近年来披露的这些漏洞不难看出,很多本来是为了性能优化而采取的机制和措施,结果却被拿来做网络攻击了,而为了解决这些安全问题,又不得不推出一堆新的措施去缓解,这些措施结果却又在扯性能后腿。要性能还是要安全,对于CPU厂商来说,真的像是跷跷板的两端,很难保持平衡。
这些漏洞不仅影响了个人用户的设备安全,还对云计算和虚拟化技术构成了严重威胁,提醒我们硬件安全的重要性以及在未来需要继续探索的新型防护措施。
通过回顾这些漏洞事件,我们可以更好地理解现代计算设备中的潜在风险,并采取更加严谨的安全防护策略。
Comments NOTHING