[翻译]攻击互通性-以OLE为例
攻击互通性:以OLE为例
翻译 by 银雁冰
说明:本文为Haifei Li (haifei.li@intel.com)和Bing Sun (bing.sun@intel.com) 在2015年美国黑帽大会(BlackHat)的演讲PPT。该PPT对历史Office漏洞的原因做了深度探讨,是Office漏洞分析领域的经典paper。对Office漏洞有兴趣的小伙伴可以认真读一下这篇文章。
原文https://www.blackhat.com/docs/us-15/materials/us-15-Li-Attacking-Interoperability-An-OLE-Edition.pdf
相关译文http://bbs.pediy.com/thread-219234.htm
声明
?span style="font-size:9px; line-height:14px; font-family:none;"> 尽管我们要讨论的是OLE,代表对象链接与嵌入(Object Linking and Embedding),本次演讲我们只讨论嵌入(Embedding)。
?span style="font-size:9px; line-height:14px; font-family:none;"> 限于演讲时间
?span style="font-size:9px; line-height:14px; font-family:none;"> 这真是个很大的领域
议题
?span style="font-size:9px; line-height:14px; font-family:none;"> 什么是OLE?
?span style="font-size:9px; line-height:14px; font-family:none;"> 历史上与OLE相关的0day
?span style="font-size:9px; line-height:14px; font-family:none;"> 深入解析OLE
?span style="font-size:9px; line-height:14px; font-family:none;"> 攻击面
?span style="font-size:9px; line-height:14px; font-family:none;"> 结论
什么是OLE?
?span style="font-size:9px; line-height:14px; font-family:none;"> 对象链接与嵌入
?span style="font-size:9px; line-height:14px; font-family:none;"> 基于组件对象模型(COM)
?span style="font-size:9px; line-height:14px; font-family:none;"> 它服务于Office/WordPad的大部分互通性
?span style="font-size:9px; line-height:14px; font-family:none;"> 与默认/第三方应用程序一起工作,以给Office/WordPad用户丰富的文档特性
我们生活中的OLE是什么样的?
?span style="font-size:9px; line-height:14px; font-family:none;"> 将一个文档嵌入另一个文档

?span style="font-size:9px; line-height:14px; font-family:none;"> 通过双击”清单”里的文档,读者将能够打开另一个文档
?span style="font-size:9px; line-height:14px; font-family:none;"> 对Office用户来说非常方便
历史上与OLE相关的0day
?span style="font-size:9px; line-height:14px; font-family:none;"> 几乎所有之前的严重的Office/WordPad零日漏洞都涉及到OLE
?span style="font-size:9px; line-height:14px; font-family:none;"> CVE-2014-4114/6352(又名”沙虫”零日漏洞)
?span style="font-size:9px; line-height:14px; font-family:none;"> 报告于2014年10月,非常严重的逻辑漏洞
?span style="font-size:9px; line-height:14px; font-family:none;"> 在原始样本里面发现两个OLE对象
?span style="font-size:9px; line-height:14px; font-family:none;"> 在对CVE-2014-4114的初次修复中,微软并没有做到有效修复(译者注:这直接导致了CVE-2014-6352的公告)

?span style="font-size:9px; line-height:14px; font-family:none;"> CVE-2014-1761
?span style="font-size:9px; line-height:14px; font-family:none;"> 2014年3月被谷歌报告,是一起高度针对性的攻击
?span style="font-size:9px; line-height:14px; font-family:none;"> RTF文件格式解析错误,并不是一个位于OLE对象的漏洞,但是利用了OLE机制来加载一个未开启ASLR的模块”MSCOMCTL.DLL”,用来绕过ASLR
?span style="font-size:9px; line-height:14px; font-family:none;"> CVE-2013-3906
?span style="font-size:9px; line-height:14px; font-family:none;"> 2013年8月被我们检测到并报告
?span style="font-size:9px; line-height:14px; font-family:none;"> 微软图形组件错误,并不是一个位于OLE对象的漏洞,但是利用了ActiveX/OLE机制来进行Office中的堆喷射

?span style="font-size:9px; line-height:14px; font-family:none;"> CVE-2012-0158/CVE-2010-3333
?span style="font-size:9px; line-height:14px; font-family:none;"> 位于MSCOMCTL.OCX中的多年的老漏洞(译者注:CVE-2010-3333应位于mso.dll中,这里或许CVE-2012-1856更为合适,后者是MSCOMCTL.OCX中的一个UAF漏洞)
?span style="font-size:9px; line-height:14px; font-family:none;"> 经典OLE漏洞
?span style="font-size:9px; line-height:14px; font-family:none;"> 到今天还可以看到野外的样本

