Outlook双重释放漏洞MS13-068:技术分析与利用难度详解

本文深入分析Microsoft Outlook的S/MIME处理漏洞MS13-068,探讨双重释放漏洞的根因、利用条件及实际攻击难度,包含代码片段和内存操作细节,为安全研究人员提供技术参考。

根因分析

S/MIME允许签名消息的嵌套处理。当Outlook遇到特定嵌套配置的S/MIME证书时,由于对已释放的类实例指针pPrivBody进行重复释放,导致程序崩溃:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
HRESULT CSMime::SMIMEINFOToOptions(
   IMimeMessageTree * const pTree,
   const SMIMEINFO *  psi,
   HBODY              hBody)
{
   CMessageBody *      pPrivBody = NULL;

   for(iLayer = 0, psldLoop = psi->psldLayers; psldLoop != NULL;
       psldLoop = psldLoop->m_psldInner, iLayer++) {
           pPrivBody->Release();  // 首次释放
    }

   if (pPrivBody != NULL) pPrivBody->Release(); // 双重释放
   return hr;
}

远程代码执行可利用性

双重释放漏洞需满足两个条件才可能被利用:

  1. 堆分配器行为:首次释放的内存块需保持未使用状态且未合并,直到第二次释放时才被重新分配
  2. 写控制能力:攻击者需能实现任意地址写操作(write-what-where)

本漏洞中,第一个条件因堆块可能在两次释放间被重用而不总是成立。第二个条件同样不满足,典型崩溃指令显示:

1
2
eax=00000000
inc     dword ptr [eax+14h]  // 仅对固定地址进行值递增,无攻击者可控参数

由于eax寄存器不受攻击者控制,且操作仅限于递增内存值,实际利用难度极高。

综合评估

基于现有数据分析,该漏洞因可靠性利用构建困难,短期内被大规模利用的可能性较低。微软出于谨慎原则发布安全更新,以防范未来攻击技术的发展。

——Jinwook Shin, MSRC工程团队

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计