CVE-2014-0321漏洞成因分析
1. 简介
最近在补之前落下的想学的东西,古河之前已经在微薄里面公布了此漏洞的poc及利用思路,不过在看古河的文章前我先独立分析一下其漏洞成因,记录下自己的分析流程。
2. 实验环境
操作系统:Win8.1 x86 RTM
浏览器:Internet Explorer 11 32bits (补丁打到KB2909921)
漏洞编号:CVE-2014-0321
微软补丁:MS14-012
3. 漏洞分析
3.1. 分析Crash
3.1.1. 运行poc,查看crash
直接运行poc,崩溃后查看状态

看到crash原因是test dword ptr [ecx+24h],30000h ds:0023:41414165=???????? 处引用了无效的内存空间。查看崩溃处的上下文。

在crash时的ecx来自进入函数CTreeNode::ComputeFormatsHelper时的参数1——ecx(请回顾Windows x86调用约定)。那么这个参数1到底又从哪里来呢。进一步回溯父函数:

此时的ecx已经没有发生变化,再次回溯父函数:

通过mov ecx,dword ptr [ebp+8]可以知道crash位置的ecx来自CInsertSpliceUndo::SetData的参数一[ebp+8]。且CInsertSpliceUndo::SetData调用CTreeNode::GetCharFormatHelper前还有别的函数调用,如下图所示:

3.1.2. 释放重用的对象类型
而CInsertSpliceUndo::SetData的父函数则为CSpliceTreeEngine::InsertSplice,通过IDA,发现第一个参数为struct CTreeNode *。因此,释放后被重用的即为struct CTreeNode *,如下图所示:

因此,接下来在CInsertSpliceUndo::SetData处设置断点,查看进入函数时,起参数1是否已经被释放,若没有释放,则进一步跟踪释放位置。
3.2. 跟踪调试、分析漏洞成因
3.2.1. 调试工作准备
开启gflags.exe的Page Heap功能。
3.2.2. 定位对象释放位置
设置条件断点,在进入CInsertSpliceUndo::SetData时断下函数
bu MSHTML!CInsertSpliceUndo::SetData "r $t0 = 0;.foreach (v { k }) { .if ($spat(\"v\", \"*MSHTML!CElement::replaceNode*\")) { r $t0 = 1;.break } }; .if($t0 = 0) { gc }"
第一次断下CInsertSpliceUndo::SetData时,观察参数一:

SetData第一次被断下来,此时对象还未被释放,因此对此对象的释放过程设置断点。
bu ntdll!RtlFreeHeap ".if ( poi(esp+0xc) == 06a9efa0 ){} .else{gc}"
通过跟踪,没有发现问题……发现被释放并占位的是另外一个CTreeNode对象,而且是在第二次调用SetData时,如下图所示

由于Page Heap的作用,导致对象释放后并没有占位成功,对对象进行堆回溯,查看被释放的位置。

由CFastDOM::CDocument::Trampoline_write可见JS中的document.write("");导致了对象的释放。
3.2.3. 观察函数执行流程
基于上面的分析,下次添加断点
bu MSHTML!CFastDOM::CHTMLElement::Trampoline_replaceNode
bu MSHTML!CFastDOM::CDocument::Trampoline_write
bu MSHTML!CInsertSpliceUndo::SetData "r $t0 = 0;.foreach (v { k }) { .if ($spat(\"v\", \"*MSHTML!CElement::replaceNode*\")) { r $t0 = 1;.break } }; .if($t0 = 0) { gc }"