?span style="font-size:9px; line-height:14px; font-family:none;"> 补充一下:一个相似的0day攻击,也位于MSCOMCTL.OCX(CVE-2015-2424)
?span style="font-size:9px; line-height:14px; font-family:none;"> 在2014年6月15日被iSight的小伙伴公布
?span style="font-size:9px; line-height:14px; font-family:none;"> http://www.isightpartners.com/2015/07/microsoft-office-zero-day-cve-2015-2424-leveraged-by-tsar-team
简短总结
?span style="font-size:9px; line-height:14px; font-family:none;"> OLE对象不仅制造严重的零日漏洞,也在另外的Office/WordPad漏洞利用中起到了极大的帮助作用
?span style="font-size:9px; line-height:14px; font-family:none;"> 加载未开启ASLR的模块
?span style="font-size:9px; line-height:14px; font-family:none;"> 在Office进程中进行堆喷射
?span style="font-size:9px; line-height:14px; font-family:none;"> …
?span style="font-size:9px; line-height:14px; font-family:none;"> 漏洞类别覆盖从内存破坏到逻辑漏洞
深入解析OLE
之前的工作
?span style="font-size:9px; line-height:14px; font-family:none;"> 之前几乎没有关于于OLE内部机制的研究,但是我们要提到两个:
?span style="font-size:9px; line-height:14px; font-family:none;"> “Attacking Interoperability”
?span style="font-size:9px; line-height:14px; font-family:none;"> http://hustlelabs.com/stuff/bh2009_dowd_smith_dewey.pdf
?span style="font-size:9px; line-height:14px; font-family:none;"> Mark Dowd, Ryan Smith, and David Dewey 写于2009年
?span style="font-size:9px; line-height:14px; font-family:none;"> 我们这次演讲的题目是为了纪念这篇paper里面的伟大工作
?span style="font-size:9px; line-height:14px; font-family:none;"> Parvez Anwar的博客上有一些与Office/OLE相关的工作
?span style="font-size:9px; line-height:14px; font-family:none;"> https://www.greyhathacker.net/
OLE是COM的一个子集

深入解析OLE
?span style="font-size:9px; line-height:14px; font-family:none;"> 为了解释OLE的内部原理,首先我们需要理解当一个用户打开一个含有OLE的文档时会发生什么
OLE初始化
?span style="font-size:9px; line-height:14px; font-family:none;"> 初始化/加载一个OLE对象可以通过ole32!OleLoad()这一API来简单实现


?span style="font-size:9px; line-height:14px; font-family:none;"> 我们关注两个主要步骤
?span style="font-size:9px; line-height:14px; font-family:none;"> 步骤1:调用CoCreateInstance来初始化OLE对象
?span style="font-size:9px; line-height:14px; font-family:none;"> 步骤2:调用IPersistStorage来初始化OLE对象的初始状态(数据)
?span style="font-size:9px; line-height:14px; font-family:none;"> 接下来我们详细分析这两个步骤
步骤1: CoCreateInstance
ole32!wCreateObject+0x101:
75b41553 e8b387feff call ole32!CoCreateInstance (75b29d0b)
0018de38 0018de98 00000000 00000403 64c0c954
0:000> k
75b3f2af ole32!wCreateObject+0x101
75b3f1d4 ole32!OleLoadWithoutBinding+0x9c
632c4eb4 ole32!OleLoad+0x37
0:000> db poi(esp)
0018de98 02 26 02 00 00 00 00 00-c0 00 00 00 00 00 00 46
0:000> db poi(esp+4*3)
64c0c954 12 01 00 00 00 00 00 00-c0 00 00 00 00 00 00
CLSID来自哪里?
?span style="font-size:9px; line-height:14px; font-family:none;"> CLSID来自文档,指明用户想要初始化哪一个OLE对象
?span style="font-size:9px; line-height:14px; font-family:none;"> 因为Office/WordPad支持一系列的文档类型,不同类型定位CLSID的方式都不一样
?span style="font-size:9px; line-height:14px; font-family:none;"> Office Open-XML格式(.docx, .xlsx, .pptx, 等等)
?span style="font-size:9px; line-height:14px; font-family:none;"> RTF(.rtf)
?span style="font-size:9px; line-height:14px; font-family:none;"> Office二进制格式(.doc, .xls, .ppt, .pps, 等等)
?span style="font-size:9px; line-height:14px; font-family:none;"> Office甚至支持HTML格式
?span style="font-size:9px; line-height:14px; font-family:none;"> 我们只举例给出Open-XML格式和RTF格式里面的CLSID来源
Open-XML格式中的CLSID
?span style="font-size:9px; line-height:14px; font-family:none;"> 对于Open-XML格式,CLSID从”OLESS”二进制数据文件中读入
RTF中的CLSID
?span style="font-size:9px; line-height:14px; font-family:none;"> RTF文档用过时的OLE1.0格式来定义一个OLE对象
?span style="font-size:9px; line-height:14px; font-family:none;"> https://msdn.microsoft.com/en-us/library/dd942402.aspx
?span style="font-size:9px; line-height:14px; font-family:none;"> 指定一个CLSID是通过指定位于”\objdata”控制字中相应的ProgID来完成的
?span style="font-size:9px; line-height:14px; font-family:none;"> 在运行时,ProgID将会通过CLSIDFromProgID被“转换”成CLSID(如果ProgID不合法,而且接下来的native数据遵循OLESS格式,CLSID将会从OLESS native数据中读取)
步骤2: IPersistStorage::Load
ole32!wCreateObject+0x1f9:
75b3eb41 ff5118 call dword ptr [ecx+18h]
ds:0023:6fb614a8={packager!CPackage::Load (6fb66171)}
0:000> k
75b3f2af ole32!wCreateObject+0x1f9
75b3f1d4 ole32!OleLoadWithoutBinding+0x9c
5c0e4eb4 ole32!OleLoad+0x37
?span style="font-size:9px; line-height:14px; font-family:none;"> 容器调用OLE对象的IPersistStorage接口中的”Load()”方法来初始化OLE对象的初始状态

