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)的更多相关文章

  1. CVE: 2014-6271、CVE: 2014-7169 Bash Specially-crafted Environment Variables Code Injection Vulnerability Analysis

    目录 . 漏洞的起因 . 漏洞原理分析 . 漏洞的影响范围 . 漏洞的利用场景 . 漏洞的POC.测试方法 . 漏洞的修复Patch情况 . 如何避免此类漏洞继续出现 1. 漏洞的起因 为了理解这个漏 ...

  2. [我的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 ...

  3. SharePoint 2013中PerformancePoint仪表板设计器连接Analysis Services 2012的问题

    在SharePoint 2013的PerformancePoint仪表板设计器在创建链接到AnalysisServices 2012的数据链接的时候,数据库列表无法获取服务器上的数据库.这个问题挺让人 ...

  4. 美国政府关于Google公司2013年度的财务报表红头文件

    请管理员移至新闻版块,谢谢! 来源:http://www.sec.gov/ 财务报表下载↓ 此文仅作参考分析. 10-K 1 goog2013123110-k.htm FORM 10-K   UNIT ...

  5. 《Metasploit渗透测试魔鬼训练营》第一章读书笔记

    第1章 魔鬼训练营--初识Metasploit 20135301 1.1 什么是渗透测试 1.1.1 渗透测试的起源与定义 如果大家对军事感兴趣,会知道各国军队每年都会组织一些军事演习来锻炼军队的攻防 ...

  6. Unity 最佳实践

    转帖:http://www.glenstevens.ca/unity3d-best-practices/ 另外可以参考:http://devmag.org.za/2012/07/12/50-tips- ...

  7. grunt-connect-proxy解决开发时跨域问题

    最近的项目中前后端是完全分离开发的,前端用grunt管理项目.这样就会导致一个问题:开发时前端调用后台的接口时因为不在一个服务器,所以会出现跨域问题.但是也不能用JSONP或CROS方式实现真正的跨域 ...

  8. [Machine Learning & Algorithm] 随机森林(Random Forest)

    1 什么是随机森林? 作为新兴起的.高度灵活的一种机器学习算法,随机森林(Random Forest,简称RF)拥有广泛的应用前景,从市场营销到医疗保健保险,既可以用来做市场营销模拟的建模,统计客户来 ...

  9. 真刀真枪压测:基于TCPCopy的仿真压测方案

    郑昀 基于刘勤红和石雍志的实践报告 创建于2015/8/13 最后更新于2015/8/19 关键词:压测.TCPCopy.仿真测试.实时拷贝流量 本文档适用人员:技术人员 提纲: 为什么要做仿真测试 ...

随机推荐

  1. C# 语言规范_版本5.0 (第11章 结构)

    1. 结构 结构与类的相似之处在于,它们都表示可以包含数据成员和函数成员的数据结构.但是,与类不同,结构是一种值类型,并且不需要堆分配.结构类型的变量直接包含了该结构的数据,而类类型的变量所包含的只是 ...

  2. SAP HANA studio 创建分析视图

    [Step By Step]SAP HANA中创建分析视图(Analytic View) 1. 在Modeler视图中点击新建Analytic View 2. 设置分析视图的属性 Name: 分析视图 ...

  3. 【git】TurtoiseGit使用手册

    A,创建本地分支 操作:Create Branch ->输入本地分支名 -> OK B,创建本地分支和远程分支的映射 操作: 1,拉取远程分支:Fetch -> 选中Arbitray ...

  4. Request.UrlReferrer为空的问题

    Request.UrlReferrer为空的问题   今天在开发时遇到了一个问题,在用Request.UrlReferrer获取上一页面的地址时发现该对象为空(IE下,FF下可以得到对象),于是上网搜 ...

  5. 七天学会ASP.NET MVC(1-3)源代码下载

    原文路径: 中文: http://www.cnblogs.com/powertoolsteam/p/MVC_one.html 英文:  http://www.codeproject.com/Artic ...

  6. CSS 选择器之基本选择器 属性选择器 伪类选择器

    CSS 选择器 常见的选择器列表图 CSS选择器笔记 基本选择器 通配符选择器(*) 元素选择器(E) 类选择器(.className)    所有浏览器都支持类选择器,但多类选择器(.classNa ...

  7. cuckoo数据库变更

    1.cuckoo版本升级 cuckoo默认的数据库为sqlite,默认连接方式为sqlite:///os.path.join(REPORT_ROOT, "db", "cu ...

  8. Java多线程--让主线程等待所有子线程执行完毕

    数据量很大百万条记录,因此考虑到要用多线程并发执行,在写的过程中又遇到问题,我想统计所有子进程执行完毕总共的耗时,在第一个子进程创建前记录当前时间用System.currentTimeMillis() ...

  9. SQL优化及注意事项

    1. 把数据.日志.索引放到不同的I/O设备上,增加读取速度.数据量(尺寸)越大,提高I/O越重要. 2. 纵向.横向分割表,减少表的尺寸,如:可以把大数据量的字段拆分表. 3. 根据查询条件,建立索 ...

  10. The most orzed and orzing man

    The most orzed and orzing man 题目链接:http://acm.xidian.edu.cn/problem.php?id=1184 Sprague-Grundy定理:htt ...