瑞星:微软MS09-002漏洞分析报告

  作者:Arade
2009/2/20 14:34:00
本文关键字: PM 理论探讨

  【比特网综合报道】Internet Explorer的CFunctionPointer函数没有正确处理文档对象,如果以特定序列附加并删除了对象,就可以触发内存破坏。攻击者可以构造特殊顺序的代码触发这个内存破坏,同时利用精心构造的缓冲区,导致以当前登录用户的权限执行任意代码。

  该弱点实际存在于mshtml.dll中。CFunctionPointer对象在其构造函数中没有正确地引用文档对象(标签对象或其它),导致该文档对象可能在CFunctionPointer对象释放前被释放,而CFunctionPointer会继续使用这个已经被销毁的文档对象。

  这是CFunctionPointer的构造函数:

  public: __thiscall CFunctionPointer::CFunctionPointer(class CBase *, long)

  .text:775E7BE9              mov edi, edi

  .text:775E7BEB              push ebp

  .text:775E7BEC             mov ebp, esp

  .text:775E7BEE             push esi

  .text:775E7BEF             mov esi, ecx

  .text:775E7BF1             call ??0CBase@@QAE@XZ ; CBase::CBase(void)

  .text:775E7BF6             mov ecx, [ebp+pOwner]

  .text:775E7BF9             test ecx, ecx

  .text:775E7BFB             mov eax,

      [ebp+pISecurityContext]

  .text:775E7BFE             mov dword ptr [esi],

      offset ??_7CFunctionPointer@@6B@ ; const CFunctionPointer::`vftable'

  .text:775E7C04            mov [esi+10h], ecx // 设置关联文档对象

  在设置文档对象时,CFunctionPointer的构造函数仅仅是简单的将其赋给[edi+10h],而没有对其进行引用(AddRef)。

  而在CFunctionPointer其他函数中几乎都使用了该关联文档对象指针,例如实现IUnknown::AddRef的CFunctionPointer::PrivateAddRef,实现IUnknown::Release的CFunctionPointer::PrivateRelease。

  这是CFunctionPointer::PrivateAddRef函数:

  virtual unsigned long CFunctionPointer::PrivateAddRef(void)

  .text:775E7A21 arg_0                  = dword ptr 8

  .text:775E7A21                            mov edi, edi

  .text:775E7A23                            push ebp

  .text:775E7A24                            mov ebp, esp

  .text:775E7A26                            push esi

  .text:775E7A27                            mov esi, [ebp+arg_0] ; this

  .text:775E7A2A                            mov eax, [esi+10h] ;获得文档对象指针

  .text:775E7A2D                            test eax, eax

  .text:775E7A2F                            jz short loc_775E7A3D

  .text:775E7A31                            cmp dword ptr [esi+4], 0

  .text:775E7A35                            jz short loc_775E7A3D

  .text:775E7A37                            mov ecx, [eax] ;取第一个DWORD,即虚表指针

  .text:775E7A39                            push eax

  .text:775E7A3A                            call dword ptr [ecx+4] ;调用+4位置给出的函数,即AddRef

  例如在CFunctionPointer::PrivateAddRef中,如果文档对象已经被销毁,那么将获得不可预知的虚表指针,接下来执行call dword ptr [ecx+4]后,将跳转到一个不可预知地址去执行 ,在一般情况下会导致IE崩溃。

  攻击者可以以特定的步骤,使CFunctionPointer对象的关联文档对象在CFunctio nPointer对象释放前被释放,接着再引用该CFunctionPointer对象,致使已经被释放的文档对象被重新使用。

  而攻击者又可以以特殊的方式,任意设置被释放文档对象原来所在内存位置的数据(即可构造不正确的虚表),导致该弱点被扩大到可以被利用于执行任意代码。

责编:
vsharing微信扫一扫实时了解行业动态
portalart微信扫一扫分享本文给好友

著作权声明:畅享网文章著作权分属畅享网、网友和合作伙伴,部分非原创文章作者信息可能有所缺失,如需补充或修改请与我们联系,工作人员会在1个工作日内配合处理。
最新专题
网络安全热点透析

随着移动互联、大数据、云计算、物联网等技术的日益发展,在这些热点技术为个人生活带来便利的同时,也为企业发展..

数据安全医药行业解决方案

采用身份鉴别、访问控制、数据加密以及权限控制等多种安全防护技术手段,保障数据库中医药数据只能被合法用户合规..

    畅享
    首页
    返回
    顶部
    ×
      信息化规划
      IT总包
      供应商选型
      IT监理
      开发维护外包
      评估维权
    客服电话
    400-698-9918