?span style="font-size:9px; line-height:14px; font-family:none;"> https://msdn.microsoft.com/en-us/library/windows/desktop/ms679731(v=vs.85).aspx
?span style="font-size:9px; line-height:14px; font-family:none;"> IID:0000010a-0000-0000-C000-000000000046

当初始化的时候为OLE对象加载其初始“状态”
Storage Data
?span style="font-size:9px; line-height:14px; font-family:none;"> 如何处理IStorage—加载它的初始状态,其实取决于OLE对象
?span style="font-size:9px; line-height:14px; font-family:none;"> 因为执行IPersistStorage接口的代码位于OLE提供者(OLE对象)
?span style="font-size:9px; line-height:14px; font-family:none;"> Storage Data(由” IStorage”参数提供)是存储在文档文件里的
?span style="font-size:9px; line-height:14px; font-family:none;"> 和”CLSID”域一样,它也来自文档文件(这可以由攻击者提供)
?span style="font-size:9px; line-height:14px; font-family:none;"> 但是两者也有一些不同
?span style="font-size:9px; line-height:14px; font-family:none;"> OLE容器(Office/WordPad)读取CLSID是为了去初始化OLE对象
?span style="font-size:9px; line-height:14px; font-family:none;"> OLE容器读取Storage Data并将它传递给OLE对象,由OLE对象负责处理读入的数据
Office Open-XML 格式中的Storage Data
?span style="font-size:9px; line-height:14px; font-family:none;"> 由OLESS数据文件提供
?span style="font-size:9px; line-height:14px; font-family:none;"> 下面的例子展示了Flash Player OLE对象的Storage Data
?span style="font-size:9px; line-height:14px; font-family:none;"> D27CDB6E-AE6D-11CF-96B8-444553540000
?span style="font-size:9px; line-height:14px; font-family:none;"> 从OLESS数据文件(oleObject.bin)中读入Storage Data
?span style="font-size:9px; line-height:14px; font-family:none;"> 从”Contents”节里面读入
RTF中的Storage Data
?span style="font-size:9px; line-height:14px; font-family:none;"> 由OLE1 Native Data提供
?span style="font-size:9px; line-height:14px; font-family:none;"> 相关描述见这里:https://msdn.microsoft.com/en-us/library/dd942053.aspx
短暂休息
?span style="font-size:9px; line-height:14px; font-family:none;"> 我们已经解释了OLE初始化过程中的两个关键步骤
?span style="font-size:9px; line-height:14px; font-family:none;"> 接下来,让我们看一下”Verb”动作

