MS13-069(CVE-2013-3205) CCaret use-after-free Vulnerability Analysis (2014.9)
MS13-069(CVE-2013-3205) CCaret use-after-free Vulnerability Analysis
1. Introduction
In IE's standards mode, the caret handling's vulnerable state can be triggered by first setting up an editable page with an input field, and then we can force the caret to update in an onbeforeeditfocus event by setting the body's innerHTML property. In this event handler, mshtml!CCaret::`vftable' can be freed using a document.write() function, however, mshtml!CCaret::UpdateScreenCaret remains unaware of this change, and still uses the same reference to the CCaret object. When the function tries to use this invalid reference to call a virtual function at offset 0x2c, it finally results a crash.
2. POC
根据exploit-db给出的利用代码精简后的POC:

POC代码大概的执行流程为:先设置一块可写的区域,然后通过设置这块区域的innerHTML属性来触发onbeforeeditfocus事件,最后执行trigger函数里面的代码。
3. Analysis
调试环境Windows7,IE8(mshtml.dll版本8.00.7601.17514)
3.1 First crash
对IE进程开启DPH和user stack trace后,用windbg附加IE进程后,运行POC后,发生crash:

从CSelectionManager::`vector deleting destructor可以看出被释放的对象是CSelectionManager,重用该对象是在mshtml!CSelectionManager::EnsureEditContext+0x30。
崩溃地址的上下文:

3.2 Trace to the root cause object
依据崩溃时的调用栈回溯查找此时edi的起源,从哪一个对象引用而来:

CSelectionManager::EnsureEditContext #edi# -->#eax#
CSelectionManager::Notify #eax# -->#esi#-->#ecx#
CHTMLEditor::Notify #ecx#-->#[esi+48]#-->#esi(ATL::CComObject<CHTMLEditorProxy>)#-->arg0
CHTMLEditorProxy::Notify #arg0#-->#esi#-->#arg0#
CDoc::NotifySelection #arg0#-->#eax(HTMLEditorProxy)#CDoc::GetHTMLEditor
CDoc::NotifySelection部分的IDA截图如下:

可以得到崩溃对象CSelectionManager是从对象ATL::CComObject<CHTMLEditorProxy>引用而来的。ATL::CComObject<CHTMLEditorProxy>对象是通过调用CDoc::GetHTMLEditor来获得,在CHTMLEditor::Notify函数内CSelectionManager对象从ATL::CComObject<CHTMLEditorProxy>对象偏移0x48h的位置获得地址。
3.3 Trace object`s create and release
对ATL::CComObject<CHTMLEditorProxy>和CSelectionManager对象的创建和销毁进行跟踪。对两个对象的析构函数和构造函数下断点以及POC中的javascript代码进行单步跟踪,windbg输出如下:


第一次对两个对象的析构可以无视,因为在执行POC的javascript代码之前。
第二次对ATL::CComObject<CHTMLEditorProxy>销毁时,查看此时的函数调用堆栈:
POC中的document.write函数最后会调用mshtml.dll中的CDocument::write函数,结合此时的函数调用堆栈和windbg输出的信息可以确定是由于document.write这一句javascript代码造成ATL::CComObject<CHTMLEditorProxy>的释放。而此时并没有释放掉CSelectionManager对象,因为此时其引用计数为2。
第二次对CSelectionManager的析构,查看此时的函数调用堆栈:

结合崩溃点可知:

对第二个的CSelectionManager对象的引用计数下写断点,记录从CSelectionManager对象的创建到销毁。结果显示其引用计数被操作了30次。增加和减少的操作各15次,最后为0。
对ATL::CComObject<CHTMLEditorProxy>的48h位下写断点,判断是哪一个函数将CSelectionManager的地址写入到ATL::CComObject<CHTMLEditorProxy>中的,得到windbg如下输出:

