AD

SMM漏洞初探——个人思考

SMM漏洞初探——个人思考

    2009年3月13日,波兰著名女黑客Joanna Rutkowska公布了一条令人震惊的消息:将于一周后发布一篇论文,公布如何利用Intel CPU的Cache机制漏洞,利用这个漏洞,可以将CPU的运行特权级由Ring 0提升到SMM(系统管理模式),这种攻击方法在新近的主板和Intel CPU上都有效。

       国内外许多IT网站纷纷转载此消息,一时间“x86系统都得死”、“Intel遭遇CPU Rootkits,目前无药可医”等恐慌性言论纷纷出现在各大IT网站上,大有“语不惊人誓不休”之势,更有人相信“阴谋论”,直指这件事情是“美国政府在Intel CPU中故意留的后门,严重威胁国家安全,应尽快发展国产CPU才是彻底的解决之道!”也有某些著名IT网站出来辟谣,发表“Intel CPU重大安全漏洞真相揭秘”、“杯弓蛇影”等文章,或是自行分析,或是引用Intel公司专家的话,竭力证明这个漏洞“没有什么大不了”、“早已被Intel公司修补”、“没有太大实用价值”……总之不用担心。

       抛开这些喧嚣的言论,透过现象看本质,从纯技术角度进行分析,应该如何看待这个漏洞和可能出现的CPU Rootkits呢?本文试图对这个漏洞的机制和CPU Rootkits进行简要的“可行性分析”,并给出一些评价。


        要了解这个漏洞,首先应该了解一下什么是SMM,SMM是System Management Mode(系统管理模式)的缩写,对于Intel IA-32体系结构CPU早已不是什么新东西,从Intel 80386SL CPU开始就引入了这种模式,486以上的CPU就更是毫无疑问地支持SMM了。根据Intel官方的《IA-32 Intel体系结构软件开发者手册第3卷:系统程序员指南》中的描述:SMM提供了一种预留的操作环境,可为有效的电源管理、控制系统硬件或者运行特殊的私有代码提供监控和管理各种各样的系统资源(硬件)的能力。SMM是一种特殊用途的操作模式,为处理系统级功能提供,例如电源管理、系统硬件控制或者运行厂商设计(OEM)的特殊私有代码。

    简而言之,SMM是为了系统控制活动而设计的一种模式,例如电源管理就属于系统控制活动之一。SMM用于BIOS(主板固件)和专门的底层设备驱动程序,而不是用于操作系统。实际上SMM是独立于实模式、保护模式和虚拟8086模式之外的一种特殊模式,从任何模式都可以进入SMM。SMM和保护模式下的最高特权级Ring 0一样,可以访问全部内存和外设硬件,SMM采用类似实模式的方式进行内存寻址,在Ring 0—Ring 3中使用的分段分页等寻址方式、地址映射和内存保护对于SMM是无效的,SMM下直接访问内存物理地址,而且有能力访问4GB的物理内存,SMM下访问的内存称为SMRAM。

       这样一来攻击者自然而然可以想到:岂不是可以将SMM作为Ring 0来使用吗?进入SMM这种独立模式之后,任何保护模式下的保护方式都会失效,通过注入SMRAM的Rootkits代码,可以任意访问外设硬件,任意篡改物理内存添加攻击代码、恶意代码甚至病毒,而工作于保护模式Ring 0上的操作系统内核和安全软件(例如反病毒软件)根本不可能发现这种篡改,基于SMM的Rootkits显然比基于Ring 0的Rootkits更具有隐蔽性。

     这样做是不容易的,原因有二:

    1、进入SMM的唯一方式是通过SMI中断,而SMI中断是一个特殊的硬件中断,无法像软件中断一样通过INT指令引发,也无法像普通的外设硬件中断一样通过PIC(可编程中断控制器,即普通《微机原理》教材中提到的8259)引发,只能通过主板上的特殊硬件电路引发,例如改变CPU SMI#引脚的电平(注:针对80486 CPU,但更高级的Intel CPU也类似)。换而言之,没有简单的软件方法能进入SMM。

    2、进入SMM后,CPU特地提供了一个SMIACT#引脚以在硬件电路电平上标识CPU进入了SMM,于是可以将这个引脚设法作为片选信号,在CPU进入SMM后片选非主内存的其它RAM作为SMRAM,也就是说,在硬件上已经提供了一种机制,可以在主板上将SMRAM和主内存分开设计,而共享同一地址空间,这也是Intel所推荐的主板设计方式(注:针对80486/Pentium CPU,但更高级的Intel CPU也有类似机制)。换而言之,SMM下访问的物理内存——SMRAM可能根本就不是主内存,在操作系统正常工作时无法访问,也无法注入代码,就是在SMM下篡改了对操作系统也没什么影响。

    第2个原因,做过较深入单片机硬件电路设计的读者应该知道类似的方法:8051单片机只能访问64KB内存地址空间,如果要提供128KB内存应该怎么办?那么在电路设计上,可以使用几个引脚设法转换成片选信号,设计几块内存来回切换,这样虽然8051还是只能访问64KB内存地址空间,实际上可以通过片选信号分别访问几块独立物理内存,同样的内存地址空间切换内存后访问的是不同的物理内存,也就等于能访问更大的内存了。

    如此一来,只要主板硬件电路设计上没有漏洞,上述两个原因中的问题就无法解决,也就无法实现基于SMM的Rootkits,换而言之,实现基于SMM的Rootkits,上述问题是需要解决的两个核心问题。但是,完全没有漏洞的系统是很难存在的,软件如此,硬件同样如此,况且功夫不负有心人(攻击者),2008年,国外攻击者公布了一种实现SMM Rootkits的方法(可参见http://www.phrack.org/issues.html?issue=65&id=7#comments),就是沿着解决这两个核心问题的思路实现的,主要思想如下:

    1、通过某些主板芯片组对PCI协议处理的漏洞,可以通过软件访问PCI相关寄存器,使得主板芯片相关电路引发SMI中断。

     2、如果在主板硬件设计上,将SMRAM和主内存分开设计,那么需要提供一种机制,在系统启动时将SMM下所需的处理代码(例如电源管理)写入SMRAM,某些内存控制器——北桥芯片通过修改SMRAM控制寄存器设置可以直接访问SMRAM,但这种访问应该仅在系统启动时一次有效,操作系统正常工作时必须阻止这种访问,问题是某些早期BIOS中存在漏洞,北桥芯片的SMRAM控制寄存器在非SMM模式下可以多次修改,使得在操作系统正常工作时对SMRAM注入Rootkits代码成为可能。

    从这种方法公布的内容来看,可以做到在某些主板芯片组和早期BIOS上,将Rootkits代码注入到SMRAM,并进入SMM执行这些Rootkits代码,但还不清楚能否有效地做到在SMM下篡改除SMRAM之外的主内存,这一点还要取决于主板上主内存和SMRAM的电路设计。这种方法对于较新的BIOS是无效的,公布的内容中已经明确说明这种情况下需要修改BIOS。这种方法实际上是利用主板和BIOS(主板固件)的漏洞,称为“主板Rootkits”比较合适。

    那么Joanna Rutkowska公布的消息中提到利用Intel CPU的Cache机制漏洞可以将CPU的运行特权级由Ring 0提升到SMM又是怎么回事呢?上世纪90年代末曾经有个“Cache病毒”故事,说是某种病毒隐藏在了CPU的Cache中,需要将CPU从主板插座上拔下来凉10分钟,才能清除病毒,这个故事当然是假的,谁能直接访问Cache中的任意地址呢?但是对Cache进行一定的控制却是完全可能的,Pentium以上CPU都可以进行,Intel官方的《IA-32 Intel体系结构软件开发者手册第3卷:系统程序员指南》中的第10章专门讲述了这个问题,例如可以控制特定地址范围的某块物理内存的Cache策略。从Pentium Pro(P6)CPU开始,L1 Cache和L2 Cache都集成在CPU内部,如果控制Cache时出现了未知的漏洞,使得CPU能够在内部进入SMM,这是一种漏洞的可能,但这种可能并不一定能解决上述SMRAM注入代码和主内存篡改问题。

另一种与SMM相关的Cache漏洞可能性是:无论是Intel还是AMD,都明确地在CPU手册中说明了无论在进入或退出SMM时,不会自动将原Cache内容写入内存并使Cache无效,这样简化了SMM的进入和退出,并使得SMM代码执行更快,CPU内部在出现混淆情况时做出“适当处理”,如果这里存在漏洞,则存在通过Cache在相同地址主内存和SMRAM之间不知不觉地交换代码的可能性,这样在进入SMM时有可能完成对SMRAM注入Rootkits代码,退出SMM时又有可能完成主内存的篡改。

无论出现哪一种漏洞可能性,这种漏洞都是CPU设计造成的漏洞,基于这种漏洞设计的Rootkits,可以称得上是CPU Rootkits。

通过上述分析,可以得出一个初步结论:无论是前面提到的主板Rootkits,还是这种CPU Rootkits,目前价值并不是很大,对现有基于x86 CPU的PC系统安全性还造不成致命威胁,也绝非无法防范。因为无论是通过主板/BIOS漏洞还是通过Cache漏洞解决实现基于SMM的Rootkits中的两个核心问题,都必须先进入Ring 0进行特定操作,而SMM的实际权限并不比Ring 0高,SMRAM的限制甚至使得SMM下访问主内存比Ring 0还要困难,基于SMM的Rootkits相对传统的Ring 0 Rootkits,在功能上并没有很大优势,设法进入Ring 0以及在Ring 0进行特定操作以进入SMM的过程,甚至要借助传统的Ring 0 Rootkits才能实现,也完全可以被安全软件监控和拦截,因此,更新的安全软件对防范这种攻击和Rootkits,应该具有一定的能力。

 但Joanna Rutkowska公布的这条消息,却又一次为我们敲响了防范硬件Rootkits的警钟!虽然目前基于SMM的Rootkits或许只是能在运行时动态将Rootkits代码注入SMRAM并进入SMM执行之,但谁也不知道,主板和主板固件中的漏洞有无可能将非易失性存储器,例如:BIOS Flash,映射到SMRAM地址空间中?随着主板固件的复杂化,EFI逐步取代传统的BIOS,主板上的非易失性存储器容量将会越来越大,访问也越来越复杂,部分主板固件代码甚至本来就是在SMM下运行的。一旦在操作系统下将Rootkits代码写入了非易失性存储器(1997年的CIH病毒事件早已证明在操作系统下写入BIOS Flash是完全可能的),然后通过主板或者主板固件漏洞完成SMRAM地址空间映射等工作,Rootkits代码将可能永久驻留在主板上的非易失性存储器中,并随时可以通过进入SMM激活执行,甚至正常的电源管理需要进入SMM,也会激活Rootkits,而工作于Ring 0上的安全软件除非自身设法进入SMM,无法检测这种Rootkits代码,更无法监控进入SMM以后执行的Rootkits代码,就是将硬盘重新分区格式化,也无法清除隐藏在主板非易失性存储器中的Rootkits,Rootkits的超级隐藏和超级反清除将会成为可怕的现实!

由于并行总线自身的缺点(主要是干扰问题)限制了并行总线速度的进一步提高,PC高速总线串行化已经成为必然趋势。USB和IEEE1394取代并口,SATA取代ATA,PCI Express逐步取代PCI,甚至Intel Core i7 CPU的前端总线都已串行化——QPI总线等,都是这一趋势的体现,但串行总线协议通常都比并行总线协议复杂。越是复杂的总线协议,可能出现的漏洞就越多,通过这些协议漏洞进入本来只有通过特殊硬件电路才能进入的某些特权模式,例如SMM,就越有可能。

目前主板芯片组被某些公司垄断,主板设计技术,除非是专门的主板设计硬件工程师,了解甚少,而硬件工程师更多地关心硬件电路设计,往往对系统安全又缺乏了解,认为反病毒防黑客是软件工程师的事情,与自己无关,这样一来在设计主板硬件电路时更多地是考虑硬件成本、可靠性、兼容性等,并不考虑可能对软件安全性造成什么影响。在此提醒主板硬件工程师们:既然错误的单片机电路设计能让某些单片机的软件加密失效,那么错误的主板电路设计同样完全可能让PC软件的安全性化为乌有,在恶意代码的狂涛巨浪中,主板硬件电路(还有BIOS/主板固件)绝不是安全岛和避风港。

在此也要提醒信息安全产品厂商:Ring 0早已不是能够监控一切的最高特权级,SMM、VMM(用于虚拟机技术)等模式的出现,会让基于Ring 0的监控完全失效。软件漏洞会导致恶意代码,硬件漏洞也是一样,必须尽早注意到这种恶意代码越来越靠近底层硬件的趋势,加强与主板厂商以及其它硬件厂商的合作,在软件和硬件两方面阻止恶意代码的侵入。

回到本文的题目:CPU Rootkits的故事是一个神话,但这个神话离我们并不遥远,甚至可以说已经变成了真实的故事。尽管CPU Rootkits现在只是一个未完全长成的小妖怪,但它完全有成为恶魔的潜质,而且成长速度很快。没有绝对安全的系统,软件和硬件都是一样,防患于未然,未雨绸缪方为上策!

 

有删改,也添加了一些个人阅读笔记

原文:安天实验室 赵世平博士 发表于09年

评论

此博客中的热门博文

简单粗暴导出小米便签

我——终于一个人了

Ubiquiti_Networks_UniFi_Cloud_Key_authed_rce