OLE”Verb”动作
?span style="font-size:9px; line-height:14px; font-family:none;"> 本质上,执行”Verb”动作其实只是调用了OLE对象的IOleObject::DoVerb方法
?span style="font-size:9px; line-height:14px; font-family:none;"> IOleObject
?span style="font-size:9px; line-height:14px; font-family:none;"> https://msdn.microsoft.com/en-us/library/windows/desktop/dd542709(v=vs.85).aspx
?span style="font-size:9px; line-height:14px; font-family:none;"> IID: 00000112-0000-0000-C000-000000000046
?span style="font-size:9px; line-height:14px; font-family:none;"> 这个接口上有24个方法
?span style="font-size:9px; line-height:14px; font-family:none;"> 这个IOleObject::DoVerb方法有一些参数,但是我们只需要关注其中一个,即第一个参数:”iVerb”,这个参数在特定场景下可以被攻击者控制
?span style="font-size:9px; line-height:14px; font-family:none;"> 举个例子,通过提供PowerPoint放映文件(.ppsx, .pps)
IOleObject::DoVerb
packager!CPackage::DoVerb:
731e580c 8bff mov edi,edi
0:000> dd esp
0031c89c 660651c6 0054ec80 FFFFFFFD 00000000
借助文档的攻击面
?span style="font-size:9px; line-height:14px; font-family:none;"> 所以,什么是攻击者可能会在一次基于文档的攻击中使用的呢?
?span style="font-size:9px; line-height:14px; font-family:none;"> 我们需要理解一个攻击者可以从文档中提供什么数据
?span style="font-size:9px; line-height:14px; font-family:none;"> 攻击者是否能够提供在OLE初始化过程中CoCreateInstance函数所需的CLSID
?span style="font-size:9px; line-height:14px; font-family:none;"> 答案是:Yes(前面已经解释)
?span style="font-size:9px; line-height:14px; font-family:none;"> 攻击者是否能够提供在OLE初始化过程中的IPersistStorage::Load所需的Storage
?span style="font-size:9px; line-height:14px; font-family:none;"> 答案是:Yes(前面已经解释)
?span style="font-size:9px; line-height:14px; font-family:none;"> 攻击者是否能够提供在OLE”Verb”动作执行时所需的”Verb”id?
?span style="font-size:9px; line-height:14px; font-family:none;"> 答案是:Yes(前面已经解释)
攻击面I: IPersistStorage::Load
?span style="font-size:9px; line-height:14px; font-family:none;"> 这是最常见的的一种
?span style="font-size:9px; line-height:14px; font-family:none;"> 你想要去解析一些数据;我给你伪造的数据
?span style="font-size:9px; line-height:14px; font-family:none;"> 有时候这会导致内存破坏,有时候这可能会变成一个逻辑漏洞
?span style="font-size:9px; line-height:14px; font-family:none;"> 事实上,大多数之前被公开的OLE漏洞都位于IPersistStorage::Load方法
?span style="font-size:9px; line-height:14px; font-family:none;"> 让我们来给出几个例子
CVE-2012-0158
?span style="font-size:9px; line-height:14px; font-family:none;"> 大多数之前的分析已经展现过下图了,在MSCOMCTL.OCX模块中
[图片:628056_u1zjeosymjuytct.png]
?span style="font-size:9px; line-height:14px; font-family:none;"> 但是,漏洞函数究竟来自哪里?
?span style="font-size:9px; line-height:14px; font-family:none;"> 往前追踪,我们到了这里
[图片:628056_bo6i2ew0m88h5ik.png]
?span style="font-size:9px; line-height:14px; font-family:none;"> sub_276008D9函数到底是什么?
?span style="font-size:9px; line-height:14px; font-family:none;"> 在一番逆向后,我们意识到这其实是IPersistStorage::Load方法

?span style="font-size:9px; line-height:14px; font-family:none;"> 事实上,这个基于栈的溢出位于IPersistStorage::Load方法
“Package”临时文件释放
?span style="font-size:9px; line-height:14px; font-family:none;"> 在2014年7月的McAfee实验室博客上被报告
?span style="font-size:9px; line-height:14px; font-family:none;"> https://blogs.mcafee.com/mcafee-labs/dropping-files-temp-folder-raises-security-concerns
?span style="font-size:9px; line-height:14px; font-family:none;"> Demo: http://justhaifei1.blogspot.com/2014/08/demonstration-of-windowsoffice-insecure.html
?span style="font-size:9px; line-height:14px; font-family:none;"> 还未被修复!
?span style="font-size:9px; line-height:14px; font-family:none;"> 最近,(谷歌的)James Forshaw在他发现的一个NTLM反射权限提升漏洞中的利用中利用了这个特性:
https://code.google.com/p/google-security-research/issues/detail?id=325
?span style="font-size:9px; line-height:14px; font-family:none;"> 这个问题也位于” IPersistStorage::Load”方法中
0:000> r
packager!CPackage::EmbedReadFromStream+0x2c6:
733c404d call packager!CopyStreamToFile (733c6974)
0:000> du poi(esp+4)
04fdc008 "C:\Users\ADMINI~1\AppData\Local\"
04fdc048 "Temp\dwmapi.dll"
0:000> k
733c4aaa packager!CPackage::EmbedReadFromStream+0x2c6
733c627e packager!CPackage::PackageReadFromStream+0x6b
7749eb44 packager!CPackage::Load+0x10d
攻击面II: IOleObject::DoVerb
?span style="font-size:9px; line-height:14px; font-family:none;"> 这是IOleObject::DoVerb的”iVerb”参数

