意想不到的中央处理器安全缺陷

congtou 2016-11-16 最新资讯 0 0
真是巧了,或者说,真是活见鬼了!英特尔叉八六家族的中央处理器存在一个先天性的缺陷,这个缺陷由几个重要的部件引起,令人惊奇的是,这几个部件中的任何一个都没有问题,可当它们组合在一起的时候,却恰好变成了可被用来发动安全攻击的完美搭档。计算机的中央处理器相当于人的大脑,存在这样的缺陷无异于人得了先天性脑瘤。就算这些处理器的生产厂商英特尔公司,对此也是始料不及的,这莫非就是传说中的造物弄人?
这个缺陷的危害有多大呢?简单地说,如果一台计算机上装的是叉八六处理器,那么,利用这个缺陷,黑客可以对这台计算机进行攻击,劫持这台计算机的最高特权,在这个特权下执行黑客自己指定的任意程序。注意,这里说的特权并不是平常说的操作系统中的用户的特权,比如超级用户或普通用户啥的,而是计算机硬件所定义的特权。

1. 攻击焦点是处理器特权等级

人有三六九等,不同的等级享有不同的资源占有权。计算机中也有类似情况。众所周知,叉八六处理器划分有0、1、2、3四个特权等级,其中,0是最高等级,3是最低等级。程序在高特权级状态能使用的内存和能执行的指令比在低特权级状态的多。传统的主流计算机系统只使用0和3两个特权级,0特权级用于运行操作系统内核程序,3特权级用于运行应用程序。
为了把一台实实在在的计算机变成多台虚拟的计算机(即虚拟机),英特尔给叉八六处理器添加了一个新的特权级,即-1特权级,用于运行虚拟机监控器。其实,一直以来,叉八六处理器还有一个更高的特权级,相当于-2特权级,只是,很少有人知道。在-1特权级诞生之前,-2特权级就存在了,事情就是这么怪。(见怪不怪,说怪,只是个玩笑,因为,-2和-1只是个说法而已。)
前面所说的中央处理器缺陷与-2特权级密切相关,黑客针对这个缺陷的攻击就是要劫持-2特权级,使得黑客指定的程序可以在-2特权级状态下运行,其作用就是控制整个计算机系统,可以为所欲为。

2. 攻击利用的是部件的组合

上一小节的文字虽然介绍了处理器设立的特权等级,不过,也许你依然还是一头雾水。要真弄明白这些等级的意思,需要看看它们的实际作用才行。处理器特权等级的作用由几个重要部件配合工作来体现,可以借助图1来说明这个事情。
图1. 处理器特权等级涉及到的重要部件
请留意图1中的甲、乙、丙、丁这几个地方,甲、乙、丙是三个硬件部件,丁是内存中的一个区域。处理器当前到底处于哪个特权等级,由甲说了算,为简单起见,不妨暂时认为甲有一个数值,取值可以是-2、-1、0、1、2、3之一,值是多少就表示处理器处于哪个等级。甲中数值的变化,小的变成大的,由指令确定,大的变成小的,由中断信号确定。乙是专门负责确定一旦有中断信号产生时该做啥事的。丙相当于在中央处理器与内存之间站岗的一个警卫,处理器执行的指令要访问内存时,警卫就进行盘查,它说行才可以访问,它说不行就禁止访问。
丁标出的是一个特定的内存区域,一片漆黑表示那里面的内容只有在-2特权级才看得见,在其他特权级是看不见的。-2特权级是为特殊的系统管理任务设立的,比如,对电源进行管理,或者,当处理器温度过高时采取应对措施。当处理器执行的指令要访问丁区域的内存时,丙听取甲的报告,如果甲说此刻是-2特权级,那么,丙允许指令访问丁区域的内存,否则,阻止访问丁区域的内存。丁区域存放着执行特殊系统管理任务的代码,这些代码是由计算机生产厂商(比如英特尔公司,或它的代工生产厂商)编写的,是在开机启动时由固化在芯片上的代码把它装入到丁区域的内存中的。
当有-2等级的事件发生时,乙响应中断信号,甲配合宣布处理器进入-2特权等级状态,乙指示处理器执行存放在丁区域的代码。在这种情况下,也只有在这种情况下,处理器执行的代码在计算机的最高特权等级(即-2特权等级)下工作,此时,执行之中的代码不仅是能够访问丁区域的内存,而是能够访问计算机中所有区域的内存,存放操作系统内核代码的内存自然也不在话下。
关于乙,要多说两句。乙的内部设有若干寄存器,乙在响应中断的过程中需要用到这些寄存器。为了方便起见,英特尔把对这些寄存器的操作设计成与对内存的操作相同,方法是,给这些寄存器分配相应的内存地址就行,以后,对相应的内存地址的访问便等价于对相应寄存器的访问。显得有学问一点,“给寄存器分配内存地址”可以说成是“把寄存器映射到内存地址空间中”。
如果把乙的寄存器映射到与丁区域有重叠的内存地址范围中,会出现什么情况呢?情况便是,当丁区域的代码想访问重叠区域的地址时,访问将到达不了丁区域的内存,因为乙首先做出响应,把访问引到了它内部的寄存器中。黑客的攻击正是从此处打响的。