查看被断下来时的调用回溯,此时调用流程已经比较明显,通过此处的断点状态我们可以获取以下几个信息:
- IE内部通过MSHTML!CEventMgr::DispatchEvent进行事件监听并随后通过MSHTML!CEventMgr::Dispatch进行事件分发,分发给相应的事件监听器进行处理。
- IE内部通过jscript9!Js::JavascriptExternalFunction::ExternalFunctionThunk解析并处理HTML中的JS语句
- 在执行replaceNode语句时,IE内部触发了onerror事件,并执行其回调函数,document.write("");操作将导致某个CTreeNode对象被释放
3.2.4. 验证对象释放并重用
根据以上分析,下次调试设置以下断点,验证执行流程,确定被释放的对象
bu MSHTML!CFastDOM::CHTMLElement::Trampoline_replaceNode
bu MSHTML!CFastDOM::CDocument::Trampoline_write //然后跟踪其对某个对象的释放过程
根据堆栈回溯,对MSHTML!CSpliceTreeEngine::InsertSplice+0x11fa处下断点,进一步跟踪分析重用
看看第一、二次进入SetData时的参数一(对象)的情况
具体调试过程如下:
bu MSHTML!CFastDOM::CHTMLElement::Trampoline_replaceNode
bu MSHTML!CFastDOM::CDocument::Trampoline_write //然后跟踪其对某个对象的释放过程

设置快照,方便后边回溯观察对象的释放。下面根据前面Page Heap的对象释放记录,跟踪对象的释放过程

条件断点:
bu ntdll!RtlFreeHeap "r $t0 = 0;.foreach (v { k }) { .if ($spat(\"v\", \"*MSHTML!CMarkup::DestroySplayTree*\")) { r $t0 = 1;.break } }; .if($t0 = 0) { gc }"
上面这个断点设置不太好,需要消耗大量时间,还不如一步步跟踪至
bu MSHTML!CMarkup::DestroySplayTree+0x811
通过跟踪及快照恢复功能发现DestroySplayTree被断下来4次,其中第3次则为后边被释放重用的对象。
对象被释放前的状态:


可见CTreeNode节点对象的创建过程及其大小(0x60)
对象被释放后的状态:

设置如下断点,对onerror回调函数执行完毕后的情况进行跟踪
bu MSHTML!CSpliceTreeEngine::InsertSplice+0x11fa
跟踪至如下位置,即可发现被重用对象作为参数传递进了CInsertSpliceUndo::SetData

3.2.5. 内存占位
CTreeNode对象被document.write("");释放后,立即进行内存占位,