?span style="font-size:9px; line-height:14px; font-family:none;"> “iVerb”的值可以在一些攻击者可以控制的地方被定义。举个例子:PowerPoint Show
?span style="font-size:9px; line-height:14px; font-family:none;"> 攻击者可以提供”iVerb”的值,然后自动调用” IOleObject::DoVerb”方法
?span style="font-size:9px; line-height:14px; font-family:none;"> 举个例子,通过PowerPoint Show的” Animations”特性
?span style="font-size:9px; line-height:14px; font-family:none;"> 不同的值会导致不同的动作。举个例子:
?span style="font-size:9px; line-height:14px; font-family:none;"> 你给0,它会执行预定义的动作0,可能是打开这个对象
?span style="font-size:9px; line-height:14px; font-family:none;"> 你给-1,它会执行预定义的动作1,可能做一些另外的事情
?span style="font-size:9px; line-height:14px; font-family:none;"> OLE对象可以选择不去执行他们的IOleObject而使用默认/标准接口
?span style="font-size:9px; line-height:14px; font-family:none;"> 这导致了一些标准的”verb”动作
?span style="font-size:9px; line-height:14px; font-family:none;"> 看接下来的分析
?span style="font-size:9px; line-height:14px; font-family:none;"> 然而,也有一些OLE对象选择去执行它们自己的IOleObject
?span style="font-size:9px; line-height:14px; font-family:none;"> 一个开发者实现的操作,但是可能被坏人滥用
?span style="font-size:9px; line-height:14px; font-family:none;"> 通常是逻辑问题
标准的”Verb”动作
?span style="font-size:9px; line-height:14px; font-family:none;"> https://msdn.microsoft.com/en-us/library/windows/hardware/z326sbae(v=vs.71).aspx
沙虫零日漏洞
?span style="font-size:9px; line-height:14px; font-family:none;"> “沙虫”零日攻击(CVE-2014-4114)是第一个针对” IOleObject::DoVerb”攻击载体的利用

