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 }"

  查看被断下来时的调用回溯,此时调用流程已经比较明显,通过此处的断点状态我们可以获取以下几个信息:

  1. IE内部通过MSHTML!CEventMgr::DispatchEvent进行事件监听并随后通过MSHTML!CEventMgr::Dispatch进行事件分发,分发给相应的事件监听器进行处理。
  2. IE内部通过jscript9!Js::JavascriptExternalFunction::ExternalFunctionThunk解析并处理HTML中的JS语句
  3. 在执行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

转载于:https://www.cnblogs.com/Danny-Wei/p/3967463.html

CVE-2014-0321漏洞成因分析相关推荐

  1. Cream Finance 重入漏洞事件分析

    前言 8 月 30 日,知道创宇区块链安全实验室 监测到以太坊上的 DeFi 协议 Cream Finance 遭遇重入漏洞袭击,损失超 1800 万美元.实验室第一时间跟踪本次事件并分析. 涉及对象 ...

  2. CVE-2013-2551漏洞成因与利用分析(ISCC2014 PWN6)

    CVE-2013-2551漏洞成因与利用分析 1. 简介 VUPEN在Pwn2Own2013上利用此漏洞攻破了Win8+IE10,5月22日VUPEN在其博客上公布了漏洞的细节.它是一个ORG数组整数 ...

  3. OpenSSL X509 Certificate反序列化漏洞(CVE-2015-3825)成因分析

    一.序 序列化 (Serialization),是将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.使用者可以通过从存储区中读取或反序列化对象的 ...

  4. CVE-2013-3897漏洞成因与利用分析

    CVE-2013-3897漏洞成因与利用分析 1. 简介 此漏洞是UAF(Use After Free)类漏洞,即引用了已经释放的内存.攻击者可以利用此类漏洞实现远程代码执行.UAF漏洞的根源源于对对 ...

  5. 绿盟科技发布OpenSSL高危漏洞技术分析与防护方案 G20成员国美国、中国、德国受影响较大...

    近日,OpenSSL官方发布了版本更新,修复了多个OpenSSL漏洞,这次更新所修复的漏洞中,有两个危害等级较高的为CVE-2016-6304和CVE-2016-6305.绿盟科技对此漏洞进行了技术分 ...

  6. 供应链安全 | 北京大学软件工程国家工程研究中心 张世琨:软件供应链安全的风险和成因分析

    ■ 北京大学软件工程国家工程研究中心 张世琨 马森 高庆 孙永杰 由于软件应用范围不断扩大,软件安全已经不限于虚拟空间,直接威胁到物理空间的安全,而且,供应链中的任何问题都会导致严重的危害.降低软件安 ...

  7. 工控系统的全球安全现状:全球漏洞实例分析

    工控系统的全球安全现状:全球漏洞实例分析 一.摘要 ​ 运营技术(OT).网络和设备,即工业环境中使用的所有组件,在设计时并未考虑到安全性.效率和易用性是最重要的设计特征,然而,由于工业的数字化,越来 ...

  8. Adobe Reader栈溢出漏洞(CVE-2010-2883)分析

    文章目录 漏洞描述 测试环境 静态分析 定位触发点 分析漏洞成因 动态调试 获取SING表的入口地址 溢出点 精心挑选的返回地址 JavaScript实现HeapSpray 利用ROP链绕过DEP保护 ...

  9. Android提权漏洞CVE-2014-7920CVE-2014-7921分析

    作者:没羽@阿里移动安全,更多技术干货,请访问阿里聚安全博客 这是Android mediaserver的提权漏洞,利用CVE-2014-7920和CVE-2014-7921实现提权,从0权限提到me ...

最新文章

  1. oracle spool用法
  2. Scala操作外部数据
  3. PAT甲级 -- 1106 Lowest Price in Supply Chain (25 分)
  4. 『中级篇』Docker Cloud自动构建 Docker image(55)
  5. magento邮件使用php,Magento订单成功无邮件发送
  6. formlayout_精简SWT FormLayout的用法
  7. html的实战性介绍
  8. python提取数组元素_python简单获取数组元素个数的方法
  9. 【PL/SQL】触发器示例:记录加薪
  10. 科研软件宝藏公众号开通
  11. oshi因系统问题报错:IllegalStateException: Unmapped relationship: 7
  12. 计算机专业的书普遍都这么贵,你们都是怎么获取资源的?---给你们推荐一些编程电子书籍下载网站
  13. numerov算法matlab,常微分方程边值问题
  14. windows 10 添加鼠标右键快捷应用
  15. 不知不觉自己的C盘越来越大了?你可能需要看一看这个
  16. 使用AHK减少鼠标和方向键的使用频率,高效编辑
  17. 超市销售管理系统---设计报告
  18. 联系人列表字母排序索引(一)
  19. wr890n虚拟服务器,TP-Link TL-WR890N无线路由器的上网设置教程
  20. Android:根据文件大小自动转化为KB, MB, GB

热门文章

  1. sql中如何添加数据
  2. 增值税发票二维码解码内容说明
  3. 我是郭敬明小说里手握信用金卡的银行客户,但并没有变成有头有脸的社会土豪
  4. Java闲杂笔记摘抄
  5. Linux开机自启的三种方式
  6. 小白入门黑客之渗透测试基本流程
  7. 【转载】8B/10B Encode/Decode详解
  8. 创新之力迸发无限想象,联想创新开放日触见未来科技
  9. 笔记本电脑C盘变红或变满,怎么处理?
  10. 微软开放跨平台联机 索尼:我们早就这么做了