MS10-001:字体文件解压缩漏洞深度解析

本文详细分析了Microsoft安全公告MS10-001中披露的LZCOMP解压缩器漏洞(CVE-2010-0018),探讨了其在t2embed.dll中的边界检查缺陷、不同Windows版本下的利用场景,以及通过恶意字体文件进行远程攻击的向量。

MS10-001:字体文件解压缩漏洞

MS10-001修复了Microtype Express字体中LZCOMP解压缩器的一个漏洞(CVE-2010-0018)。本文旨在回答有关此领域更新的一些问题。

问题是什么?

t2embed.dll对从LZCOMP位流解码的长度未正确执行边界检查。这使得复制循环可能违反预期的工作缓冲区。

EOT功能是否可通过第三方代码访问?

是的,t2embed库提供可由第三方代码使用的EOT功能。许多第三方导入t2embed进行字体渲染,尽管有些可能选择实现自己的字体渲染。

为什么利用指数评级为2?

利用指数评级为2是由于成功利用的可能性较低。存在堆准备和可预测性、堆数据损坏以及获取异常处理程序的竞争条件等障碍,使得成功利用不太可能。

成功利用的可能性如何?

由于在32位系统XP及更高版本上t2embed执行的边界检查性质,通过旧检查的唯一缓冲区+索引组合将指向地址0x80000000及以上。由于这些区域在IOPL 3运行时无法访问,进程将崩溃(访问违规),尝试运行任意代码将失败。

在Windows 2000上,此漏洞可能被滥用以实现代码执行。在Windows 2000之后的32位平台上,不当的内存访问通常以地址0x80000000或以上的读取访问违规形式出现,尽管在启用/3GB的系统上,内存布局可能被操纵以损害宿主进程的完整性。在未启用/3GB(默认)的系统上存在稳定性(拒绝服务)影响,而启用/3GB的系统存在代码执行风险,尽管Microsoft产品中不存在已知的攻击向量。

第三方产品如果(A)支持大地址(http://msdn.microsoft.com/en-us/library/wz223b1z(VS.80).aspx),(B)使用t2embed,且(C)在启用/3GB的系统上运行,应被视为可被利用。

在64位平台上,不当的内存访问通常以内核模式地址的读取访问违规形式出现,这会影响应用程序稳定性(拒绝服务),没有代码执行威胁。

以下是描述上述利用场景的表格:

系统配置 /2GB未运行大地址感知应用 /3GB未运行大地址感知应用 /2GB运行大地址感知应用 /3GB运行大地址感知应用
32位XP及更新 拒绝服务 拒绝服务 拒绝服务 代码执行机会
64位XP及更新 拒绝服务 拒绝服务 拒绝服务 拒绝服务
Windows 2000 代码执行机会 代码执行机会 代码执行机会 代码执行机会

Windows 2000的严重性评级为关键,因为漏洞代码通过客户端应用程序暴露,这些应用程序可以渲染EOT字体,而不需要用户交互/通知。(例如Microsoft Internet Explorer、Microsoft Office PowerPoint和Microsoft Office Word)

攻击向量是什么?

远程攻击向量全部在用户模式:

  • 恶意字体(EOT)通过恶意网站上的文件传递,默认在所有版本的Internet Explorer中渲染。
  • 通过社交工程诱使受害者打开包含畸形嵌入字体的恶意Office文档,该字体在打开Office文档时渲染(PowerPoint和Word文档是最可能的攻击向量)。

如何保护自己?

防范此漏洞的最佳选择是应用MS10-001的更新。

如先前SRD博客文章所述,另一个选项是禁用IE中解析/加载嵌入字体的支持。此方法的副作用是会导致使用嵌入字体技术的网站无法正确渲染。

什么是/3GB?如何判断系统是否启用了/3GB?

/3GB是一个开关,它允许32位系统受益于3GB的可寻址内存,而不是默认的2GB内存。有关/3GB的更多信息可以在此处找到。您可以通过在shell中键入以下命令来检查系统是否启用了/3GB:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
C:\>bcdedit.exe /v

Windows Boot Manager
--------------------
identifier              {9dea862c-5cdd-4e70-acc1-f32b344d4795}
device                  partition=D:
description             Windows Boot Manager
locale                  en-US
inherit                 {7ea2e1ac-2e61-4728-aaa3-896d9d0a9f0e}
default                 {4a81cc63-2e99-11de-a190-00188b749f31}
resumeobject            {4a81cc62-2e99-11de-a190-00188b749f31}
displayorder            {4a81cc63-2e99-11de-a190-00188b749f31}
toolsdisplayorder       {b2721d73-1db4-4c62-bf78-c548a880142d}
timeout                 30

Windows Boot Loader
-------------------
identifier              {4a81cc63-2e99-11de-a190-00188b749f31}
device                  partition=C:
path                    \Windows\system32\winload.exe
description             Microsoft Windows Vista
locale                  en-US
inherit                 {6efb52bf-1766-41db-a6b3-0ee5eff72bd7}
bootdebug               Yes
osdevice                partition=C:
systemroot              \Windows
resumeobject            {4a81cc62-2e99-11de-a190-00188b749f31}
nx                      OptIn
increaseuserva          3072
debug                   No

注意increaseuserva变量。如果未设置(或设置为2048),则未启用/3GB。如果此值设置为3072(如此处所示),则启用了/3GB。

什么是LZCOMP?

LZCOMP是LZ77主题的一种压缩算法变体。有关LZCOMP及其与LZ77区别的详细解释可以在此处找到。

LZCOMP解压缩器组件在系统上的位置?

LZCOMP解压缩器存在于t2embed动态链接库中。它通常位于%SystemRoot%\System32,并被Office和Internet Explorer等程序导入。

此字体漏洞与MS09-065修复的先前字体漏洞有何不同?

此漏洞存在于用户模式组件(t2embed.dll)中,而先前的字体漏洞(MS09-065)修复的是内核模式组件(win32k.sys)。

我要感谢Matt Miller的一般指导,以及MSRC工程团队的Bruce Dang和Robert Hensing在此版本中的努力。

-Brian Cavenah, MSRC Engineering 发布内容“按原样”提供,不提供任何保证,也不授予任何权利。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计