可见是CHTMLEditor::Initialize函数调用了CSelectionManager的构造函数,并将CSelectionManager对象地址存储到ATL::CComObject<CHTMLEditorProxy>对象中。
3.4 Preliminary analysis on vulnerability cause
上面可以得到因为CSelectionManager对象过早的释放,而随后又对该地址寻址造成的崩溃。所以尝试改变CSelectionManager的引用计数,使其不释放,看程序是否崩溃。
在CDocument::write处下断点,将CSelectionManager对象的引用计数加1之后,进程依然崩溃,但是崩溃的位置有所变化,此时崩溃的函数调用堆栈:
崩溃位置上下文:

和之前崩溃的原因一样,都是由于对已经释放了的对象进行寻址。通过相同的方法,得知此时ebx是CCaret对象。
对CCaret的析构函数下断点,CCaret对象释放时的函数调用堆如下:

在CDocument::write处下断点,将CCaret和CSelectionManager对象的引用计数都增加1后,程序不崩溃。
所以可以初步判断漏洞的成因是由于对CCaret和CSelectionManager对象的处理不当,造成两个对象的引用计数少加了1或者多减了1。
3.5 Patch comparison
从上面的步骤可以得到我们需要关注的对象有:CCaret、CSelectionManager和ATL::CComObject<CHTMLEditorProxy>。
补丁后,对这三个对象的析构函数下断点:
CSelectionManager和ATL::CComObject<CHTMLEditorProxy>对象销毁时的函数调用堆:
CCaret对象销毁时的函数调用堆:

因为这三个对象的从创建到销毁的过程引用计数改变的次数较多,不适合全部记录下来和补丁做对比。所以以CDocument::write为分界点,记录下补丁前后引用计数的变化。首先确定补丁后CDocument::write刚调用的时候,三个对象引用计数的差异,得到的结果是:CCaret和ATL::CComObject<CHTMLEditorProxy>对象的引用计数多了1,而CSelectionManager的引用计数没有变化。所以现在只需要关注CCaret和ATL::CComObject<CHTMLEditorProxy>对象的引用计数就可以了。
通过对CCaret对象的引用计数的对比可以得到补丁对CCaret引用计数操作不同的位置:

可见补丁在CCaret::DeferredUpdateCaret中增加了AddRef(CCaret)的操作,查看该处的上下文,很容易得可以找到相应Release(CCaret)的操作,也这是补丁的操作。
利用同样的方法可以得到补丁对于ATL::CComObject<CHTMLEditorProxy>对象的操作:

可见补丁后,CHTMLEditor::Notify函数在调用CSelectionManager::Notify操作前后增加了AddRef(CHTMLEditorProxy)和Release(CHTMLEditorProxy)。
根据上面的分析,再结合函数调用堆的信息,可得到补丁的操作在流程中的位置更改如下:
补丁前:

补丁后:

