Internet Explorer(五)——CVE-2016-0199

简介: •编号:CVE-2016-0199•类型:类型混淆(Type Confusion)

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 x86Internet Explorer版本:9.0.8112.16421mshtml.dll版本:9.0.8112.16684jscript9.dll版本:9.0.8112.16684

0x02.2 详细分析

分析用POC来自[exploit-db]https://www.exploit-db.com/exploits/39994:

<!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

image.png

图片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对象部分结构含义如下:

+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对象部分结构含义如下:

+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)时,并未对其进行校验,以致类型混淆。正常情形下:

<!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


相关文章
|
前端开发 JavaScript 安全
开源一款剪贴板跨设备共享工具
`shigen`,编程博主,擅长多种语言,近期自制了一个名为`copyhub`的工具,用于局域网内跨设备同步剪贴板。设计灵感源于对现有共享工具的安全顾虑,采用`Flask`和`Redis`实现,前端直接HTML+JS,简化架构。用户通过取件码交换内容,不涉及复杂功能。代码已开源并在个人腾讯云服务器上部署。更多详情见shigen的GitHub和哔哩哔哩频道。一起探索,每天进步!
416 1
开源一款剪贴板跨设备共享工具
|
负载均衡 算法 关系型数据库
令人惊叹的 PostgreSQL 可伸缩性
这是一篇系统设计经验分享,主要介绍了如何使用 PgBouncer 以解决 PostgreSQL 的可伸缩性(Scalability)问题。55M QPS + 20% 的互联网流量听上去并不小,但从 PostgreSQL 专家的角度看,这里的实践确实还是有些朴素简陋 —— 甚至可以说大惊小怪。不过,是这篇文章确实抛出来了一个有意义的问题 —— 即 PostgreSQL的 可伸缩性 到底怎么样?
473 3
|
Apache 数据安全/隐私保护 安全
|
8月前
|
存储 弹性计算 缓存
【阿里云】操作系统控制台深度体验与性能测评
本文介绍了如何通过阿里云控制台高效管理云资源,包括创建云服务器ECS、RAM授权、组件安装、系统诊断和监控等操作。阿里云控制台提供了便捷的操作界面、实时监控功能、高效的管理和安全预警,帮助用户优化云环境性能并确保业务高效运行。通过具体实例,展示了从创建ECS实例到进行系统诊断和观测的全流程,并提供了针对常见性能瓶颈的优化建议。此外,还提出了改进建议,如增加应用示例和报告存储功能,以提升用户体验。
317 21
|
机器学习/深度学习 监控 安全
量化合约对冲策略交易app系统开发技术规则
量化合约对冲策略交易APP系统开发技术规则涵盖系统架构设计、量化策略实现、交易管理、风险管理、用户界面设计及性能优化等方面。通过模块化设计、分布式架构、数据持久化、策略开发、算法交易、回测优化、订单管理、持仓监控、资金安全、风险控制、实时监控、安全审计、界面设计、反馈机制、多语言支持、响应速度、资源优化和兼容性等措施,确保系统的稳定、安全、高效和易用。
|
Linux 网络安全
FTP被动模式配置
FTP被动模式配置
760 1
|
8月前
|
数据采集 Java 开发者
Ruby爬虫如何控制并发数量:爬取京东电子产品
Ruby爬虫如何控制并发数量:爬取京东电子产品
|
存储 数据挖掘 数据库
InfluxDB的连续查询与数据聚合技术详解
【4月更文挑战第30天】InfluxDB的连续查询(CQ)功能用于自动定时聚合时间序列数据,适用于数据降采样、实时分析和告警通知等场景。CQ使用InfluxQL编写,例如,每1小时对`cpu_usage`测量值计算主机的平均CPU使用率并存入`cpu_usage_hourly`。InfluxDB提供多种聚合函数如`MEAN()`, `MAX()`, 支持滑动窗口聚合等复杂操作,助力时间序列数据分析和趋势预测。通过CQ,用户能高效管理和利用时间序列数据信息。
1391 0
|
负载均衡 Java 网络架构
十六.SpringCloud源码剖析-Feign源码分析
Spring Cloud OpenFeign 对 Netflix Feign 进行了封装,我们通常都使用Spring Cloud OpenFeign作为服务的负载均衡,本文章主要是探讨一下OpenFeign的初始化流程,以及生成代理类注入到Spring的过程
|
人工智能 数据挖掘 Python
《三国演义》人物数据分析
由于要分析120回中主要人物的出场次数,爬取《三国演义》120回,每回放在一个段落里;len(f.readlines()) = 120.