对微软Outlook的CVE-2018-8587深入分析报告
字数 1696 2025-08-29 08:31:35

Microsoft Outlook CVE-2018-8587 堆溢出漏洞深入分析与教学文档

漏洞概述

CVE-2018-8587 是 Microsoft Outlook 中的一个堆破坏(Heap Corruption)漏洞,由 Fortinet 的 FortiGuard 实验室研究员 Yonghui Han 发现并于2018年12月被微软修补。该漏洞影响范围广泛,涵盖 Outlook 2010 到 Outlook 2019 的所有版本,包括 Office 365 ProPlus 的32位和64位版本。

漏洞触发条件

漏洞可通过具有错误格式的 RWZ(邮件分类规则)文件触发:

  • 用户运行 Microsoft Outlook
  • 点击"规则"→"管理规则和警报"→"选项"→"导入规则"
  • 选择特制的恶意 RWZ 文件

漏洞技术分析

根本原因

漏洞源于整数溢出导致的堆内存分配不足,进而引发越界写入(Out-of-Bounds Writing):

  1. 程序从RWZ文件中读取一个值(如0xFFFFFFFF)
  2. 计算分配大小:arg_4 * 4 + 4 → 0xFFFFFFFF * 4 + 4 = 0
  3. 调用MAPIAllocateBuffer分配内存,请求大小为0
  4. MAPIAllocateBuffer实际分配8字节(0+8),并写入0x0000000001000010
  5. 返回无效的堆尾地址(分配地址+8)
  6. 后续操作尝试向未分配的内存写入数据,导致崩溃

关键函数分析

  1. MAPIAllocateBuffer:

    • 包装了RtlAllocateHeap
    • 不检查0作为参数的有效性
    • 总是分配请求大小+8字节
    • 在额外8字节中写入0x0000000001000010
    • 返回堆地址+8给调用者
  2. 漏洞函数:

    • 参数arg_4来自文件内容
    • 计算eax = arg_4 * 4 + 4导致整数溢出
    • 未验证计算结果的有效性

崩溃表现

崩溃发生时:

  • ECX指向非零但不可读的内存地址
  • 内存页面具有Reserve属性
  • 异常发生在尝试向未分配/已释放内存写入数据时

调试方法

  1. 启用整页堆调试:

    YOUR_WINDBG_INSATALL_LOCATION\gflags.exe /p /enable outlook.exe /full
    
  2. 调试步骤:

    • 启动Outlook并加载PoC文件
    • 监控崩溃堆栈
    • 检查ECX值来源(来自EDI)
    • 跟踪MAPIAllocateBuffer调用前后的寄存器变化
    • 分析内存分配情况

补丁分析

微软修补方案:

  • 添加了对请求分配堆大小的验证
  • 确保计算值不会导致整数溢出
  • 验证分配大小的合理性

影响与危害

成功利用此漏洞的攻击者可以:

  • 通过特制文件在当前用户系统中执行任意代码
  • 实现远程代码执行
  • 完全控制受影响系统

防护措施

  1. 用户防护:

    • 立即升级到最新版本的Outlook
    • 安装微软2018年12月发布的安全补丁
  2. 企业防护:

    • Fortinet IPS用户可启用签名:
      MS.Outlook.CVE-2018-8587.Remote.Code.Execution
      
    • 部署其他厂商的相应防护规则

教学总结

关键知识点

  1. 整数溢出风险:

    • 所有算术运算都应检查边界条件
    • 特别是用于内存分配大小的计算
  2. 内存分配验证:

    • 验证分配大小不为0
    • 验证分配大小在合理范围内
  3. 文件格式解析:

    • 严格验证从文件读取的所有值
    • 考虑所有可能的输入值范围

漏洞研究技巧

  1. 调试技术:

    • 使用整页堆调试识别堆问题
    • 跟踪内存分配与释放流程
  2. 静态分析:

    • 识别关键函数调用链
    • 分析参数传递与修改过程
  3. 动态分析:

    • 修改PoC文件验证假设
    • 监控关键函数调用时的寄存器状态
  4. 补丁对比:

    • 比较修补前后的二进制差异
    • 理解厂商的修复思路

附录

