安全矩阵

 找回密码
 立即注册
搜索
查看: 2159|回复: 0

Internet Explorer漏洞分析(五)——CVE-2016-0199

[复制链接]

991

主题

1063

帖子

4315

积分

论坛元老

Rank: 8Rank: 8

积分
4315
发表于 2021-4-20 21:37:30 | 显示全部楼层 |阅读模式
原文链接:Internet Explorer漏洞分析(五)——CVE-2016-0199

0x01 漏洞信息
0x01.1 漏洞简述

•编号:CVE-2016-0199
•类型:类型混淆(Type Confusion)
•漏洞影响:远程代码执行(RCE)/拒绝服务攻击 (DoS)
•CVSS 2.0:9.3
mshtml.dll组件在将CElement—>CAttributeCollection—>CAttrArray—>Attribute.nodeValue复制到CAttribute—>Variant时,并未对其进行校验,以致类型混淆,进而可造成任意代码执行。
0x01.2 漏洞影响
Microsoft Internet Explorer 9 through 11
0x01.3 修复方案
[MS16-063]https://docs.microsoft.com/en-us/security-updates/securitybulletins/2016/ms16-063
0x02 漏洞分析
0x02.1 分析环境
•OS版本:Windows 7 Service Pack 1 x86
•Internet Explorer版本:9.0.8112.16421
•mshtml.dll版本:9.0.8112.16684
•jscript9.dll版本:9.0.8112.16684

0x02.2 详细分析
分析用POC来自[exploit-db]https://www.exploit-db.com/exploits/39994:

  1. <!DOCTYPE html>
  2. <meta http-equiv="X-UA-Compatible" content="IE=7">
  3. <script>
  4.   oElement = document.createElement("IMG");
  5.   var oAttr = document.createAttribute("loop");
  6.   oAttr.nodeValue = oElement;
  7.   oElement.loop = 0x41424344; // Set original value data to 44 43 42 41
  8.   oElement.setAttributeNode(oAttr); // Replace oElement with original value data
  9.   oElement.removeAttributeNode(oAttr);
  10.   CollectGarbage(); // Use original value data as address 0x41424344 of a vftable
  11. </script>
复制代码

document.createElement("IMG");语句对应实现为mshtml!CDocument::createElement,其执行流如下:


图片1 首先分配堆块用于存储CImgElement对象:

图片2 之后由CElement::CElement完成初始化操作:

图片3 完成CImgElement对象创建:

图片4
图片5 var oAttr = document.createAttribute("loop");语句对应实现为mshtml!CDocument::createAttribute,其执行流如下:

图片6 分配堆块用于存储CAttribute对象,之后由CAttribute::CAttribute完成初始化操作:

图片7 CAttribute对象偏移0x24处存储属性名:

图片8
图片9 oAttr.nodeValue = oElement;语句对应实现为mshtml!CAttribute::put_nodeValue,其调用CAttribute:utNodeValueVariantHelper完成功能。首先是复制VARIANT类型对象(存储nodeValue值)至偏移0x28处:

图片10 之后判断该CAttribute对象是否为Tracked Object,如果不是则将其设为Root Object,并加入CRootTracker中(感兴趣的读者可自行分析CTrackerHelper::SetAsRoot及CRootTracker::AddRoot函数,此部分与GC机制有关,不在此展开):

图片11 CAttribute对象偏移0x5C处用于判断其是否为Root Object:

图片12 oElement.loop = 0x41424344;语句设定CElement对象属性,其属性使用数组存储,对应实现为CAttrArray::Set。该函数首先判断CElement对象偏移0x10处是否置值,若无则分配内存并将返回值写入该处:

图片13 于CImplAry::InsertIndirect函数中对CAttributeCollection(CElement offset 0x10)偏移0x04处值与0x00处值进行比较以检查是否需要调整Attribute Array存储空间:

图片14 由于是首次设定CElement对象属性,并未开辟Attribute Array空间,故调用HeapAlloc进行
分配,具体可分析CImplAry::EnsureSizeWorker函数,完成后内存如下:


图片15 共4个元素(0x10>>2),每个元素占用内存空间为0x10。完成属性赋值,并将Attribute Array当前元素数量加1:

图片16 CElement对象部分结构含义如下:

  1. +0x10        CAttributeCollection
  2.             +0x00    The total size of the Attribute Array<<2
  3.             +0x04    Number of Attributes
  4.             +0x08     CAttrArray
  5.             +0x0c
  6. +0x14        CTreeNode
复制代码

oElement.setAttributeNode(oAttr);语句对应实现为mshtml!CElement::setAttributeNode,其调用CElement::VersionedSetAttributeNode完成功能。首先是执行MSHTML!CAttribute:rivateQueryInterface+0x920函数,该函数会对esp+30h+var_14处内存置值,此值会决定后续执行CAttrArray::Set函数orCAttrArray::SetAt函数:


图片17 之后执行CAttribute::SetElement函数,对CAttribute对象偏移0x3c处及偏移0x08处进行置值,具体流程可自行跟进分析:

图片18
图片19 CAttrArray::Set函数执行完成:

图片20 CAttribute对象部分结构含义如下:
  1. +0x24    Attribute Name(Pointer to BSTR)、
  2. +0x28    Variant(Save the nodeValue)
  3. +0x3c    CElement
  4. +0x5C    IsRootObject
复制代码

oElement.removeAttributeNode(oAttr);语句对应实现为mshtml!CElement::VersionedRemoveAttributeNode。漏洞发生在将CElement—>CAttributeCollection—>CAttrArray—>Attribute.nodeValue复制到CAttribute—>Variant(0x28)时,并未对其进行校验,以致类型混淆。正常情形下:
  1. <!DOCTYPE html>
  2. <meta http-equiv="X-UA-Compatible" content="IE=7">
  3. <script>
  4.   oElement1 = document.createElement("IMG");
  5.   var oAttr1 = document.createAttribute("loop1");
  6.   oAttr1.nodeValue = 0x41424344;
  7.   oElement1.setAttributeNode(oAttr1);
  8.   oElement1.removeAttributeNode(oAttr1);
  9.   CollectGarbage();
  10. </script>
复制代码

其执行流如下:


图片21
图片22
图片23 而在POC情形下,其执行流:

图片24
图片25 如此一来,CAttribute::EnumerateTrackedObjects传递参数给jscript9!ScriptEngine::EnumerateTrackingClient,其在mov ecx, [eax]时便会发生访问错误:

图片26


0x03 参阅链接
•[对CVE-2016-0199的简单分析]https://bbs.pediy.com/thread-212058.htm
•[CVE-2016-0199 漏洞分析]https://www.jianshu.com/p/38001618bc2d













回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-29 02:47 , Processed in 0.013232 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表