?span style="font-size:9px; line-height:14px; font-family:none;"> 当”verb”为3时,执行右键菜单动作!
?span style="font-size:9px; line-height:14px; font-family:none;"> 哪里错了?
?span style="font-size:9px; line-height:14px; font-family:none;"> 不同文件类型的右键菜单选项是不一样的
?span style="font-size:9px; line-height:14px; font-family:none;"> 文件内容和文件名(文件类型)由”IOleObject::DoVerb”进行控制
?span style="font-size:9px; line-height:14px; font-family:none;"> 记得我们的”Package”临时文件释放案例的研究吗?它们是一样的!
?span style="font-size:9px; line-height:14px; font-family:none;"> 所以,这个整洁的零日漏洞事实上利用了两个攻击载体
?span style="font-size:9px; line-height:14px; font-family:none;"> 举个例子,安装一个.inf文件
?span style="font-size:9px; line-height:14px; font-family:none;"> Pwned!逻辑漏洞!
攻击面III: CLSID相关联的DLL加载
?span style="font-size:9px; line-height:14px; font-family:none;"> 到此,我们已经讨论了OLE的两个重要的攻击载体:IPersistStorage::Load和IOleObject::DoVerb
?span style="font-size:9px; line-height:14px; font-family:none;"> 还有其他的吗?
?span style="font-size:9px; line-height:14px; font-family:none;"> 当然
?span style="font-size:9px; line-height:14px; font-family:none;"> 让我们来回顾一下加载一个OLE对象的最前面几个步骤
?span style="font-size:9px; line-height:14px; font-family:none;"> 调用CoCreateInstance尝试去初始化OLE对象,OLE对象由CLSID指定,CLSID在文件文件中提供
?span style="font-size:9px; line-height:14px; font-family:none;"> CoCreateInstance干了些什么?如下:
CoGetClassObject(rclsid, dwClsContext, NULL, IID_IClassFactory, &pCF);
hresult = pCF->CreateInstance(pUnkOuter, riid, ppvObj)
pCF->Release();
?span style="font-size:9px; line-height:14px; font-family:none;"> CoCreateInstance需要首先加载与CLSID相关联的DLL到进程
什么是“CLSID相关联的”DLL
?span style="font-size:9px; line-height:14px; font-family:none;"> 在你的注册表里面,一个DLL有一个相关联的CLSID
?span style="font-size:9px; line-height:14px; font-family:none;"> HKEY_CLASSES_ROOT\CLSID
?span style="font-size:9px; line-height:14px; font-family:none;"> “InprocServer32”键指定了当前CLSID对应的DLL(“server”)位于哪儿
?span style="font-size:9px; line-height:14px; font-family:none;"> 这里能出什么问题?
?span style="font-size:9px; line-height:14px; font-family:none;"> 从一个攻击者的角度?
?span style="font-size:9px; line-height:14px; font-family:none;"> 正如我们讨论过的那样,OLE对象是COM对象的一个子集,而COM对象又是CLSID相关联的对象的子集
?span style="font-size:9px; line-height:14px; font-family:none;"> 许多注册在操作系统中的COM对象并不是OLE对象
?span style="font-size:9px; line-height:14px; font-family:none;"> 几百个 v.s. 几千个
?span style="font-size:9px; line-height:14px; font-family:none;"> 有时候甚至一个在注册表中有CLSID相关联的DLL并不是一个COM
?span style="font-size:9px; line-height:14px; font-family:none;"> 但是,CoCreateInstance将仍然加载CLSID相关联的DLL到进程
?span style="font-size:9px; line-height:14px; font-family:none;"> 不管这个DLL是否是一个”OLE DLL”
?span style="font-size:9px; line-height:14px; font-family:none;"> 被加载的DLL不会被卸载,即使它在后面被发现不是一个”OLE DLL”
?span style="font-size:9px; line-height:14px; font-family:none;"> 在我们看来,这是Windows初始化OLE对象过程中的一个*设计*问题
?span style="font-size:9px; line-height:14px; font-family:none;"> 在没有加载DLL之前,你无从知道是否COM暴露了你想要的接口!
?span style="font-size:9px; line-height:14px; font-family:none;"> 让我们来将其与它著名的“姐妹”特性比较一下:IE浏览器中的ActiveX控件
?span style="font-size:9px; line-height:14px; font-family:none;"> 不像OLE,IE11加载一个ActiveX控件时会首先检查”白名单”列表
?span style="font-size:9px; line-height:14px; font-family:none;"> HKLM\Software\Microsoft\Windows\CurrentVersion\Ext\PreApproved
?span style="font-size:9px; line-height:14px; font-family:none;"> 所以,如果当前的ActiveX CLSID不在列表里面,相关联的DLL不会被加载到IE进程
?span style="font-size:9px; line-height:14px; font-family:none;"> IE进程里面的ActiveX是没有问题的
后果
?span style="font-size:9px; line-height:14px; font-family:none;"> 我们讨论的这个问题会导致怎样的坏结果?
?span style="font-size:9px; line-height:14px; font-family:none;"> 我们可以加载任何DLL到进程,只要这个DLL有其相关联的CLSID
?span style="font-size:9px; line-height:14px; font-family:none;"> 考虑到攻击通过文档来启动
?span style="font-size:9px; line-height:14px; font-family:none;"> 有一些这样的例子
?span style="font-size:9px; line-height:14px; font-family:none;"> 注意:加载OLE DLL可能也会有相同的问题。但是,能够加载每一个CLSID相关联的DLL *显著地* 增大了攻击载体
后果1: 加载未开启ASLR的DLL
?span style="font-size:9px; line-height:14px; font-family:none;"> 在容器进程中加载一个未开启ASLR的DLL
?span style="font-size:9px; line-height:14px; font-family:none;"> 也就是说,Word,PowerPoint,Excel,WordPad
?span style="font-size:9px; line-height:14px; font-family:none;"> 然后可以在利用时被用来绕过ASLR
?span style="font-size:9px; line-height:14px; font-family:none;"> 注意,不仅是CLSID相关联的DLL会有未开启ASLR的情况,有时候CLSID相关的DLL也可以链接到另一些未开启ASLR的Dlls(所以这些DLL也会被加载)
?span style="font-size:9px; line-height:14px; font-family:none;"> 这一攻击面在Office 2013及以后版本无效,因为它们开启了”强制ASLR”
?span style="font-size:9px; line-height:14px; font-family:none;"> http://blogs.technet.com/b/srd/archive/2013/12/11/software-defense-mitigating-common-exploitation-techniques.aspx
?span style="font-size:9px; line-height:14px; font-family:none;"> 不过仍然可以工作在Office<=2010< span="">和WordPad上面
案例1:otkloadr.WRAssembly.1
?span style="font-size:9px; line-height:14px; font-family:none;"> 尝试去加载被ProID定义的“COM对象”:otkloadr.WRAssembly.1
?span style="font-size:9px; line-height:14px; font-family:none;"> 这甚至不是一个COM!
?span style="font-size:9px; line-height:14px; font-family:none;"> 将会加载”C:\Program Files\Microsoft Office\Office14\ADDINS\OTKLOADR.DLL”,这会导致加载其链接的一个,位于同一目录下的未开启ASLR的模块:MSVCR71.DLL
?span style="font-size:9px; line-height:14px; font-family:none;"> 2014年6月被Parvez Anwar公开http://www.greyhathacker.net/?p=770 ,已经被微软修复
案例2:mscormmc.dll
?span style="font-size:9px; line-height:14px; font-family:none;"> 这个未开启ASLR的DLL在默认的Windows 7上
?span style="font-size:9px; line-height:14px; font-family:none;"> C:\Windows\Microsoft.NET\Framework\v1.0.3705\mscormmc.dll
?span style="font-size:9px; line-height:14px; font-family:none;"> 有好些CLSIDs与这个DLL相关联,举个例子:
?span style="font-size:9px; line-height:14px; font-family:none;"> {18BA7139-D98B-43C2-94DA-2604E34E175D}
?span style="font-size:9px; line-height:14px; font-family:none;"> 构造一个带有这个CLSID的含OLE对象的Office或RTF文档,你就可以加载这个未开启ASLR的DLL到进程
?span style="font-size:9px; line-height:14px; font-family:none;"> 到现在还是管用的!找到一个未开启ASLR的DLL比较简单,找到它只花了几分钟的时间
后果2: 内存破坏
?span style="font-size:9px; line-height:14px; font-family:none;"> 有些时候,加载一个“未准备好的”DLL足够触发内存破坏了
?span style="font-size:9px; line-height:14px; font-family:none;"> 例子:微软Office内存未初始化漏洞 (CVE-2015-1770)
?span style="font-size:9px; line-height:14px; font-family:none;"> CLSID: CDDBCC7C-BE18-4A58-9CBF-D62A012272CE
?span style="font-size:9px; line-height:14px; font-family:none;"> 相关联的DLL: C:\Program Files\Microsoft Office\Office15\OSF.DLL
?span style="font-size:9px; line-height:14px; font-family:none;"> 只要尝试加载与上面的CLSID相关联的DLL就会给你一个crash(可利用)!
?span style="font-size:9px; line-height:14px; font-family:none;"> OSF.DLL当然不是被设计用来给你作为一个OLE或者ActiveX对象加载的
?span style="font-size:9px; line-height:14px; font-family:none;"> 由MWR实验室的Yong Chuan Koh发现,更多细节请看:
https://labs.mwrinfosecurity.com/system/assets/987/original/mwri_advisory_cve-2015-1770.pdf
后果3: DLL劫持
?span style="font-size:9px; line-height:14px; font-family:none;"> 还有一种藏在深处的攻击场景
?span style="font-size:9px; line-height:14px; font-family:none;"> 注意,这是关于基于文档的攻击
?span style="font-size:9px; line-height:14px; font-family:none;"> 当前工作目录是攻击者可以控制的
?span style="font-size:9px; line-height:14px; font-family:none;"> 我其实不应当去解释一个DLL劫持攻击