相关技术术语

  1. RWZ文件: Outlook的规则导出文件格式,包含邮件分类规则
  2. Heap Corruption: 堆破坏,内存管理不当导致堆结构损坏
  3. Out-of-Bounds Writing: 越界写入,向分配内存范围之外写入数据
  4. MAPI: Messaging Application Programming Interface,消息应用程序接口

参考资源

Microsoft Outlook CVE-2018-8587 堆溢出漏洞深入分析与教学文档 漏洞概述 CVE-2018-8587 是 Microsoft Outlook 中的一个堆破坏(Heap Corruption)漏洞,由 Fortinet 的 FortiGuard 实验室研究员 Yonghui Han 发现并于2018年12月被微软修补。该漏洞影响范围广泛,涵盖 Outlook 2010 到 Outlook 2019 的所有版本,包括 Office 365 ProPlus 的32位和64位版本。 漏洞触发条件 漏洞可通过具有错误格式的 RWZ(邮件分类规则)文件触发: 用户运行 Microsoft Outlook 点击"规则"→"管理规则和警报"→"选项"→"导入规则" 选择特制的恶意 RWZ 文件 漏洞技术分析 根本原因 漏洞源于整数溢出导致的堆内存分配不足,进而引发越界写入(Out-of-Bounds Writing): 程序从RWZ文件中读取一个值(如0xFFFFFFFF) 计算分配大小: arg_4 * 4 + 4 → 0xFFFFFFFF * 4 + 4 = 0 调用 MAPIAllocateBuffer 分配内存,请求大小为0 MAPIAllocateBuffer 实际分配8字节(0+8),并写入 0x0000000001000010 返回无效的堆尾地址(分配地址+8) 后续操作尝试向未分配的内存写入数据,导致崩溃 关键函数分析 MAPIAllocateBuffer : 包装了 RtlAllocateHeap 不检查0作为参数的有效性 总是分配请求大小+8字节 在额外8字节中写入 0x0000000001000010 返回堆地址+8给调用者 漏洞函数 : 参数 arg_4 来自文件内容 计算 eax = arg_4 * 4 + 4 导致整数溢出 未验证计算结果的有效性 崩溃表现 崩溃发生时: ECX指向非零但不可读的内存地址 内存页面具有Reserve属性 异常发生在尝试向未分配/已释放内存写入数据时 调试方法 启用整页堆调试 : 调试步骤 : 启动Outlook并加载PoC文件 监控崩溃堆栈 检查ECX值来源(来自EDI) 跟踪 MAPIAllocateBuffer 调用前后的寄存器变化 分析内存分配情况 补丁分析 微软修补方案: 添加了对请求分配堆大小的验证 确保计算值不会导致整数溢出 验证分配大小的合理性 影响与危害 成功利用此漏洞的攻击者可以: 通过特制文件在当前用户系统中执行任意代码 实现远程代码执行 完全控制受影响系统 防护措施 用户防护 : 立即升级到最新版本的Outlook 安装微软2018年12月发布的安全补丁 企业防护 : Fortinet IPS用户可启用签名: 部署其他厂商的相应防护规则 教学总结 关键知识点 整数溢出风险 : 所有算术运算都应检查边界条件 特别是用于内存分配大小的计算 内存分配验证 : 验证分配大小不为0 验证分配大小在合理范围内 文件格式解析 : 严格验证从文件读取的所有值 考虑所有可能的输入值范围 漏洞研究技巧 调试技术 : 使用整页堆调试识别堆问题 跟踪内存分配与释放流程 静态分析 : 识别关键函数调用链 分析参数传递与修改过程 动态分析 : 修改PoC文件验证假设 监控关键函数调用时的寄存器状态 补丁对比 : 比较修补前后的二进制差异 理解厂商的修复思路 附录 相关技术术语 RWZ文件 : Outlook的规则导出文件格式,包含邮件分类规则 Heap Corruption : 堆破坏,内存管理不当导致堆结构损坏 Out-of-Bounds Writing : 越界写入,向分配内存范围之外写入数据 MAPI : Messaging Application Programming Interface,消息应用程序接口 参考资源 原始分析报告: Fortinet博客 微软安全公告: 2018年12月周二补丁日发布 CVE详细信息: CVE-2018-8587