首页
社区
课程
招聘
[原创]Internet Explorer漏洞分析(五)——CVE-2016-0199
发表于: 2021-4-21 21:47 1116

[原创]Internet Explorer漏洞分析(五)——CVE-2016-0199

2021-4-21 21:47
1116

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

1
2
3
4
5
1.本文一共1233个字 26张图 预计阅读时间13分钟
2.本文作者erfze 属于Gcow安全团队复眼小组 未经过许可禁止转载
3.本篇文章是CVE-2016-0199漏洞的分析入手 详细的阐述漏洞的成因
4.本篇文章十分适合漏洞安全研究人员进行交流学习
5.若文章中存在说得不清楚或者错误的地方 欢迎师傅到公众号后台留言中指出 感激不尽

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]cd8K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1L8$3y4K6i4K6u0W2L8h3W2U0M7X3!0K6L8$3k6@1i4K6u0W2j5$3!0E0i4K6u0r3k6h3&6Q4x3X3c8#2M7#2)9J5c8Y4y4W2j5%4g2J5K9i4c8&6i4K6u0V1N6i4m8V1j5i4c8W2M7#2)9J5c8Y4y4W2j5%4g2J5K9i4c8&6j5Y4g2D9L8r3g2@1K9h3&6K6i4K6u0r3x3U0l9I4y4W2)9J5c8X3#2K6x3e0k6Q4x3X3b7H3y4U0x3`.

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]16eK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2W2P5s2m8D9L8$3W2@1i4K6u0V1k6r3u0Q4x3X3g2U0L8$3#2Q4x3V1k6W2P5s2m8D9L8$3W2@1M7#2)9J5c8U0x3&6z5e0V1@1i4@1g2r3i4@1u0o6i4K6W2m8

1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE html>
<meta http-equiv="X-UA-Compatible" content="IE=7">
<script>
  oElement = document.createElement("IMG");
  var oAttr = document.createAttribute("loop");
  oAttr.nodeValue = oElement;
  oElement.loop = 0x41424344; // Set original value data to 44 43 42 41
  oElement.setAttributeNode(oAttr); // Replace oElement with original value data
  oElement.removeAttributeNode(oAttr);
  CollectGarbage(); // Use original value data as address 0x41424344 of a vftable
</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::PutNodeValueVariantHelper完成功能。首先是复制VARIANT类型对象(存储nodeValue值)至偏移0x28处:

 

图片10

 

之后判断该CAttribute对象是否为Tracked Object,如果不是则将其设为Root Object,并加入CRootTracker中(感兴趣的读者可自行分析CTrackerHelper::SetAsRootCRootTracker::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
2
3
4
5
6
+0x10        CAttributeCollection
            +0x00    The total size of the Attribute Array<<2
            +0x04    Number of Attributes
            +0x08     CAttrArray
            +0x0c
+0x14        CTreeNode

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

 

图片17

 

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

 

图片18

 

图片19

 

CAttrArray::Set函数执行完成:

 

图片20

 

CAttribute对象部分结构含义如下:

1
2
3
4
+0x24    Attribute Name(Pointer to BSTR)、
+0x28    Variant(Save the nodeValue)
+0x3c    CElement
+0x5C    IsRootObject

oElement.removeAttributeNode(oAttr);语句对应实现为mshtml!CElement::VersionedRemoveAttributeNode。漏洞发生在将CElement—>CAttributeCollection—>CAttrArray—>Attribute.nodeValue复制到CAttribute—>Variant(0x28)时,并未对其进行校验,以致类型混淆。正常情形下:

1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<meta http-equiv="X-UA-Compatible" content="IE=7">
<script>
  oElement1 = document.createElement("IMG");
  var oAttr1 = document.createAttribute("loop1");
  oAttr1.nodeValue = 0x41424344;
  oElement1.setAttributeNode(oAttr1);
  oElement1.removeAttributeNode(oAttr1);
  CollectGarbage();
</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 漏洞分析]d59K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2B7K9h3q4F1M7$3S2#2i4K6u0W2j5$3!0E0i4K6u0r3M7q4)9J5c8U0x3^5x3o6l9I4y4U0p5^5j5X3x3J5k6l9`.`.

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回