首页
论坛
专栏
课程

[原创]CVE-2010-3962漏洞分析

2010-11-19 18:26 15226

[原创]CVE-2010-3962漏洞分析

2010-11-19 18:26
15226
            CVE-2010-3962分析

相关代码参考win2k:win2k\private\inet\mshtml\src\site\download\

问题代码为:
<table style=position:absolute;clip:rect(0)>


分析步骤:


1. html解析器(CHtmParse::ParseEof)在解析到html尾部(最后一个括号)时发现当前结点(table结点)还需要一个隐式的_etagTextSubcontainer对象,这里由TableHtmParseClass决定_etagTextSubcontainer到底是什么,具体见下。


// TABLE

static CHtmlParseClass s_hpcTable =
{
    SCOPE_NESTED,                   // _scope
    TEXTTYPE_ALWAYS,                // _texttype                    ; textlike; force BODY etc
    s_atagTable,                    // _atagEndContainers
    s_atagTableCellCaption,         // _atagBeginContainers         ; allow nesting inside TD, CAPTION, TABLE
    NULL,                           // _atagMaskingContainers
    s_atagTableCloses,              // _atagProhibitedContainers    ; close prevous TABLE, TC, SELECT, OPTION
    NULL,                           // _atagRequiredContainers
    ETAG_NULL,                      // _etagDefaultContainer
    FALSE,                          // _fQueueForRequired
    TEXTSCOPE_EXCLUDE,              // _textscope                   ; exclude text
    ETAG_TC,                        // _etagTextSubcontainer        ; wrap contained text in a TC
    NULL,                           // _atagMatch
    ETAG_NULL,                      // _etagUnmatchedSubstitute
    NULL,                           // _pfnHpxCreator
    FALSE,                          // _fMerge
    ETAG_NULL,                      // _etagImplicitChild
    FALSE,                          // _fCloseImplicitChild
};


2. 所需etagTextSubcontainer对象名为CTableCaption、类型为ETAG_TC(标题类型)、值为0x62,随后CTableCaption对象被创建之.


3. CTableLayout管理器会负责管理要显示的table,并把上面创建的CTableCaption对象加到标题数组中去。


4. html解析器随后会通知各HTML元素刷新,table标签中的CTableCaption对象也会刷新显示。


5. CTableLayout检查到要显示的结点中含有标题对象时,会检查该标题对象是否有显示结点容器CDispContainer,当不存在时需为该标题对象创建CDispContainer类型的显示容器对象,同时由于table标签具有style=position:absolute;clip:rect(0)因而需要对显示的结点进行裁剪,这些信息也会保存到CDispContainer对象中,以供显示之用,不巧的是CDispContainer是一个变体大小的对象,最小有0x48字节,附加大小是由一张静态表控制:Sizeof(CDispContainer) = _extraSizeTable[index]*4+0x48_extraSizeTable[index]*4大小的数据用来存放裁剪信息CDispContainer的基本结构为
---------------------------------------------------
CliprectInfo|VT|CliprectInfo_size|................
---------------------------------------------------


6. 带标题属性而没有CDispContainer结点的结果导致动态生成index的值为0,这样新生成的对象会只有0x48大小而CliprectInfo为空,那么在设置CliprectInfo时导致VT表直接被修改.



[FONT=Times New Roman][FONT=Times New Roman].text:7E2C5D9D                                         ; [/FONT]
[FONT=Times New Roman].text:7E2C5D9D                 push    eax[/FONT]
[FONT=Times New Roman].text:7E2C5D9E                 lea     eax, [ebx+0Ch][/FONT]
[FONT=Times New Roman].text:7E2C5DA1                 push    eax[/FONT]
[FONT=Times New Roman].text:7E2C5DA2                 call    CDispContainer::New(CDispClient *,ulong)[/FONT]
[/FONT]

*******************************************************
[FONT=Times New Roman][FONT=Times New Roman].text:7E2B5D2A[/FONT][FONT=宋体] [/FONT][FONT=Times New Roman]CDispContainer::New[/FONT]
[FONT=宋体]..........................................................[/FONT]
[FONT=宋体].text:7E291CF0    movzx   esi, ds:uchar const * const CDispNode::_extraSizeTable[ebx][/FONT]
[FONT=宋体].text:7E291CF7                 shl     esi, 2[/FONT]
[FONT=宋体].text:7E291CFA                 push    edi[/FONT]
[FONT=宋体].text:7E291CFB                 add     eax, esi[/FONT]
[FONT=宋体].text:7E291CFD                 push    eax             ; dwBytes[/FONT]
[FONT=宋体].text:7E291CFE                 call    _MemAllocClear(x)[/FONT]
[FONT=宋体].text:7E291D03                 mov     edi, eax[/FONT]
[FONT=宋体].text:7E291D05                 test    edi, edi[/FONT]
[FONT=宋体].text:7E291D07                 jz      short loc_7E291D17[/FONT]
[FONT=宋体].text:7E291D09                 add     edi, esi[/FONT]
[FONT=宋体].text:7E291D0B                 test    bl, 40h[/FONT]
[FONT=宋体].text:7E291D0E            mov     [edi+4], ebx <-------这里保存[/FONT][FONT=Times New Roman]CliprectInfo_size[/FONT][FONT=宋体]的大小[/FONT]
[/FONT]

