文档信息
编号 | QiAnXinTI-SV-2017-00010 |
关键字 | Equation CVE-2017-11882 Office |
发布日期 | 2017年11月21日 |
更新日期 | 2017年11月21日 |
TLP | WHITE |
分析团队 | 奇安信威胁情报中心 |
通告背景
2017年11月14日,微软在例行的系统安全补丁发布中修复了一个Office远程代码执行严重漏洞,漏洞编号为CVE-2017-11882。受攻击用户打开恶意的Office文档时,无需交互,就可能执行恶意代码从而导致电脑被控制。
奇安信威胁情报中心分析确认该漏洞可用,漏洞相关的技术细节和验证程序已经公开。此漏洞极有可能被利用来执行大规模的攻击,构成现实的威胁,因此,奇安信威胁情报中心发布此通告提醒用户采取应对措施。
漏洞概要
漏洞名称 | Microsoft Office数学公式编辑器内存损坏漏洞 |
威胁类型 | 远程代码执行 |
威胁等级 | 高 |
漏洞ID | CVE-2017-11882 |
受影响系统及应用版本 | Microsoft Office 2007 Service Pack 3 Microsoft Office 2010 Service Pack 2 (32-bit editions) Microsoft Office 2010 Service Pack 2 (64-bit editions) Microsoft Office 2013 Service Pack 1 (32-bit editions) Microsoft Office 2013 Service Pack 1 (64-bit editions) Microsoft Office 2016 (32-bit edition) Microsoft Office 2016 (64-bit edition) |
不受影响影响系统及应用版本 |
漏洞描述
该漏洞类型为栈溢出,存在于EQNEDT32.EXE组件中。这个组件是由Design Science Inc.开发,后来被微软收购。由于该组件于2001年编译嵌入Office之后就没有任何进一步的修改,所以该漏洞已存在17年之久,影响当前流行的所有Office版本。
EQNEDT32.EXE组件在OLE技术规范下设计开发,首发于Microsoft Office 2000和Microsoft 2003,从Microsoft Office 2007开始,虽然显示和编辑公式的方法发生了变化导致EQNEDT32.EXE变得过时,不过为了保持版本兼容性,它并没有从Office套件中删除。
正是这样一个为了保持兼容性覆盖所有Office软件版本的“古老”程序被发现存在栈溢出漏洞,从而导致影响所有Office软件版本。
影响面评估
奇安信威胁情报中心已经确认公开的漏洞利用代码有效,且该漏洞影响几乎所有版本的Office软件并能绕过Windows现有的所有安全缓解措施,所以整体影响面非常大,综合分析威胁等级为高。
处置建议
修复方法
- 目前软件厂商微软已经发布了漏洞相应的补丁,奇安信威胁情报中心建议用户及时更新Office补丁修复漏洞。
- 如暂时无法安装补丁,可以通过修改注册表禁用以下COM控件的方式进行缓解,其中XX.X为版本号:
reg add "HKLM\SOFTWARE\Microsoft\Office\XX.X\Common\COM Compatibility\{0002CE02-0000- 0000-C000-000000000046}" /v "Compatibility Flags" /t REG_DWORD /d 0x400
reg add "HKLM\SOFTWARE\Wow6432Node\Microsoft\Office\XX.X\Common\COM Compatibility\{0002CE02-0000-0000-C000-000000000046}" /v "Compatibility Flags" /t REG_DWORD /d 0x400
技术分析
该漏洞存在于数学公式编辑器程序EQNEDT32.EXE处理Office OLE Equation对象中标记为字体名称记录(font name record)的字节流的过程中,如果Equation对象中存在标记为字体名称(font name record)的超长字节流,那么程序内部在处理该字符串的过程中,会由于未判断字符串长度导致发生栈溢出漏洞。
漏洞分析
Office中的Equation对象
通过在Office文档中插入Equation对象并提取该对象进行分析,可以看到Equation对象数据存在于Equation Native中:
OLE Equation对象数据结构
OLE Equation对象数据使用MTEF格式存储,对象格式头定义如下:
struct EQNOLEFILEHDR {
WORD cbHdr; // length of header, sizeof(EQNOLEFILEHDR) = 28 bytes
DWORD version; // hiword = 2, loword = 0
WORD cf; // clipboard format ("MathType EF")
DWORD cbObject; // length of MTEF data following this header in bytes
DWORD reserved1; // not used
DWORD reserved2; // not used
DWORD reserved3; // not used
DWORD reserved4; // not used
};
紧随Header后是MTEF Byte Stream数据结构:
- 第一个字节是SIZE record
- 紧接着是不同类型的record tag,比如LINE record为0x1,PILE record为0x4
- 对应不同类型record的内容数据
- END record
漏洞成因
- 首先0043A87A函数会判断MTEF Byte Stream数据结构中是否存在FONT name record(0x8):
- 如果存在FONT name record,那么调用004164FA将FONT name字符串拷贝到局部变量中:
- 程序随后调用0041160F将存储的FONT name字符串拷贝到栈中,由于构造的poc中的name字符串长度超过了局部变量的长度,而程序并未进行判断,导致发生栈溢出
- 覆盖返回地址执行程序 POC展示了将返回地址覆盖为EQNEDT32.EXE自身调用WINEXEC的函数地址,并执行计算器程序:
攻击方式
攻击者只需要构造带有FONT name record的OLE Equation Object,并调整name数据长度为可以覆盖返回地址的长度,插入到Office文档中,通过邮件或其他通信机制发送给目标并诱使其打开即可执行指定的命令,获取对电脑的控制。
参考资料
https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2017-11882
https://embedi.com/blog/skeleton-closet-ms-office-vulnerability-you-didnt-know-about
http://rtf2latex2e.sourceforge.net/MTEF3.html#versions
http://web.archive.org/web/20010304111449/http://mathtype.com:80/support/tech/MTEF_storage.htm
https://cert.360.cn/warning/detail?id=5373beff9f40ba6de88eb04c3b7c2455
更新历史
时间 | 内容 |
2017年11月21日 | 初始报告 |