对微软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):
- 程序从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属性
- 异常发生在尝试向未分配/已释放内存写入数据时
调试方法
-
启用整页堆调试:
YOUR_WINDBG_INSATALL_LOCATION\gflags.exe /p /enable outlook.exe /full -
调试步骤:
- 启动Outlook并加载PoC文件
- 监控崩溃堆栈
- 检查ECX值来源(来自EDI)
- 跟踪
MAPIAllocateBuffer调用前后的寄存器变化 - 分析内存分配情况
补丁分析
微软修补方案:
- 添加了对请求分配堆大小的验证
- 确保计算值不会导致整数溢出
- 验证分配大小的合理性
影响与危害
成功利用此漏洞的攻击者可以:
- 通过特制文件在当前用户系统中执行任意代码
- 实现远程代码执行
- 完全控制受影响系统
防护措施
-
用户防护:
- 立即升级到最新版本的Outlook
- 安装微软2018年12月发布的安全补丁
-
企业防护:
- Fortinet IPS用户可启用签名:
MS.Outlook.CVE-2018-8587.Remote.Code.Execution - 部署其他厂商的相应防护规则
- Fortinet IPS用户可启用签名:
教学总结
关键知识点
-
整数溢出风险:
- 所有算术运算都应检查边界条件
- 特别是用于内存分配大小的计算
-
内存分配验证:
- 验证分配大小不为0
- 验证分配大小在合理范围内
-
文件格式解析:
- 严格验证从文件读取的所有值
- 考虑所有可能的输入值范围
漏洞研究技巧
-
调试技术:
- 使用整页堆调试识别堆问题
- 跟踪内存分配与释放流程
-
静态分析:
- 识别关键函数调用链
- 分析参数传递与修改过程
-
动态分析:
- 修改PoC文件验证假设
- 监控关键函数调用时的寄存器状态
-
补丁对比:
- 比较修补前后的二进制差异
- 理解厂商的修复思路
附录
相关技术术语
- RWZ文件: Outlook的规则导出文件格式,包含邮件分类规则
- Heap Corruption: 堆破坏,内存管理不当导致堆结构损坏
- Out-of-Bounds Writing: 越界写入,向分配内存范围之外写入数据
- MAPI: Messaging Application Programming Interface,消息应用程序接口
参考资源
- 原始分析报告: Fortinet博客
- 微软安全公告: 2018年12月周二补丁日发布
- CVE详细信息: CVE-2018-8587