*******************************************************
[FONT=宋体][FONT=宋体].text:7E36B4C4 CDispNode::SetUserClip[/FONT]
[FONT=宋体]...............................[/FONT]
[FONT=宋体].text:7E36B54D                 mov     eax, [edi+4] [/FONT][FONT=宋体]<-------当这里为0时,虚函数表就被悲剧了.[/FONT]
[FONT=宋体].text:7E36B550                 and     eax, esi[/FONT]
[FONT=宋体].text:7E36B552       movzx   ecx, ds:uchar const * const CDispNode::_extraSizeTable[eax][/FONT]
[FONT=宋体].text:7E36B559                 mov     eax, edi[/FONT]
[FONT=宋体].text:7E36B55B                 shl     ecx, 2[/FONT]
[FONT=宋体].text:7E36B55E                 sub     eax, ecx[/FONT]
[FONT=宋体].text:7E36B560                 or      dword ptr [eax], 1[/FONT][FONT=宋体]   <-----------------------虚函数表被改了[/FONT]
[/FONT]

<table style=position:absolute;clip:rect(0)>改为
<table style=position:absolute;clip:rect(0)><td>后将导致CTableCaption对象不会生成,因为tdCHtmlParseClass 根本没有_etagTextSubcontainer,这样不会导致代码出问题,到底是s_hpcTable出了问题还是SetUserClip检查不严格?还是两者都有问题?

函数调用序列:
 
CHtmParse::ParseEof


[FONT=Times New Roman][FONT=Times New Roman]CHtmParse::ParseText[/FONT]
[FONT=Times New Roman]|[/FONT]
[FONT=Times New Roman]       CHtmlParseClass *phpc;[/FONT]
 
[FONT=Times New Roman]       phpc = HpcFromEtag(etag);[/FONT]
[FONT=Times New Roman]       if (phpc->_atagProhibitedContainers)[/FONT]
[FONT=Times New Roman]       {[/FONT]
[FONT=Times New Roman]           hr=THR(CloseAllContainers(phpc->_atagProhibitedContainers, [/FONT][FONT=Times New Roman]phpc->_atagBeginContainers));[/FONT]
[FONT=Times New Roman]           if (hr)[/FONT]
[FONT=Times New Roman]               goto Cleanup;[/FONT]
[FONT=Times New Roman]       }[/FONT]
 
[FONT=Times New Roman]       hr = THR(OpenContainer(etag));[/FONT]
[/FONT]


[FONT=Times New Roman][FONT=Times New Roman]CHtmParse::OpenContainer[/FONT]
[FONT=Times New Roman]|[/FONT]
 
[FONT=Times New Roman]此时etagItem=0x62表示ETAG_TC,这时将创建一个CTableCaption对象[/FONT]
[FONT=Times New Roman]hr = THR(CreateElement(etagItem, &pel, _pDoc, _pMarkup, TRUE, &_fDie));[/FONT]
[FONT=Times New Roman]CreateElement函数根据etagItem=0x62去索引hash表g_atagdesc,查表[/FONT][FONT=宋体]得[/FONT][FONT=Times New Roman]具体的对象的[/FONT][FONT=Times New Roman]CreateElement函数接着CTableCaption::CreateElement函数将被调用[/FONT]
 
[/FONT]


 
CHtmPos::Exec
CHtmPos::Notify
CTableCell:Notify(CTableCaption继承该类)


[FONT=Times New Roman][FONT=Times New Roman]CTableCell::EnterTree[/FONT]
[FONT=Times New Roman]|[/FONT]
 
[FONT=Times New Roman]hr = pTableLayout->AddCaption(pCaption);导致 pTableLayout对象中存在标题[/FONT]
 
 
[/FONT]


 
CTableLayoutBlock::EnsureTableDispNode(CTableLayoutBlock即上面的pTableLayout)


[FONT=Times New Roman][FONT=Times New Roman]CDispNode::SetUserClip[/FONT]
[FONT=宋体]|[/FONT]
[FONT=Times New Roman]movzx   ecx, ds:uchar const * const CDispNode::_extraSizeTable[eax][/FONT]
[FONT=Times New Roman]mov     eax, edi[/FONT]
[FONT=Times New Roman]shl     ecx, 2[/FONT]
[FONT=Times New Roman]sub     eax, ecx[/FONT]
[FONT=Times New Roman]or      dword ptr [eax], 1[/FONT]
[/FONT]


当对CliprectInfo操作时虚函数表在这里活生生成被修改了一位,后续对对象的调用都会导致访问异常。

2020安全开发者峰会(2020 SDC)议题征集 中国.北京 7月!

上传的附件:
最新回复 (18)
llydd 9 2010-11-19 18:27
2
0
沙发是我的
superdj 2010-11-19 19:00
3
0
支持一下,看不懂的~
VisX 2010-11-19 19:00
4
0
mark
Aker 4 2010-11-20 01:12
5
0
<html>  

<table style=position:absolute;clip:rect(0)>  

</html>
前些日子碰到这个了,支持
wtfml 2010-11-20 09:19
6
0
支持一下~!
whypro 2010-11-20 10:32
7
0
太好了!太给力了!
Odayer 2010-11-20 15:15
8
0
谢谢楼主的分析,呵呵。。。
return 2010-11-20 15:46
9
0
谢谢楼主的分析!
lovesuae 1 2010-11-20 18:52
10
0
精彩,收下了
ipfans 2010-11-20 20:00
11
0
有源码就是好呀.....
llydd 9 2010-11-21 17:03
12
0
有源码省不少事
某某 1 2010-11-25 09:27
13
0
不知道楼主对于 网马中的JavaScript堆喷射是怎么通过漏洞起作用的 有么有研究?
pangziwuwu 2010-11-25 10:01
14
0
好东西收藏了!!!!!
kkmylove 2 2010-12-2 09:35
15
0
看不懂 苦恼
icoon 2010-12-2 10:06
16
0
真的挺高深的
ellle 2010-12-30 18:36
17
0
绝对支持一个!
kindsjay 4 2011-8-8 23:28
18
0
调试需要配置环境吗?
holiday 2011-10-30 22:40
19
0
下载学习一下
游客
登录 | 注册 方可回帖
返回