第一节 引子
微软Office系统软件(Word/Excel/PowerPoint等),一直是电脑上最为常用的办公软件之一,在国内外都拥有大量的用户。另一方面,利用Office系列软件的漏洞进行网络攻击已经成为黑客惯用的手段,广泛运用于APT攻击,抓肉鸡,传播勒索病毒等。其中一种典型的攻击方式是“鱼叉攻击”:黑客将包含漏洞的文档伪装成为一个正常的Office文档,并精心构造文件名,然后投递到用户邮箱,如果用户不小心打开文档,恶意代码便会悄悄执行,用户完全没有感知。
另外,随着新版本的Office不断发布,微软逐渐停止了对于老版本Office的技术支持,包括提供安全更新。2017年10月,微软就正式停止了对Office 2007的技术支持。这本是软件生命周期中不可避免的事情,但对于使用Office软件的用户来说,除非升级到更新的版本,否则将面临被黑客攻击的风险。然而,事实上目前仍有大量的用户选择不升级,而是继续使用老版本的Office软件。
针对上述情况,腾讯电脑管家安全实验室对2017年Office漏洞以及漏洞攻击进行了深入的分析和整理,并向全社会输出此报告,希望更多的人能够了解Office漏洞以及危害,进一步提高安全意识;同时也希望各家安全厂商能够同心协力,一起来为用户建设更加安全的网络环境。
第二节 Office漏洞补丁数据及分析
截止到10月,微软在2017年一共发布了372个Office漏洞补丁,除了1月和2月之外,微软每个月的发布的Office补丁数量都在30个以上,其中9月最高,发布了74个补丁,每月发布的补丁具体数量详见下图:
从漏洞补丁发布的数量来看,如果用户不及时使用Windows Update或者第三方安全软件打补丁修复漏洞,将面临极大的安全风险。
根据腾讯电脑管家的统计,目前大约有48%的用户仍然在使用低版本的Office软件,包括Office 2007/Office 2003等;同时,微软对于Office 2007以上版本的也不是完全支持:对于Office 2010和Office 2013来说,支持SP2及以上版本,对于Office 2013来说,支持SP1及以上版本。Office各版本用户分布如下图:
对于这些使用低版本Office的用户来说,他们将不再会收到任何Office漏洞的安全更新,即使这个漏洞已经被黑客掌握并频繁用于网络攻击。
更为糟糕的是,很多用户虽然使用的是较高版本的Office,可以收到Office漏洞的安全更新通知,但是由于安全意识的缺乏,往往选择不安装安全更新。以今年曝光的RTF漏洞CVE-2017-0199为例:
漏洞编号 |
漏洞曝光时长 |
补丁发布时间 |
未修复比例 |
CVE-2017-0199 |
6个月 |
2017年4月 |
23.81% |
这个漏洞在网络上公开曝光的时长已经超过了6个月,黑客早已掌握该漏洞的利用技术,并发起了多起网络攻击;另一方面,微软在2017年4月份的安全更新中就发布了该漏洞的补丁,电脑管家也多次提醒用户修复该漏洞,但截止当前,仍然有超过1/5的用户没有选择修复该漏洞。
第三节 Office漏洞攻击案例分析
2017年注定是网络安全不平静的一年,WannaCry勒索病毒利用微软SMB“永恒之蓝”漏洞横扫全球计算机网络,让所有人都切身感受到了漏洞作为网络攻击武器的强大威力。其实在2017年,Office漏洞攻击也层出不穷,对政府、企业和个人都造成了很大的威胁。下面我们针对一些典型的Office漏洞攻击案例来做分析。
(一) 利用Office漏洞进行APT攻击
Office漏洞常常用于APT攻击,对于高价值目标,甚至会使用未公开的Office 0Day漏洞。2017年就曝光了数个Office0Day漏洞野外攻击样本,而我们也捕获了一些利用Office漏洞的APT攻击样本。
CVE-2017-8759是2017年曝光的Office0Day漏洞之一,在漏洞曝光后的几天内,我们就捕获到了攻击样本。攻击载体是一个名为《香港记者***.doc》的Word文档,通过钓鱼邮件发动鱼叉攻击。文档中嵌入了恶意载荷,触发CVE-2017-8759漏洞后执行,会从指定URL下载一个名为whoamifile.jpeg的hta文件:
whoamifile.jpeg文件的功能是下载指定服务器上的youcandowhat.jepg文件到临时目录并执行,该文件是一个远程控制木马LameRat的安装包。LameRat能够检测数十种国内外主流安全软件,并进行相应的绕过安装,适配当前主流的windows操作系统。
LameRat主要功能都通过下发各种插件完成,分析发现该木马下发的插件多大数十种,能够实现各种复杂的定向功能:
(二) 利用Office漏洞传播僵尸网络
僵尸网络的主要传播路径为海量发送钓鱼邮件。随着民众安全意识的提高,直接发送可执行文件的钓鱼文件被成功打开的几率变得越来越低,而发送文档类型的文件则能大大提高点击率,因此Office漏洞也成了僵尸网络传播者的最常用的手段之一。在CVE-2017-0199漏洞曝光后,我们就拦截到了大量利用该漏洞的钓鱼邮件,邮件附件中携带了CVE-2017-0199漏洞利用程序,一旦收件人在未打补丁的电脑上打开附件中的Doc文件,就会感染Loki Bot僵尸网络木马:
传播的Loki Bot僵尸网络,会盗取大量账号密码。
(三) 利用Office漏洞传播勒索病毒
勒索病毒是近年来互联网安全面临的主要威胁之一。除了WannaCry,Petya等知名勒索病毒之外,迄今我们已经发现了数百种的勒索病毒及其变种,而Office漏洞也成为了勒索病毒传播的主要手段之一。以下是我们近期拦截到的利用CVE-2017-0199打包的敲诈者病毒邮件:
漏洞触发后释放的木马是一个敲诈者病毒,能够加密电脑中的多种文档类型文件,并且用到RSA2048非对称加密,理论上无法破解,木马还会根据加密文件的数量和大小等来判断要勒索的比特币数量。
越来越多的攻击者更加倾向于利用Office漏洞文档来进行恶意行为,相比传统的可执行程序更具有迷惑性。若攻击者使用鱼叉或水坑攻击方式,并结合社会工程学手段,精心构造文档名及伪装内容,安全意识薄弱的用户很容易中招。
第四节 漏洞原理分析
2017年曝光了好几个Office漏洞以及漏洞的利用方法,这一定程度上导致了Office漏洞攻击的泛滥。接下来将从技术角度去揭露这些漏洞的原理,以及漏洞修复的思考。我们相信,只有深入理解这些漏洞,才有可能做出更好的防御。
(一) 逻辑漏洞CVE-2017-0199、CVE-2017-8570
CVE-2017-0199是Microsoft Office的OLE处理机制实现上存在的一个逻辑漏洞,此漏洞的成因主要是word在处理内嵌OLE2LINK对象时,通过网络更新对象时没有正确处理Content-Type所导致的一个逻辑漏洞。攻击者可利用这个漏洞构造恶意Office文件,当用户打开特殊构造的恶意Office文件后,无需其他的操作,就可以实现在用户系统上执行任意命令,从而控制用户系统。
这个漏洞的利用非常简单,不同于内存破坏漏洞,它不需要做内存布局,不需要绕过微软采用的一系列诸如ASLR、DEP之类的漏洞缓解措施,就能实现从远程服务器下载执行任意代码,而且成功率非常高,同时影响office所有版本。在2017年BlackHat黑帽大会上,CVE-2017-0199获得了最佳客户端安全漏洞奖。
CVE-2017-0199涉及到两个危险的COM对象:
CLSID_SCRIPTLET = {06290bd3-48aa-11d2-8432-006008c3fbfc}
CLSID_HTA = {3050f4d8-98b5-11cf-bb82-00aa00bdce0b}
CLSID_HTA是一个表示Microsoft HTML Application(文件后缀.hta)的全局唯一标识符,由32个16进制字符组成。scriptlet又称为Windows Script Component(WSC),其设计目的是执行Javascript、VBScript以及PerlScript等脚本语言,同样也可以执行XML文件中的脚本代码。
微软在4月份发布补丁修复了CVE-2017-0199,分成两部分,一部分是针对Office的补丁,修改了MSO.dll,一部分是针对Windows的补丁,修改了ole32.dll,需要office补丁和Windows补丁两者结合一起,才能完整修复这个漏洞。微软在补丁中加入了一套过滤机制,在office尝试初始化这两个危险的COM对象时,直接拒绝掉。
单纯地过滤COM对象的GUID很容易,但是可以寻找另外的COM对象来绕过补丁,这导致了另外一个漏洞:CVE-2017-8570的诞生,安全研究人员另外找到了一个GUID为{06290BD2-48AA-11D2-8432-006008C3FBFC}的COM对象,它和之前的GUID非常类似:
{06290BD3-48AA-11D2-8432-006008C3FBFC}
{06290BD2-48AA-11D2-8432-006008C3FBFC}
可以看到两者只相差一位。这个新的GUID绕过了微软针对CVE-2017-0199的补丁,微软不得不继续添加过滤列表,在8月份继续发布补丁封堵了这个新的GUID。在可以想象的将来,预计这个过滤列表会继续增加下去。
(二) EPS漏洞CVE-2017-0261、CVE-2017-0262
EPS是封装的PostScript(Encapsulated PostScript)格式。PostScript语言是Adobe 公司设计用于向任何支持PostScript语言的打印机打印文件的页面描述语言。EPS图片实际上就是一个PostScript程序。
Office文档中可以嵌入各种格式的图片,例如GIF、JPG、PNG等等,也可以嵌入EPS图片,每种图片都有对应的处理模块,例如GIF图片由GIFIMP32.FLT处理,EPS图片由EPSIMP32.FLT处理。在打开Office文档时,会创建一个FLTLDR.EXE的进程,加载各种图片的处理模块,当文档中嵌入EPS图片时,EPSIMP32.FLT会被加载进来,用于渲染EPS图片。
CVE-2017-0261是一个EPS的UAF漏洞,PostScript中,本地VM中的对象分配和对本地VM中的现有对象的修改由称为save和restore的功能完成,它们可以用来封装位于本地VM中的PostScript语言程序的相关代码。restore能够释放新建的对象,并撤消从相应的save操作后对现有对象的修改,回收从save操作后所分配的内存。当与forall运算符组合时,攻击者就可以实施类似Use-After-Free的漏洞攻击了,下图显示了利用save和restore操作的伪代码:
通过操作save操作符之后的操作,攻击者能够操纵内存布局,并将UAF漏洞转换为读/写原语。攻击者创建了一个字符串,利用漏洞将它的长度设置为0x7fffffff,基数为0。此时,攻击者拥有了读写任意用户内存的能力,EPS图片中的PostScript脚本可以进一步搜索gadgets来构建ROP链,使用ROP链来修改存放shellcode的内存块为可执行。这样恶意的shellcode就能够在FLTLDR.EXE进程中运行了。
CVE-2017-0262是一个EPS的类型混淆漏洞,由forall操作符引发的,它可以改变执行流程,允许攻击者控制栈上的值。攻击者继而利用了两个数组对象,实现了EPSIMP32.FLT的基址泄漏和任意地址读写:
然后进一步构造ROP链,通过ROP实现了shellcode的执行。
这两个漏洞最终都实现了在FLTLDR.EXE进程中执行任意代码,但它是一个沙箱进程,权限很低,所以攻击者还需要利用内核提权漏洞来实现沙箱逃逸,获取到系统的最高控制权。
由于脚本语言的灵活性,微软的一些漏洞缓解机制如ASLR、DEP等相继被绕过,这使得微软在5月份的office补丁中做出了很激进的修复措施,直接禁止了EPSIMP32.FLT的加载,也就是说,office不再支持EPS图片格式,一劳永逸地杜绝了所有的EPS漏洞。
(三) .NET Framework漏洞CVE-2017-8759
CVE-2017-8759本质上是一个.Net Framework漏洞,影响所有主流的.NET Framework版本。现在主流的windows 7、windows 10等操作系统中都默认安装了.NET Framework,任何使用SOAP服务的软件都能通过.NET Framework触发,当然它也可以集成到office文档中,用户只要双击打开office文档,无需其他操作,即可触发该漏洞,实现任意代码执行。漏洞位于:
https://referencesource.microsoft.com/#System.Runtime.Remoting/metadata/wsdlparser.cs
中的PrintClientProxy函数中,该函数用于将解析wsdl文件后得到的信息格式化成.cs代码,其中部分代码如下所示:
soap:address中的location指定了SOAP的URL地址,在6142行、6149行中,调用了WsdlParser.IsValidUrl()函数来格式化location指定的URL地址,这个函数代码如下所示:
这个函数功能很简单,将解析得到的URL地址前面加上@”,末尾再加上”,就返回了,例如,string value输入的URL地址是https://guanjia.qq.com,会被格式化成@”https://guanjia.qq.com”返回给调用者。6148行、6149行、6150行三行代码会格式化成如下所示的代码:
// base.ConfigureProxy(this.GetType(), @"”https://guanjia.qq.com”
一个wsdl文件中可以指定多个location,从以上代码中可以看到,只有第一个location才是有效的,从第二个开始,会加上注释符//,整个URL地址会被当作注释内容输出到.cs代码中,然后会创建csc.exe进程,由它编译生成一个名字类似于http*****.dll,这个DLL会被加载到office进程中,由于最终编译生成的.dll里面不会包含注释的URL地址,在正常情况下,这里不会有任何问题。但是WsdlParser.IsValidUrl()函数中没有考虑输入的string value会包含一个换行符的情况,例如,我们捕获的攻击样本中指定了如下所示的一个location:
WsdlParser.IsValidUrl()函数格式化后,会生成如下的代码:
我们可以看到注释符//只注释了base.ConfigureProxy(this.GetType(), @";,由于换行符的存在,它不会注释掉接下来的4行代码,这些代码会被编译到最后生成的http*****.dll中,被office进程加载后执行。
在样本中,通过代码:
System.Diagnostics.Process.Start(_url.Split('?')[1], _url.Split('?')[2]);
创建了mshta.exe进程,通过“_url.Split('?')[2]”指定让mshta.exe从攻击者控制的远程服务器中拉取到一个.db文件,里面嵌入了一段VBScript脚本,会由mshta.exe解析执行,进一步从攻击者控制的远程服务器中拉取远控木马下载执行。
微软在9月份的补丁中修改了WsdlParser.IsValidUrl()函数,它循环遍历location中指定的每一个字符,对于换行符这样的特殊符号,不会输出它,对于不是数字也不是字母的字符,打印成\u****十六进制形式输出,例如,上述攻击者指定的有问题的location最终生成如下的代码:
这样就有效避免了最终生成的代码中出现换行符的情况,也确保了注释符//能注释掉location中指定的内容。
(四) 类型混淆漏洞CVE-2017-11826
CVE-2017-11826是一个类型混淆漏洞,Microsoft Word的OOXML解析器在处理docx文档的word/document.xml时,没有正确地验证标签对象是否闭合,造成类型混淆,通过精心构造标签和内存布局,最终可以造成任意代码执行。这个漏洞影响所有版本的word。下图是我们捕获到的一个利用该漏洞的RTF样本:
该RTF首先会进行堆喷,做内存布局,然后释放一个带CVE-2017-11826漏洞的.docx文档,触发漏洞后,借助word中一个没有启用ASLR的msvbvm60.dll,构造ROP链,把shellcode所在的内存区设为可执行,实现在word中执行任意代码。
微软在10月份的补丁中修复了这个漏洞,在处理没有闭合的标签时做了额外的判断,不会出现之前的类型混淆问题。
第五节 漏洞防御
由于很多用户仍然在使用低版本的Office,同时很多用户并没有养成及时打补丁的习惯,腾讯电脑管家除了推送漏洞补丁之外,对于利用Office漏洞进行的攻击,也做了针对性的防御方案,供同行参考和指正:
1、绝大多数被黑客利用的Office漏洞,比如早些年的CVE-2012-0158、CVE-2015-1641,以及2017年的CVE-2017-11826,都属于内存破坏型的漏洞。这类漏洞无一例外都要用到未开启ASLR的DLL来执行ROP,突破DEP。针对这点,腾讯电脑管家对Office系列软件的进程做了特殊处理,每当进程加载一个DLL时,会判断该DLL是否开启了ASLR,如果没有的话,会强制该DLL加载到另外一个随机的地址上去,这样硬编码的ROP就会失效,从而有效防御这类漏洞;
2、对于EPS漏洞,比如早些年的CVE-2015-2545和2017年的CVE-2017-0261、CVE-2017-0262,虽然也属于内存破坏型的漏洞,但是由于能够执行EPS脚本,灵活性非常大,精心构造的话有可能绕过ASLR+DEP。微软为了根治这个问题,已经在今年4月份的Office补丁中禁用了EPS,管家针对一些没有安装EPS漏洞补丁的Office也做了同样的处理,禁止了处理EPS图片的EPSIMP32.FLT模块加载;
3、对于逻辑型漏洞,比如CVE-2017-0199、CVE-2017-8570、.Net漏洞CVE-2017-8759,由于不涉及到二进制层面的漏洞利用,直接Bypass掉了微软以及安全软件对于漏洞利用的缓解和防御机制。针对这类漏洞,腾讯电脑管家加强了Office进程的主动防御逻辑,包括根据Office进程的关系链制定拦截规则,禁止Office创建高风险进程等。
第六节 结语
在本研究报告撰写的同时,利用OfficeDDE(动态数据交换)特性的一种新型攻击手段已经在网络扩散。虽然该攻击需要用户交互,但由于安全意识的缺乏,仍然有不少用户中招。这无疑又给我们敲了一次警钟:无论过去,现在,还是将来,Office漏洞攻击仍然会不断持续,也会不断出现新的攻击手段。作为安全从业者,我们一方面需要不断加强用户安全教育,提高用户安全意识,另一方面,也需要不断加强自身产品的安全能力。任重道远,与诸君共勉!