面向RTF文件的Word漏洞分析
2015-11-19乐德广章亮郑力新李鑫陈经途
乐德广,章亮,郑力新,李鑫,陈经途
(1.常熟理工学院 计算机科学与工程学院,江苏 苏州215500;2.华侨大学 工学院,福建 泉州362021;3.厦门锐思特软件科技有限公司,福建 厦门361005)
随着互联网应用的普及,软件的安全问题变得日趋严重.自从2006年Word办公软件的一个严重漏洞被发现以来,Office办公软件的漏洞开始成为网络黑客攻击和利用的工具,而在这些漏洞当中,利用文件格式解析漏洞的攻击更是层出不穷[1].国内外的安全研究机构和学者也投入大量的精力研究文档类漏洞的检测和分析[2-4].近年来,由于Office Word程序在解析富文本格式(rich text format,RTF)文档时经常会触发漏洞,黑客就可以控制正在运行Word的特权用户,因此深入分析RTF文档解析过程显得极为必要.本文在研究RTF文档绘图属性的基础上,提出一种基于指令回溯调试及特征数据构造的Word程序漏洞逆向分析方法.
1 相关工作
1.1 RTF文档概述
RTF是微软公司为进行文本和图像信息格式的交换而制定的一种文件格式,它适用于不同的设备、操作环境和操作系统[5].RTF文件数据格式由未格式文本、控制字、控制符和组构成.其中,未格式化本文即单纯的编辑文本,不具有任何格式,是RTF文件的正文部分.控制字是RTF用来标记打印控制符和管理文档信息的一种特殊格式的命令,一个控制字最长32个字符.控制字的使用格式为
其中:每个控制字均以一个反斜杠\开头;字母序列由“a”~“z”的小写字母组成.
组由文本(包括在({})中)、控制字或控制符组成.左扩符({)表示组的开始,右扩符(})表示组的结束.每个组包括文本和文本的不同属性.一个RTF文件符合以下语法,即
从以上RTF文件语法可以看出,RTF文件包括文件头和文档区.其中,文件头的语法为
文档区的语法为
1.2 Word安全性分析
随着MS Office系列软件的广泛应用,doc,xls和ppt等文档已经成为日常工作文档的通用传递格式.Word.exe程序支持doc,txt,html,xml,rtf等数据格式的文件.由于Word支持的文件格式广泛,不同文件格式又相当复杂,因此,在该程序的设计和处理中不可避免地存在大量漏洞,如缓冲区溢出漏洞[6].缓冲区溢出漏洞包括栈溢出漏洞、堆溢出漏洞、释放后重用漏洞、远程代码执行漏洞等[7].
由于微软发布的Word软件存在漏洞的公告中,危害等级为“严重”的漏洞就经常涉及到RTF文件.例如,Microsoft Word RTF文件解析错误代码执行漏洞,Microsoft Word RTF数据处理远程内存破坏漏洞,Microsoft Word RTF文件释放后重用远程代码执行漏洞,Microsoft Office RTF分析器堆栈溢出漏洞和Microsoft Word RTF解析引擎堆溢出漏洞等[7].因此,文中重点分析RTF文档缓冲区溢出漏洞.
2 漏洞分析
2.1 RTF结构
通过对RTF的文件头和文档区分析,可以将整个RTF文档的结构分成可存数据区域和不可存数据区域两个部分,如图1所示.
对RTF文档进行重划分,其中在可存数据区域中,pFragments,pSegmentInfo,pVerticies,Themedata,Datastore等都是容易触发漏洞的区域,在这些区域中可以填写恶意代码(shellcode).Microsoft Word RTF文件解析缓冲区溢出漏洞就是解析RTF绘图属性pFragments时造成的缓冲区溢出漏洞.因此,文中重点研究Word程序在解析RTF文档绘图属性时产生的缓冲区溢出漏洞.
图1 RTF区块分割Fig.1 RTF Area Segmentation
2.2 RTF绘图属性逆向分析
通过指令回溯调试和特征数据构造方法逆向分析RTF的绘图属性.Word.exe程序解析该RTF文档中的pFragments属性时,其逆向关键代码如图2所示.
图2中:源代码是Word.exe程序解析pFragments属性的关键函数.在该函数中,方框中的rep指令是将esi所指向的pFragments属性值数据复制到edi所指向的缓冲区.复制的次数由mov,eax,ecx指令中的ecx寄存器决定.ecx寄存器的最大值为FFFFH,但是在执行rep指令进行复制之前,有一个移位运算shr ecx 2,所以ecx的最大值为3FFFH,rep指令复制的最大字节数为4×3FFFH=FFFCH B.由图2可知:该函数未严格检查pFragments属性值所占用的缓冲区空间大小.因此,需要确定由rep指令复制数据的缓冲区大小.
图2 Word解析RTF pFragments属性关键源代码Fig.2 Word key assembly codes for RTF pFragments attribute resolution
图3 RTF pFragments属性值缓冲区大小Fig.3 Buffer size of RTF pFragments attribute value
图2函数中的retn指令返回到该函数的调用指令处[8],如图3所示.图3中:地址0x30F0B5F8处的call dword ptr ds:[ax+0x1C]指令为图2的调用函数.通过逆向该函数调用前的栈操作指令可以看出:在地址0x30F0BEB处的lea ecx dword ptr ss:[ebp-0x10]指令在处理pFragments属性的时候,分配一个最大值为10HB的缓冲区给地址0x30F0B5F8的call函数.由图3可知:0x30F0B5F8处的call函数未严格检查pFragments属性值所占用的空间大小,当ecx的值大于10HB时,就会导致图2中地址0x30ED442C处的rep指令在复制pFragments属性值数据时产生缓冲区溢出.
图4 ecx初始值设置Fig.4 Initial value setting of ecx
由于ecx寄存器在程序的执行过程中被反复使用,采用传统的内存断点逆向方法很难确定给ecx赋初始值的指令[9].因此,采用一种新的指令回溯逆向方法来确定ecx赋初始值的指令.该方法通过追溯给ecx赋值的前一条指令,然后给该指令下断点,再通过断点的指令追溯给这条指令赋值的前一条指令,最终确定给ecx赋初始值的指令,其逆向关键代码如图4所示.由图4可知:[ebp-0x8]等于pFragments属性值的第5和第6个字节.当ja跳转指令执行跳转时,Word.exe程序执行的逆向关键代码如图5所示.
由图5可知:当ja跳转指令执行时,eax直接被赋值为0,导致ecx最终被赋值为0.由于rep指令所复制的字节数由ecx决定,而ja跳转指令决定ecx的值.因此,ja指令是否执行跳转决定pFragments属性值数据能否复制至缓冲区,是产生缓冲区溢出漏洞的条件之一.
图5 ja跳转流程Fig .5 Jump process of ja
根据上面的分析,基于特征数据构造的方法构造ja指令,采用不跳转的pFragments属性值特征数据,将该数据复制到缓冲区中,通过逆向Word.exe继续解析构造的pFragments属性值数据,其逆向关键代码如图6所示.
图6 特征值数据分析Fig.6 Characteristic data analysis
由图6可知:在Word.exe程序将构造好的pFragments属性值数据复制到缓冲区后,将执行方框中的指令.因此,继续采用基于特征数据构造的方法让je指令分别执行跳转和不跳转操作.当不产生跳转时,Word.exe程序将执行地址0x30F0B7CB处的call 30F0B90A,此时Word.exe程序不能正常返回,并最终造成程序直接崩溃;当je指令发生跳转时,Word.exe程序可以正常执行,并造成缓冲区溢出.因此,[ebp+10]的特征值为0000H.该特征值决定了构造的pFragments属性值数据能否让程序正常执行,这是产生缓冲区溢出漏洞的另一条件.
通过以上对于RTF文档绘图属性pFragments逆向分析可以得出:通过ja和je指令的2次正确跳转后,pFragments属性值数据才能够正确复制到缓冲区,并造成溢出.
2.3 Word解析RTF绘图属性漏洞分析流程
根据2.2节对RTF绘图属性分析,得出缓冲区溢出条件.Word在解析RTF绘图属性时产生溢出漏洞的流程,如图7所示.
由图7可知:RTF文档绘图属性产生7个步骤缓冲区溢出的流程.
步骤1首先,构造一个具有绘图属性的RTF文档,例如,test.rtf.
步骤2用Word.exe程序打开RTF文档.
步骤3Word.exe程序解析RTF绘图属性的sv属性值数据.
步骤4判断RTF文件绘图属性的sv属性值中是否包含有将sv属性值复制到缓冲区中的特征值数据,例如,[ebp+0xE]≤[ebp-0x4].如包含有该特征值,则执行步骤5;否则,Word.exe程序进入正常数据处理,并结束.
步骤5RTF文件绘图属性的sv属性值数据复制到缓冲区中.
步骤6判断RTF文件绘图属性的sv属性值数据是否包含程序正常返回的特征值数据,例如,[ebp+10]=0000H.如果包含特征值数据,则执行步骤7;否则,Word.exe程序进入异常数据的处理,并结束.
步骤7判断RTF文件绘图属性的sv属性值数据的长度是否大于到缓冲区存储空间,例如,[ebp-0x8]>10H.如果复制的sv属性值数据长度大于缓冲区存储空间,则造成溢出并触发漏洞;否则Word.exe程序进入正常数据处理,并结束.
图7 Word解析RTF绘图属性漏洞分析流程Fig.7 Analysis flows of word RTF drawing attribute resolution vulnerability
3 实验测试
对2.3节提出的RTF漏洞分析流程进行实验测试,测试硬件环境分别是I3-3110处理器,4G内存的笔记本电脑,I5-4460型处理器,4G内存的台式机,E31225v3型处理器及8G内存的服务器.操作系统是Windows XP SP3,软件是Office 2003SP2.首先,基于该流程构造POC(proof of concept)[10],并通过shellcode证明该漏洞分析流程的有效性.
3.1 POC的构造
根据RTF绘图属性漏洞分析的流程可以看出:绘图属性的sv属性值是能否触发漏洞的关键,只有在POC中构造合适的sv才能触发漏洞,造成缓冲区溢出.根据图7中步骤4的判断条件,构造sv属性值为
其中:sv的属性值是111122223333H;第1,2个字节构成的16进制数为1111H,第3,4个字节构成的16进制数为2222H,即(12)H<(34)H,所以这时可以复制3333H长度的sv属性值数据到缓冲区中.
虽然可以复制指定大小的数据到内存缓冲区中,但是并不知道这些数据能否让Word.exe程序正常执行,而程序能否正常执行也是通过sv属性值的特征数据来控制,该特征数据具体是在第47~50个字节处,需要将这4个字节置为0000H,程序才能正常执行.根据图7中步骤6的判断条件,进一步构造sv的属性值为
其中:第1~4个字节判断属性值数据能否复制至缓冲区;第5~6个字节指定拷贝属性值数据的长度;第7~50个字节是填入缓冲区的属性值数据;第47~50个字节为判断属性值数据能否让Word.exe程序正常执行的特征值数据.
打开构造好的POC文档test.rtf,缓冲区数据如图8所示.由图8可知:构造的数据已经成功复制到缓冲区中,只要合适长度数据就可以造成缓冲区溢出漏洞.
3.2 漏洞利用测试
通过构造shellcode,对漏洞进行利用测试.测试的shellcode功能是调用系统命令执行程序CMD窗口,所以在构造shellcode的过程中重点是自定位、获取kernel32.dll基地址以及API函数地址[11],其构造流程,如图9所示.
在获取完kernel32.dll的基址后,再通过PE文件导出函数表的结构可以获取构造shellcode所需要的API函数的地址,具体构造的shellcode机器码为
构造好shellcode后,需要将Word.exe程序的EIP指针指向shellcode入口处,采用jmp esp作为跳转地址,跳至shellcode处.由于Windows XP系统的jmp esp指令的跳转地址为0x7FFA4512[12],将Word.exe程序的返回地址通过缓冲区溢出修改为jmp esp的跳转地址0x7FFA4512.该地址在缓冲区中存储的数据为1245FA7FH.
RTF漏洞利用文档的完整数据为
其中:90H之后是shellcode的填充区域.
最后,将以上构造数据保存成RTF文档,并用Word.exe程序打开该RTF文档,结果如图10所示.由图10可知:打开构造好的POC文件弹出CMD命令行窗口,证明通过提出的漏洞分析流程所构造的RTF文档漏洞利用成功.
图8 缓冲区数据分布Fig.8 Distribution of buffer data
图9 shellcode构造流程Fig.9 Process flow of shellcode
图10 RTF文档漏洞利用结果 Fig.10 Utilization result of RTF vulnerability
4 结束语
分析了Office Word软件所面临的安全威胁,并对Word 2003程序在解析RTF文档时容易触发漏洞进行详细分析,提出一种面向RTF文档漏洞利用分析的方法,最后通过漏洞利用测试证明该方法的有效性.今后,还将针对WPS Office,Excel,Word 2007及更高版本程序做进一步研究,并基于Word漏洞分析进一步研究RTF文档解析漏洞的补丁加强对Word漏洞的攻击防御.此外,漏洞分析方法虽然在Win 32平台下具有可行性,但是对于其他平台,如Win 64或Linux平台,还没有进行验证,也需要在今后的工作中作进一步的验证.
[1]KUHN R,JOHNSON C.Vulnerability trends:Measuring progress[J].IT Professional,2010,12(4):51-53.
[2]史飞悦,傅德胜.缓冲区溢出漏洞挖掘分析及利用的研究[J].计算机科学,2013,40(11):143-146.
[3]陈恺,冯登国,苏璞睿.基于有限约束满足问题的溢出漏洞动态检测方法[J].计算机学报,2012,35(5):898-909.
[4]高志伟,姚尧,饶飞,等.基于漏洞严重程度分类的漏洞预测模型[J].电子学报,2013,41(9):1784-1787.
[5]Microsoft Corporation.Rich Text Format(RTF)Specification[EB/OL].[2014-10-08].http://msdn.microsoft.com/en-us/library/aa140277(office.10).aspx.
[6]李毅超,刘丹,韩宏,等.缓冲区溢出漏洞研究与进展[J].计算机科学,2008,35(1):87-90.
[7]CHANG Yung-yu,ZAVARSKY P,RUHL R,et al.Trend analysis of the CVE for software vulnerability management[C]∥Proceedings of IEEE Third International Conference on Privacy,Security,Risk and Trust(PASSAT)and IEEE Third Inernational Conference on Social Computing(SocialCom).Boston:Institute of Electrical and Electronic Engineers,2011:1290-1293.
[8]HUANG Shih-Kun,HUANG Min-Hsiang,HUANG Po-Yen,et al.Software crash analysis for automatic exploit generation on binary programs[J].IEEE Transactions on Reliability,2014,63(1):270,289.
[9]葛毅,茅兵,谢立.基于内存更新记录的漏洞攻击错误定位方法[J].计算机科学,2009,36(1):253-256.
[10]FATAUER T S,KHATTAB S,OMARA F A.OverCovert:Using stack-overflow software vulnerability to create a covert channel[C]∥Proceedings of IEEE 4th IFIP International Conference on New Technologies,Mobility and Security.Paris:Institute of Electrical and Electronic Engineers,2011:1-5.
[11]AN Zhi-yuan,LIU Hai-yan.Locating the address of local variables to achieve a buffer overflow[C]∥Proceedings of IEEE Fifth International Conference on Computational and Information Sciences.Shiyang:IEEE Press,2013:1999-2002.
[12]罗文华.基于逆向技术的恶意程序分析方法[J].计算机应用,2011,31(11):2766-2769.