?span style="font-size:9px; line-height:14px; font-family:none;"> CVE-2015-2369是我们报告的一个很好的例子,在不久前的6月补丁日刚被修复
?span style="font-size:9px; line-height:14px; font-family:none;"> 最小的POC甚至不到一条twitter的长度(140字节)
{\rt\object\objocx{\objdata 010500000200000014000000574D444D434553502E574D444D434553502E3100000000000000000001000000410105000000000000}}
?span style="font-size:9px; line-height:14px; font-family:none;"> CLSID相关联的DLL
?span style="font-size:9px; line-height:14px; font-family:none;"> ProgID: WMDMCESP.WMDMCESP.1
?span style="font-size:9px; line-height:14px; font-family:none;"> CLSID: {067B4B81-B1EC-489f-B111-940EBDC44EBE}
?span style="font-size:9px; line-height:14px; font-family:none;"> DLL: %systemroot%\System32\cewmdm.dll
?span style="font-size:9px; line-height:14px; font-family:none;"> 将会导致从当前目录加载一个叫做”rapi.dll”的DLL
?span style="font-size:9px; line-height:14px; font-family:none;"> 演示!(译者注:略)
对攻击载体的总结
?span style="font-size:9px; line-height:14px; font-family:none;"> 基于受害者打开文档的时间流,这些攻击载体是:
?span style="font-size:9px; line-height:14px; font-family:none;"> 许多类型的攻击可能发生在”CLSID相关联的DLL加载”过程中—“OLE对象初始化最开始的步骤”
l 加载未开启ASLR的DLL
l 内存破坏
l DLL劫持
l …
?span style="font-size:9px; line-height:14px; font-family:none;"> 许多类型的漏洞可能存在于” IPersistStorage::Load”例程,”OLE对象初始化”的另一个步骤
?span style="font-size:9px; line-height:14px; font-family:none;"> 通过”IOleObject::DoVerb”对“Verb”动作的攻击
l 通常为逻辑漏洞,更加危险
每一步都被攻击了