实际大小为0x60,由于不能通过Create user mode stack trace database功能进行堆回溯,因此在Page Heap开启下无法追踪占位过程。但是通过poc,可以观察到对象已经被稳定占位。
3.2.6. 小结
此漏洞的效果总结来说就是对释放后重用的CTreeNode节点对象进行了稳定占位。但由于这个被释放掉的对象的可控性太低,很难在JS里面方便访问,因此利用起来有相当大的难度。
4. 漏洞利用
此漏洞的利用难度相当大,最近准备抽时间按照古河提供的思路尝试写EXP进行学习。请先参考资料的链接,了解此漏洞的利用方法。
5. 参考资料
[1] CVE-2014-0321 - Exploiting IE11 on windows 8.1 32bits:
http://weibo.com/p/1001603732980651659108
CVE-2014-0321漏洞成因分析的更多相关文章
- CVE-2013-2551漏洞成因与利用分析(ISCC2014 PWN6)
CVE-2013-2551漏洞成因与利用分析 1. 简介 VUPEN在Pwn2Own2013上利用此漏洞攻破了Win8+IE10,5月22日VUPEN在其博客上公布了漏洞的细节.它是一个ORG数组整数 ...
- CVE-2014-0322漏洞成因与利用分析
CVE-2014-0322漏洞成因与利用分析 1. 简介 此漏洞是UAF(Use After Free)类漏洞,即引用了已经释放的内存,对指定内存处的值进行了加1.其特点在于攻击者结合flash实现了 ...
- CVE-2013-3897漏洞成因与利用分析
CVE-2013-3897漏洞成因与利用分析 1. 简介 此漏洞是UAF(Use After Free)类漏洞,即引用了已经释放的内存.攻击者可以利用此类漏洞实现远程代码执行.UAF漏洞的根源源于对对 ...
- Google发布SSLv3漏洞简要分析报告
今天上午,Google发布了一份关于SSLv3漏洞的简要分析报告.根据Google的说法,该漏洞贯穿于所有的SSLv3版本中,利用该漏洞,黑客可以通过中间人攻击等类似的方式(只要劫持到的数据加密两端均 ...
- 蓝牙App漏洞系列分析之一CVE-2017-0601
蓝牙App漏洞系列分析之一CVE-2017-0601 0x01 概要 2017年5月的 Android 安全公告修复了我们提交的一个蓝牙提权中危漏洞,这个漏洞尽管简单,但比较有意思,能够使本地恶意 A ...
- 蓝牙App漏洞系列分析之二CVE-2017-0639
蓝牙App漏洞系列分析之二CVE-2017-0639 0x01 漏洞简介 Android本月的安全公告,修复了我们发现的另一个蓝牙App信息泄露漏洞,该漏洞允许攻击者获取 bluetooth用户所拥有 ...
- 蓝牙App漏洞系列分析之三CVE-2017-0645
蓝牙App漏洞系列分析之三CVE-2017-0645 0x01 漏洞简介 Android 6月的安全公告,同时还修复了我们发现的一个蓝牙 App 提权中危漏洞,该漏洞允许手机本地无权限的恶意程序构造一 ...
- CVE-2010-3333:Microsoft RTF 栈溢出漏洞调试分析
0x01 前言 CVE-2010-3333 漏洞是一个栈溢出漏洞,该漏洞是由于 Microsoft文档在处理 RTF 数据的对数据解析处理错误,在进行内存操作时没有对操作的数据进行长度限制,导致存在内 ...
- CVE-2012-0774:Adobe Reader TrueType 字体整数溢出漏洞调试分析
0x01 TrueType 字体 TTF 字体是 Apple 和 Microsoft 两家公司共同推出的字体格式,现在已经广泛的运用于 Windows 操作系统,其中 PDF 文档也可以嵌入 TTF ...
随机推荐
- n皇后问题(分析)
这道题需要用到回溯算法,现在在这里先简单的介绍一下这个算法: 回溯算法也叫试探法,它是一种系统地搜索问题的解的方法.回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试.用回溯 ...
- volatile与synchronized实现原理
参考文章:https://www.cnblogs.com/charlesblc/p/5994162.html --------------------------------------------- ...
- 【随笔】设置title标题图标为自定义图片
第一步: 利用图标工具(有很多)制作图标文件(favicon.ico)上传到网站所在的服务器的根目录下,这个文件必须是16*16大小的图标文件. 第二步: 在<head></head ...
- php 内存共享shmop源码阅读
多进程通信的时候,会涉及到共享内存.shmop_open()创建或打开一个内存块 PHP_FUNCTION(shmop_open) { long key, mode, size; struct php ...
- 网络安装Ubuntu16.04
网络安装Ubuntu16.04 搭建PXE服务器 PXE是Pre-boot Execution Environment,预启动执行环境.是通过网络安装任何linux系统最重要的步骤. 首选搭建PXE服 ...
- ubuntu 修改 ls 下的目录颜色
ubuntu 下, ls 显示的目录的颜色,怎么说呢,看起来太费劲了. 于是想着修改成容易识别的颜色. 于是搜索了一下. 这里列举三个搜到的教程吧. 简单说我按这上面的方法做了,然后都失败了. 1. ...
- 九度oj 1001 A+B for Matrices 2011年浙江大学计算机及软件工程研究生机试真题
题目1001:A+B for Matrices 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:15235 解决:6172 题目描述: This time, you are supposed ...
- 日调度万亿次,微服务框架TSF大规模应用——云+未来峰会开发者专场回顾
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 演讲者:张浩 腾讯云中间件产品负责人 背景:众多开发者中,一定经历类似的甜蜜烦恼,就是当线上业务规模越来越大,系统分支发展越来越多的时候,初 ...
- log4j DailyRollingFileAppender, DatePattern 配置
在DailyRollingFileAppender中可以指定monthly(每月). weekly(每周).daily(每天).half-daily(每半天).hourly(每小时)和minutely ...
- fetch将替代ajax?
原谅我做一次标题党,Ajax 不会死,传统 Ajax 指的是 XMLHttpRequest(XHR),未来现在已被 Fetch 替代. 最近把阿里一个千万级 PV 的数据产品全部由 jQuery 的 ...