3. 攻击的基本方法

 

不知你注意到没有?我在图1中画了一个“地址对照表”,是用虚线方框表示的。之所以用虚线方框,是因为没办法把它放在一个固定的地方,它的位置往往是在程序执行的时候才能确定的。地址对照表的作用是帮助处理器确定它将要访问的内存的具体位置。你可能会问,要访问的内存位置不就是指令中给出的内存地址吗?没错,但是,指令中给出的只是逻辑上的地址,还不是真实的地址,还要转换成真实的地址才行,这就是需要地址对照表的原因。
放在丁区域的-2特权等级的代码的大致结构是明确的,它的开头部分要计算和填写地址对照表。咱们在这里犯不着纠结那些具体的计算方法,大致的意思是,读出一些基本的值,进行一些计算,同时,确定地址对照表的位置,并在地址对照表中填上必要的内容。黑客攻击的思路就是,让-2特权等级的代码在地址对照表中填上黑客想要的地址信息。
攻击的关键一步是,把乙的寄存器映射到与丁有重叠的内存地址范围。这样,当-2特权等级的代码想从这些位置读取数值时,实际上读取到的是乙的寄存器的值。由于处理器设计的原因,这些寄存器的值都是0,因此,-2特权等级的代码取到的基本值变成了0,而不是这些代码的编写者(如英特尔公司)预想的值。
更加悲催的是,在计算机中,一个全0的二进制数进行减1操作后会变成一个全1的二进制数,而-2特权等级的代码中确实有这样的操作。如此这般,经过一番计算,填到地址对照表中的某些地址信息,已不是代码编写者想象中的信息,而是黑客掌控之中的信息。
填写了地址对照表之后,-2特权等级的代码将跳转到一个预定的地址继续执行。非常不幸,由于在地址对照表中填入的是错误的地址信息,程序不是跳转到丁区域中原定的代码段中继续执行,而是跳到了丁区域以外的内存位置中,继续在-2特权等级的状态下执行那里的代码。注意,黑客没有办法修改丁区域中的代码,但是,他们可以在丁区域以外的内存中放上自己的代码,他们只要把自己的代码放到-2特权等级的代码即将跳转到的内存位置上,他们的代码就能够以-2的特权运行。由此产生的后果,呜呼哀哉,此处省略数不清的痛。

4. 攻击的展示与解读

说到这儿,虽然我兴致正浓,但免不了有点口干舌燥的感觉,你呢,该不会晕头转向吧?此刻来一段攻击表演如何?好是好,不过你要有思想准备,我必须说明一下,这是某牛人在黑帽大会上的展示和讲解,是全英文的,而且很专业。如果你对自己的英语听力信心不是很足,或者,对专业术语有点犯憷,那么,就权当一睹黑客风采好了,当然,我说的是好黑客,不是坏黑客。黑客长啥样?通常是,头比较光,胡子比较长。其实,我也可以留出长胡子的,哈哈哈哈!

5. 后记

你看完上面的视频了吗?看没看完都没关系。最后,我觉得有必要从专业的角度作一点交代,非专业人士可以不看。我在这篇文字中谈的主要是英特尔的X86系列的CPU,这类CPU提供的最高特权等级(即-2特权等级)称为系统管理模式(System Management Mode),简称SMM,涉及到的中断控制器指的是先进可编程本地中断控制器(Local Advanced Programmable Interrupt Controller),简称LAPIC或APIC,而所谓的内存访问控制器指的是内存控制单元(Memory Controller Hub),简称为MCH。

 

结论是,英特尔的X86系列CPU存在SMM安全缺陷,黑客通过把APIC映射到与SMM内存有重叠的内存地址区域,可以劫持SMM特权,执行恶意程序。好吧,专业的说法总是充满令人目眩的符号,让人找不着北。如果你不是专门从事这方面研究的,可以完全忽略这个后记,以便保持一个好的心情。

转载请注明来自华夏新科技,本文标题:《意想不到的中央处理器安全缺陷》

喜欢 (0) 发布评论