对攻击面的总结
?span style="font-size:9px; line-height:14px; font-family:none;"> OLE机制提供了巨大的攻击面
?span style="font-size:9px; line-height:14px; font-family:none;"> 不像ActiveX,一个OLE对象没有被像“白名单列表”,“脚本安全(SFS)”,“初始化安全(SFI)”这样的安全加固特性的严格限制
?span style="font-size:9px; line-height:14px; font-family:none;"> 能够加载任何CLSID相关的DLL使得攻击面变得更大
?span style="font-size:9px; line-height:14px; font-family:none;"> 默认Windows上有几百个OLE对象
?span style="font-size:9px; line-height:14px; font-family:none;"> 默认Windows上有几千个CLSID相关联的DLL
?span style="font-size:9px; line-height:14px; font-family:none;"> 不要忘记这是一个开放领域
?span style="font-size:9px; line-height:14px; font-family:none;"> app装的越多,攻击面就变得越大
?span style="font-size:9px; line-height:14px; font-family:none;"> 有一天我们会看到基于文档的,针对系统上装有特定软件的特定用户的攻击
*注意OLE加载过程会查询IE/Office Killbit,所以如果一个CLSID被Killbited了,相关联的DLL将不会被加载。
结论
?span style="font-size:9px; line-height:14px; font-family:none;"> OLE机制服务于大多数微软的文档与其他组件的互通性
?span style="font-size:9px; line-height:14px; font-family:none;"> 提供了一个巨大的攻击面
?span style="font-size:9px; line-height:14px; font-family:none;"> 又一个ActiveX?
?span style="font-size:9px; line-height:14px; font-family:none;"> 即使它不具有脚本特性,它可以做比我们预想中多得多的事
?span style="font-size:9px; line-height:14px; font-family:none;"> 在这次演讲之后可以预期到什么?
?span style="font-size:9px; line-height:14px; font-family:none;"> 可能会有更多OLE相关的漏洞会被发现
?span style="font-size:9px; line-height:14px; font-family:none;"> 可能会出现更多针对Office/WordPad的攻击
?span style="font-size:9px; line-height:14px; font-family:none;"> 沙箱和静态方式的检测和防御都需要被改进
?span style="font-size:9px; line-height:14px; font-family:none;"> 一个OLE特定的检测方法正在路上
*最近我们已经报告了一些新的逃逸技巧(https://blogs.mcafee.com/mcafee-labs/threat-actors-use-encrypted-office-binary-format-evade-detection),提示(大家)正确检出基于Office的攻击的困难性。
?span style="font-size:9px; line-height:14px; font-family:none;"> 致厂商(微软)
?span style="font-size:9px; line-height:14px; font-family:none;"> 这个很有问题的”OLE加载”机制需要被重新审视,或许需要重新设计
?span style="font-size:9px; line-height:14px; font-family:none;"> 你不能只仅仅加载每一个CLSID相关联的DLL到Office/WordPad进程
?span style="font-size:9px; line-height:14px; font-family:none;"> 需要在默认操作系统内部进行大规模的渗透测试
?span style="font-size:9px; line-height:14px; font-family:none;"> 新的攻击载体制造了许多新的漏洞
?span style="font-size:9px; line-height:14px; font-family:none;"> 训练第三方厂商
?span style="font-size:9px; line-height:14px; font-family:none;"> 就像你们之前对ActiveX的做法那样
主要引用
[1] Mark Dowd, Ryan Smith and David Dewey. “Attacking Interoperability”. [Online] http://hustlelabs.com/stuff/bh2009_dowd_smith_dewey.pdf
[2] Don Box. “Essential COM”. [Book] https://books.google.com/books/about/Essential_COM.html
[3] WikipediA. “Object Linking and Embedding”. [Online] https://en.wikipedia.org/wiki/Object_Linking_and_Embedding
[4] Haifei Li. “Bypassing Microsoft’s Patch for the Sandworm Zero Day: a Detailed Look at the Root Cause” [Online] https://blogs.mcafee.com/mcafee-labs/bypassing-microsofts-patch-sandworm-zero-day-root-cause
[5] Haifei Li. “Bypassing Microsoft’s Patch for the Sandworm Zero Day: Even ‘Editing’ Can Cause Harm”. [Online] https://blogs.mcafee.com/mcafee-labs/bypassing-microsofts-patch-for-the-sandworm-zero-day-even-editing-can-cause-harm
[6] Haifei Li. “A Close Look at RTF Zero-Day Attack CVE-2014-1761 Shows Sophistication of Attackers”. [Online] https://blogs.mcafee.com/mcafee-labs/close-look-rtf-zero-day-attack-cve-2014-1761-shows-sophistication-attackers
[7] Haifei Li. “McAfee Labs Detects Zero-Day Exploit Targeting Microsoft Office”. [Online] https://blogs.mcafee.com/mcafee-labs/mcafee-labs-detects-zero-day-exploit-targeting-microsoft-office-2
[8] venustech. “CVE-2012-0158 Analysis Report”. [Online] http://www.venustech.com.cn/NewsInfo/449/13620.Html
[9] Jonathan Leathery. “Microsoft Office Zero-Day CVE-2015-2424 Leveraged By Tsar Team”. [Online] http://www.isightpartners.com/2015/07/microsoft-office-zero-day-cve-2015-2424-leveraged-by-tsar-team
[10] Haifei Li. “Dropping Files Into Temp Folder Raises Security Concerns”. [Online] https://blogs.mcafee.com/mcafee-labs/dropping-files-temp-folder-raises-security-concerns
[11] Parvez Anwar. “Bypassing Windows ASLR in Microsoft Word using Component Object Model (COM) objects”. [Online] http://www.greyhathacker.net/?p=770
[12] Yong Chuan Koh. “Microsoft Office Uninitialised Memory Use Vulnerability”. [Online] https://labs.mwrinfosecurity.com/system/assets/987/original/mwri_advisory_cve-2015-1770.pdf