MS13-069(CVE-2013-3205) CCaret use-after-free Vulnerability Analysis (2014.9)的更多相关文章
- CVE: 2014-6271、CVE: 2014-7169 Bash Specially-crafted Environment Variables Code Injection Vulnerability Analysis
目录 . 漏洞的起因 . 漏洞原理分析 . 漏洞的影响范围 . 漏洞的利用场景 . 漏洞的POC.测试方法 . 漏洞的修复Patch情况 . 如何避免此类漏洞继续出现 1. 漏洞的起因 为了理解这个漏 ...
- [我的CVE][CVE-2017-15708]Apache Synapse Remote Code Execution Vulnerability
漏洞编号:CNVD-2017-36700 漏洞编号:CVE-2017-15708 漏洞分析:https://www.javasec.cn/index.php/archives/117/ [Apache ...
- SharePoint 2013中PerformancePoint仪表板设计器连接Analysis Services 2012的问题
在SharePoint 2013的PerformancePoint仪表板设计器在创建链接到AnalysisServices 2012的数据链接的时候,数据库列表无法获取服务器上的数据库.这个问题挺让人 ...
- 美国政府关于Google公司2013年度的财务报表红头文件
请管理员移至新闻版块,谢谢! 来源:http://www.sec.gov/ 财务报表下载↓ 此文仅作参考分析. 10-K 1 goog2013123110-k.htm FORM 10-K UNIT ...
- 《Metasploit渗透测试魔鬼训练营》第一章读书笔记
第1章 魔鬼训练营--初识Metasploit 20135301 1.1 什么是渗透测试 1.1.1 渗透测试的起源与定义 如果大家对军事感兴趣,会知道各国军队每年都会组织一些军事演习来锻炼军队的攻防 ...
- Unity 最佳实践
转帖:http://www.glenstevens.ca/unity3d-best-practices/ 另外可以参考:http://devmag.org.za/2012/07/12/50-tips- ...
- grunt-connect-proxy解决开发时跨域问题
最近的项目中前后端是完全分离开发的,前端用grunt管理项目.这样就会导致一个问题:开发时前端调用后台的接口时因为不在一个服务器,所以会出现跨域问题.但是也不能用JSONP或CROS方式实现真正的跨域 ...
- [Machine Learning & Algorithm] 随机森林(Random Forest)
1 什么是随机森林? 作为新兴起的.高度灵活的一种机器学习算法,随机森林(Random Forest,简称RF)拥有广泛的应用前景,从市场营销到医疗保健保险,既可以用来做市场营销模拟的建模,统计客户来 ...
- 真刀真枪压测:基于TCPCopy的仿真压测方案
郑昀 基于刘勤红和石雍志的实践报告 创建于2015/8/13 最后更新于2015/8/19 关键词:压测.TCPCopy.仿真测试.实时拷贝流量 本文档适用人员:技术人员 提纲: 为什么要做仿真测试 ...
随机推荐
- Proteus中MATRIX-8X8 LED灯的连接
上面8个引脚用于选择行,低电平有效.下面8个引脚用于选择列,高电平有效. 经测试,红色点阵LED与之相反,是上面的引脚用于选择列,且高电平有效:下面的引脚用于选择行,低电平有效. 在AT89C51单片 ...
- 查找页面中最大的z-index 的值
var divs = document.getElementsByTagName("div");for(var i=0, max=0; i<divs.length; i++) ...
- WIN7x64+VS2010+OpenCV2.4.10+cmake3.5.0重新编译OpenCV
1,参考博文 Win7x64+VS2012+OpenCV2.4.3+CMake2.8.10+TBB41重编译OpenCV [OpenCV入门教程之七] 玩转OpenCV源代码:生成OpenCV工程解决 ...
- Regmon7.04绿色版(注册表变动实时监视工具)
Regmon V7.04 简繁中文绿色版 软件大小: 155KB软件语言: 简体中文运行环境:Win9x/NT/2000/XP/2003/软件类别:国外软件 / 免费版 / 系统其它Regmon Re ...
- python的web开发环境Django配置
我的系统的windows10: 第一步,安装python3.5 第二步,配置django,如图所示,在python的安装目录下的Scripts里面执行:pip install Django,我这儿提示 ...
- 用sql实现汉字转拼音
有时我们会需要将汉字转为拼音,例如需要将省市转为拼音后当做编码存储(尽管国家有统一的标识码,但有时候我们还是会用到),网络上也有工具提供汉字转拼音的功能,但各有优劣,一般转拼音后还会存在带声调的字母, ...
- 解决asp.net中“从客户端中检测到有潜在危险的Request.Form值”的错误
修改Web.config,增加requestValidationMode="2.0"属性值 <system.web> <httpRuntime requestVa ...
- ios 点击放大图片,保存至手机相册
直接贴.m文件代码 #import "UIImageView+Scale.h" static CGRect oldframe; @implementation UIImageVie ...
- python文件操作_对文件进行复制拷贝_代码实现
要求: 1,对已经存在的文件进行复制操作 2,复制后的文件在文件名后面加上[复件] 3,文件比较大如何优化处理 #-*- coding: UTF-8 -*- #这是python 2 下面写的,用的ra ...
- 为Textview里面的ImageSpan添加点击响应事件
对于图文混排的TextView,用户在浏览到里面的图片的时候,往往有点击图片preview大图或者preview之后保存图片的需求,这就需要为Textview里面的ImageSpan设置点击响应事件. ...