Microsoft Office安全性:嵌入式对象



最初,Microsoft Office的体系结构是基于复合文档的概念构建的,它们也是OLE文档 ,由Microsoft在32位Windows黎明时积极推广。 当时,“无缝地”将各种格式的数据组合到一个文档中的想法似乎很诱人,并且引人入胜,并且在发现第一个问题之前,它就牢固地成长为许多大型产品。

“坏消息”是,将数据添加到文档中的通用方法(以及用于处理该数据的代码)已成为在产品中引入漏洞的通用方法,今天,它仍然为恶意软件安全研究人员的创建者带来了惊喜。

随后,该应用程序包收到了一套相当丰富的工具,用于添加图像,图形和图表以及由应用程序创建和处理的控件元素,这些元素是文档中的一部分。 从安全性的角度来看,这些元素的兴趣要比文章中将主要讨论的元素稍少-这些元素使用的外部应用程序代码是通过OLE添加到文档中的。

复合文档的“磁盘”表示形式是CFBF文件 。 本文将讨论在运行时加载到内存中的数据和代码的上下文中,对象在Microsoft Office文档中的嵌入(或者仅是安全方面)。

Microsoft Office文档中的正式嵌入对象可以分为以下几组:

  • ActiveX控件(ActiveX控件)
  • OLE嵌入式对象
  • 嵌入式文件(
  • 非OLE内联元素

ActiveX控件


ActiveX控件可以表示为程序窗口的元素(例如,按钮,单选按钮,列表,输入字段和其他形式),旨在产生某些事件或响应事件。 曾几何时,创建这样的通用控制元素似乎是一个好主意,并且可以在任何应用程序中使用,并为此目的将它们放入COM组件中

ActiveX内置网页代表了一个著名的Internet Explorer安全漏洞,安全措施随着时间的推移而增加。 来自其他制造商的浏览器几乎立即放弃了ActiveX支持。 新的Microsoft Edge浏览器终于​​与过去的历史遗忘了。 但是,仍可以嵌入Office文档中。

文档中的ActiveX旨在与Visual Basic for Applications结合使用。 但是,不需要VBA来下载和激活它们,也不需要用户许可才能从白名单中下载项目

后者中的漏洞特别危险-安装应用程序时设置的默认设置并不意味着对加载这些元素没有任何保护,也没有警告用户。 管理员需要通过禁止加载任何ActiveX控件来收紧设置(但是,请注意,ActiveX不会以安全浏览模式加载)。
范例:CVE-2012-0158

CVE-2012-0158是2012年Office文档中最危险的漏洞之一。 MSCOMCTL.OCX库中Microsoft ListView Control 6.0元素的加载代码包含缓冲区溢出的可能性,该缓冲区溢出允许替换返回地址并执行任意代码。 由于该项目位于ActiveX“白名单”中,因此在打开文档后立即开始加载。 该漏洞当前已修复; ListView控件仍被视为“安全”。

将ActiveX添加到文档


要将控件元素添加到Microsoft Office文档中(为简单起见,请使用Word),请使用用户界面打开“开发人员”选项卡(其可见性在“ Word选项”菜单中配置),然后选择“控件”->“以前版本中的工具”->“ ActiveX控件”。 该菜单将演示与Microsoft Forms元素相对应的一组图标,以及从包含ActiveX元素的列表中选择ActiveX的能力,这些元素是根据许多条件选择的。



显示的列表与实际可加载到文档中的元素集不对应,因此在搜索易受攻击的元素时无法对其进行引导。 对下载的ActiveX进行复杂的多级验证有多个阶段,Office版本各不相同,并且更新与更新之间也有所不同,因此检查可下载性的最可靠方法是手动将文档文件与感兴趣的元素组合在一起,然后尝试在Office中打开它。 可能的文档格式如下所述。

节目介绍


每个ActiveX元素实质上都是满足某些要求的COM类之一的对象。 使用COM子系统加载元素,并且可执行代码包含在其中一个模块中,这些模块通常在容器应用程序“外部”。 像任何COM对象一样,ActiveX元素可以实现为DLL或可执行EXE文件。 在第一种情况下,库将被加载到容器的地址空间中;在第二种情况下,将在单独的过程中处理元素,并通过COM封送在容器和对象之间传输数据。

像任何COM对象一样,ActiveX具有InterfacesPropertiesMethods

接口主要是ActiveX类必须具有的一组标准接口,才能完全加载并与容器进行交互,尤其是IOleControl和IOleObject。

缺少任何必要的接口可能会降低元素的功能或在某个阶段中断其加载。
范例:CVE-2015-2424
漏洞CVE-2015-2424与mmcndmgr.dll库中的TaskSymbol类元素相关联。 该元素不适合在文档中使用,并且未导出IDispatch接口。 在加载元素的过程中,请求此接口的过程收到一个错误,并破坏了元素的内部结构,从而导致了先用后用类型的漏洞。 目前,该项目不允许下载(尽管如此,仍然可以在要添加到“开发人员”菜单的列表中找到该项目)。 漏洞本身无法解决。
除标准接口外,每个ActiveX类还导出“主”接口,代表其自身的独特功能。 例如,对于Forms.CommandButton.1类,这是ICommandButton。

您可以使用Microsoft Visual Studio软件包中包含的OleView工具查看ActiveX界面。



元素的接口定义其“ 方法”和“ 属性” 。 属性表示确定元素外观和操作的某些数据。 ActiveX元素的开发人员为每个属性分配一个特定的名称,例如BackColor或GridLineWidth,以及一个类型,例如字符串,整数或实数双精度。 对于位图图像和图标,有一种属性,例如图片。 客户端程序可以通过设置控件的整数索引和值来设置控件的各个属性。

从低级实现的角度来看,方法和属性的划分是形式化的,因为“属性”由一组get / set方法表示。 但是,有一个显着的区别:对于Office文档,只能从正在运行的VBA程序中以编程方式调用元素的方法(其主界面)。 从安全的角度来看,这不是很重要,因为VBA执行已经是操作系统的一种折衷。 属性被保存在文档中,并且在打开文档时, 即使禁止执行VBA ,也将对其进行处理并将其加载到内存中的结构中。

从软件的角度来看,为了保留元素的属性和状态,该容器提供了IStreamIStorageIPropertyBag接口 。 它们在磁盘文件中的实现和数据表示不再是ActiveX元素的问题,而是完全取决于容器和文档的格式。 应该注意的是,存储数据的集合和格式可以对应于“公开”导出的属性集合,或者可以完全不同。 考虑与Microsoft Office有关的实现示例。

复合文件(CFBF)


Office文档格式已过时 ,其中分配了ObjectPool低级存储和其中的单独子目录来存储ActiveX数据。 流“ \ 001CompObj”包含类标识符,该类标识符最终确定所加载对象的类。 直接用十六进制替换标识符将导致尝试加载完全不同类的对象。



Office Open XML


现代XML文档格式。 该文件是一个zip存档。 ActiveX控件数据以简单的名称(如activeX1.xml)存储在ActiveX子目录中。



示例文件:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ax:ocx ax: classid="{D7053240-CE69-11CD-A777-00DD01143C57} " ax: persistence="persistPropertyBag" xmlns:ax="http://schemas.microsoft.com/office/2006/activeX" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
<ax:ocxPr ax:name="Caption" ax:value="CommandButton1"/>
<ax:ocxPr ax:name="Size" ax:value="2540;847"/>
<ax:ocxPr ax:name="FontName" ax:value="Calibri"/>
<ax:ocxPr ax:name="FontHeight" ax:value="225"/>
<ax:ocxPr ax:name="FontCharSet" ax:value="204"/>
<ax:ocxPr ax:name="FontPitchAndFamily" ax:value="2"/>
<ax:ocxPr ax:name="ParagraphAlign" ax:value="3"/>
</ax:ocx>


在这些文件中,类标识符以文本形式表示。 替换标识符也将导致尝试加载另一个类的元素。

接下来,该文件包含对象数据存储类型的指示:persisterPropertyBag,persistStorage或persistStream。 如果元素支持persistPropertyBag属性,则其数据可以存储在同一文本文件中 ,请参见上面的示例。 如果他需要存储二进制流 ,则数据将保存在名称为activeX1.bin类型的文件中,该文件为CFBF文件



RTF


在rtf文档中,ActiveX元素由\ object \ objocx标记定义。 \ objdata标记包含元素的属性存储,作为CFBF文件的十六进制表示。

{\object\objocx\f37\objsetsize\objw1440\objh480{\*\objclass Forms.CommandButton.1}
{\*\objdata 010500000200000016000000
466f726d732e436f6d6d616e64427574746f6e2e31000000000000000000000e0000
d0cf11e 0a1b11ae1000000000000000000000000000000003e000300feff090006


从文件下载


从整个文档加载ActiveX的过程非常简单。 容器应用程序创建指定类的干净对象,从其请求指定存储接口,并提供指向存储,流或“属性包”的指针。

筛选可以加载的项目有许多步骤。 首先,消除了黑名单中指定的称为Office COM Kill Bit (注册表提示* OFFICE_KEY * \ Common \ COM兼容性)的类。 例如,反下载标志具有诸如Microsoft Scriptlet Component和Microsoft Web Browser之类的类。

其余的类将经历初始加载。 这意味着DLL将被加载到容器应用程序中,或者将启动在EXE文件中实现的COM服务器的进程 。 只有在此之后,才会执行其余检查,包括基本检查-对象是否实际上是ActiveX代表。
范例:CVE-2015-6128
在2015年, 研究人员发现预加载COM模块可用于通过加载伪造的动态库来绕过ASLR并执行任意代码 。 随后发布的CVE-2015-6128并不是关于Microsoft Office的一句话。
如果标识符确实定义了ActiveX,它将在多个黑名单和白名单中进行更多检查。

在默认设置下,在干净的Windows 7和Office 2016上从.docx启动ActiveX的列表。
{00024522-0000-0000-C000-000000000046} RefEdit.Ctrl
{02AF6DD2-77E6-44DF-B3E1-57CF1476D8EA} Microsoft Forms 2.0 OptionButton
{04082FC6-E032-49F2-A263-FE64E9DA1FA3} Microsoft Forms 2.0 HTML TEXT
{0B314611-2C19-4AB4-8513-A6EEA569D3C4} Microsoft Slider Control, version 6.0
{13D557B6-A469-4362-BEAF-52BFD0F180E2} Microsoft Forms 2.0 HTML TextAREA
{19FED08E-EFD1-45da-B524-7BE4774A6AEE} Microsoft Forms 2.0 ListBox
{20DD1B9E-87C4-11D1-8BE3-0000F8754DA1} Microsoft Date and Time Picker Control 6.0 (SP4)
{227B1F3B-C276-4DE0-9FAA-C0AD42ADDCF0} Microsoft Forms 2.0 HTML RESET
{232E456A-87C3-11D1-8BE3-0000F8754DA1} Microsoft MonthView Control 6.0 (SP4)
{3D0FD779-0C2D-4708-A9BA-62F7458A5A53} Microsoft Forms 2.0 ToggleButton
{444D2D27-02E8-486B-9018-3644958EF8A9} FieldListCtrl.2 Object
{4C599241-6926-101B-9992-00000B65C6F9} Microsoft Forms 2.0 Image
{5052A832-2C0F-46c7-B67C-1F1FEC37B280} Microsoft Forms 2.0 Label
{5512D110-5CC6-11CF-8D67-00AA00BDCE1D} Microsoft Forms 2.0 HTML SUBMIT
{5512D112-5CC6-11CF-8D67-00AA00BDCE1D} Microsoft Forms 2.0 HTML IMAGE
{5512D114-5CC6-11CF-8D67-00AA00BDCE1D} Microsoft Forms 2.0 HTML RESET
{5512D116-5CC6-11CF-8D67-00AA00BDCE1D} Microsoft Forms 2.0 HTML CHECKBOX
{5512D118-5CC6-11CF-8D67-00AA00BDCE1D} Microsoft Forms 2.0 HTML OPTION
{5512D11A-5CC6-11CF-8D67-00AA00BDCE1D} Microsoft Forms 2.0 HTML TEXT
{5512D11C-5CC6-11CF-8D67-00AA00BDCE1D} Microsoft Forms 2.0 HTML Hidden
{5512D11E-5CC6-11CF-8D67-00AA00BDCE1D} Microsoft Forms 2.0 HTML Password
{5512D122-5CC6-11CF-8D67-00AA00BDCE1D} Microsoft Forms 2.0 HTML SELECT
{5512D124-5CC6-11CF-8D67-00AA00BDCE1D} Microsoft Forms 2.0 HTML TextAREA
{556C2772-F1AD-4DE1-8456-BD6E8F66113B} Microsoft ImageList Control 6.0 (SP6)
{585AA280-ED8B-46B2-93AE-132ECFA1DAFC} Microsoft StatusBar Control 6.0 (SP6)
{5CBA34AE-E344-40CF-B61D-FBA4D0D1FF54} Microsoft Forms 2.0 HTML CHECKBOX
{5E90CC8B-E402-4350-82D7-996E92010608} Microsoft Forms 2.0 HTML OPTION
{603C7E80-87C2-11D1-8BE3-0000F8754DA1} Microsoft UpDown Control 6.0 (SP4)
{6240EF28-7EAB-4dc7-A5E3-7CFB35EFB34D} Microsoft Forms 2.0 ScrollBar
{65BCBEE4-7728-41A0-97BE-14E1CAE36AAE} Microsoft Office List 16.0
{6C177EBD-C42D-4728-A04B-4131892EDBF6} Microsoft Forms 2.0 ComboBox
{787A2D6B-EF66-488D-A303-513C9C75C344} Microsoft Forms 2.0 HTML Password
{79176FB0-B7F2-11CE-97EF-00AA006D2776} Microsoft Forms 2.0 SpinButton
{86F56B7F-A81B-478d-B231-50FD37CBE761} Microsoft Forms 2.0 CommandButton
{87DACC48-F1C5-4AF3-84BA-A2A72C2AB959} Microsoft ImageComboBox Control, version 6.0
{8B2ADD10-33B7-4506-9569-0A1E1DBBEBAE} Microsoft Toolbar Control 6.0 (SP6)
{8BD21D10-EC42-11CE-9E0D-00AA006002F3} Microsoft Forms 2.0 TextBox
{8BD21D20-EC42-11CE-9E0D-00AA006002F3} Microsoft Forms 2.0 ListBox
{8BD21D30-EC42-11CE-9E0D-00AA006002F3} Microsoft Forms 2.0 ComboBox
{8BD21D40-EC42-11CE-9E0D-00AA006002F3} Microsoft Forms 2.0 CheckBox
{8BD21D50-EC42-11CE-9E0D-00AA006002F3} Microsoft Forms 2.0 OptionButton
{8BD21D60-EC42-11CE-9E0D-00AA006002F3} Microsoft Forms 2.0 ToggleButton
{9432194C-DF54-4824-8E24-B013BF2B90E3} Microsoft Forms 2.0 HTML SUBMIT
{95F0B3BE-E8AC-4995-9DCA-419849E06410} Microsoft TreeView Control 6.0 (SP6)
{978C9E23-D4B0-11CE-BF2D-00AA003F40D0} Microsoft Forms 2.0 Label
{9A948063-66C3-4F63-AB46-582EDAA35047} Microsoft TabStrip Control 6.0 (SP6)
{9BDAC276-BE24-4F04-BB22-11469B28A496} Microsoft Forms 2.0 HTML IMAGE
{A0E7BF67-8D30-4620-8825-7111714C7CAB} Microsoft ProgressBar Control, version 6.0
{CCDB0DF2-FD1A-4856-80BC-32929D8359B7} Microsoft ListView Control 6.0 (SP6)
{D7053240-CE69-11CD-A777-00DD01143C57} Microsoft Forms 2.0 CommandButton
{DCA0ED3C-B95D-490f-9C60-0FF3726C789A} Microsoft Forms 2.0 Image
{DD4CB8C5-F540-47ff-84D7-67390D2743CA} Microsoft Forms 2.0 TextBox
{DFD181E0-5E2F-11CE-A449-00AA004A803D} Microsoft Forms 2.0 ScrollBar
{E9729012-8271-4e1f-BC56-CF85F914915A} Microsoft Forms 2.0 CheckBox
{EA778DB4-CE69-4da5-BC1D-34E2168D5EED} Microsoft Forms 2.0 SpinButton
{EAE50EB0-4A62-11CE-BED6-00AA00611080} Microsoft Forms 2.0 TabStrip
{F14E8B03-D080-4D3A-AEBA-355E77B20F3D} Microsoft Forms 2.0 HTML SELECT
{F8CF7A98-2C45-4c8d-9151-2D716989DDAB} Microsoft Visio Document
{FB453AD8-2EF4-44D3-98A8-8C6474E63CE4} Microsoft Forms 2.0 HTML Hidden
{FDEA20DB-AC7A-42f8-90EE-82208B9B4FC0} Microsoft Forms 2.0 TabStrip
{FE38753A-44A3-11D1-B5B7-0000C09000C4} Microsoft Flat Scrollbar Control 6.0 (SP4)

您可以看到列表中的重要位置被Microsoft Forms组的组件占据。 这是Office附带的一组控件,您可以在ActiveX控件面板中看到它们。 最初,它们都被注册为“安全”,但是随着时间的流逝,对于单个元素而言,事实并非如此。 例如,Frame元素加载任何其他ActiveX而不检查任何列表(在最新版本中,此列表是“固定的”,但是Frame自己的黑名单与一般Office不同)。 因此,某些Microsoft Forms元素只能在用户许可的情况下加载到文档中。 Microsoft Forms Frame也需要用户同意(默认设置),但是它允许您从Kill Bit列表中下载某些在其他条件下无法加载的项目。

因此,如果攻击者设法说服用户允许ActiveX加载,由于诸如Web浏览器之类的因素,Frame将帮助他大大扩展武器库。

[MS-OFORMS]规范部分记录了Microsoft Forms属性存储格式。

在ActiveX扫描期间,事实证明doc,docx和rtf的类集不同,并且对于以常规方式运行并以自动化模式运行的应用程序,可用ActiveX的列表也不同。

许多流行的应用程序使用自己的ActiveX来补充这些列表。 如果发现了漏洞,它将在公告中反映为与它所属于的应用程序相关。 但是,利用此漏洞的唯一方法可能是Office文档。
示例:Flash ActiveX
病毒编写者特别喜欢Flash ActiveX,因为它们始终可检测到的漏洞以及在IE和Office白名单中的永久位置。 此组件中的第一个已知漏洞早在2008年就出现了,最后的CVE-2018-4878中的一个漏洞已于今年2月关闭。 随着IE的逐渐消失,Office文档已成为分发Flash漏洞的主要方法。

嵌入式OLE数据元素


所实现的OLE元素旨在实现“文档中的文档”概念,并具有编辑其他应用程序处理的各种格式的就地数据的能力。 像ActiveX一样,OLE文档是在COM的基础上实现的。

您可以按照以下步骤将OLE元素添加到Word文档:打开“插入”选项卡,然后选择“文本”->“对象”。 该程序将显示为其注册OLE处理程序的文档类型的列表。 与ActiveX一样,此列表与实际上可以作为OLE文档加载的类集不匹配。



节目介绍


与ActiveX一样,任何OLE文档的实现都由以DLL或EXE形式形成的相应COM类表示。 该组件导出必要的服务接口,并且状态通过IPersist *接口保存在容器文档中。

在CFBF文档中,OLE对象数据存储在ObjectPool二级存储中。 一组线程通常类似于相应的ActiveX控件。



在Open Office XML文档中,OLE对象数据存储在embeddings子目录的CFBF存储文件中,类型为oleObject1.bin。



在RTF文档中,对象信息存储在标签\ object \ objemb \下 。 本节还包含编码为CFBF文件的十六进制表示形式的存储。

{\object\objemb\objw8307\objh553{\*\objclass WordPad.Document.1}
{\*\objdata 010500000200000013000000576f72645061642e446f63756d656e742e31000000000000000000000a0000
d0cf11e 0a1b11ae100000000


RTF格式的特征在于它支持\ objupdate标记,该标记会导致元素的自动激活,而默认情况下,OLE元素在加载时处于不活动状态。
示例:CVE-2017-11882
公式编辑器组件的漏洞CVE-2017-11882 OLE由于在单独的过程中对对象的处理而导致稳定且通用的操作成为可能。 标签\ objupdate使Word在打开文档后立即加载易受攻击的组件。
示例:带有宏病毒的Excel嵌入式元素
研究人员发现了不使用任何新漏洞的恶意rtf文档。 文档包含多个Excel文档,其中宏作为嵌入式对象。 该计算是基于以下事实:在连续打开文档几次后,用户拒绝执行宏,结果是“投降”并允许执行。 目前,该技术仍然有效。


对于嵌入式OLE元素,与ActiveX的显着区别是类标识符是通过WriteClassStg函数直接写入存储文件的。 这种技术是从很久以前继承的,当时微软热情地开发了“序列化”和以CFBF格式存储对象及其状态的概念。 容器文档还保存了已实现元素的类标识符,但是将加载存储库中指定的类的对象。 可以通过强制应用程序加载完全不用于这些目的的对象来替换此标识符。
可以编辑元素数据,这在某些情况下会导致漏洞的识别。

OLE对象也要进行大量的可下载性检查,从而很难获得潜在加载项目的完整列表。 可以作为OLE对象加载的元素集与已加载的ActiveX列表不同。 尤其是,它们在不是Office而是由Internet Explorer拥有的KillBit列表中进行检查(HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Internet Explorer \ ActiveX兼容性)。

通过链接OLE


OLE区分了两种在文档中嵌入内容的机制-直接嵌入OLE文档和在另一个文档中创建到另一个文档的链接。 在通过引用嵌入OLE对象的情况下,主文档包含对嵌入式文档文件路径的指示。 路径可以是本地或网络,也可以是Internet地址。 OLE处理程序由文件扩展名确定,相应的处理程序必须在操作系统中注册。
示例:CVE-2017-0199
CVE-2017-0199的漏洞在于可能在文档中添加“引用对象” hta格式。 后者是具有执行代码功能的html,也就是说,它实际上是一个可执行文件。 该处理程序会自动下载并执行hta,从而允许您在打开文档时执行任意代码。
在更新嵌入式对象之前,应用程序会请求用户许可。 在这种情况下,文件是预先下载的,可以用来泄露有关用户的信息。

嵌入式文件(包)


Office文档支持添加任何文件的功能(对象->从文件创建,或者只需将文件图标拖放到编辑字段中)。 从技术上讲,这是通过在文档中添加一个内置的Object Packager元素来实现的,该元素将所需的文件写入其自己的数据。 Object Packager允许您替换文件的图标和签名,以及指定要打开的命令行。 当文件不是从其自己的存储中打开时,而是沿着指定的路径( 包括网络 )打开时,它可以“通过引用”包含文件

最近,Object Packager的功能已被大幅削减,并且最初该元素可以保存任何文件,包括可执行文件,链接甚至命令行。 用户开始内容所需要做的就是双击文档文本中的图标。
示例:Outlook邮件正文中的文件
Outlook消息(也是复合文档)允许您将Object Packager元素添加到消息正文中 。 对于用户而言,该元素看起来像是攻击者任意选择的图像。 双击图像打开打包的文件。 攻击者必须从尚未受到严格安全策略限制的数据类型中选择一种数据类型。



内联元素未使用OLE实现


目前,非OLE元素最大的威胁/关注可能是通过引用添加到文档中的图像 。 当以非保护模式打开文档时,图像会自动下载,这可能导致通过匿名代理下载文档或从第三方收到机密文档的用户的位置和身份泄露。 这项技术尤其是在随美国情报一起使用的Scribbles工具中实现的。
在Windows局域网上,通过参考自动下载图像可以利用NTLMRelay漏洞 。 链接图像的机制与ActiveDirectory网络的安全要求不兼容,因为接收到此类文档的管理员本质上会以完全的管理特权执行攻击者代码。

安全方式


该怎么办? 总而言之。

防止Office文档中嵌入的对象中的漏洞最有效的方法是受保护的查看模式 。 在这种模式下,不包括从外部源加载对象和加载数据。 不幸的是,向全功能模式的过渡需要基本的用户操作,而这些操作很容易被社会工程方法引起。



可以在信任中心设置中禁用 ActiveX控件



请注意,这不适用于OLE内联元素。

Source: https://habr.com/ru/post/zh-CN423933/


All Articles