GDI 堆溢出漏洞分析:CVE-2008-1083
Windows 的图形设备接口(GDI)一直是安全研究的重点区域——这不,又一个堆溢出漏洞浮出水面。这次的问题出在 CreateDIBPatternBrushPt 函数处理 WMF 文件的方式上,稍有不慎,攻击者就能利用特制的图形文件在目标系统上执行任意代码。
受影响的操作系统版本列表如下(基本都是那个年代的常见版本):
- Microsoft Windows XP SP2
- Microsoft Windows Vista SP1
- Microsoft Windows Vista
- Microsoft Windows Server 2008
- Microsoft Windows Server 2003 SP2
- Microsoft Windows Server 2003 SP1
- Microsoft Windows 2000 SP4
这个漏洞的编号是 CVE-2008-1083,对应的 BUGTRAQ ID 为 28571。微软在安全公告 MS08-021 中进行了修复。
技术细节:堆溢出是如何发生的?
问题的根源在于 GDI 函数 CreateDIBPatternBrushPt 在处理 WMF 文件时,对用户数据的计算存在缺陷。简单来说,系统没有正确估算需要分配的堆块大小,导致分配不足,然后又在后续操作中直接使用了这个过小的堆块——经典的堆溢出触发路径。
此外,在解析 EMF 文件时,漏洞的触发方式更加直接。EMF 文件中包含一个用于描述位图信息的头结构,系统在计算需要分配的字节数时,直接使用了这个头结构中的数值进行算术运算。如果攻击者精心构造这些数值,就能让计算结果溢出,最终同样导致堆溢出。
两条路径的终点一致:只要用户受骗打开了特制的 WMF 或 EMF 文件,攻击者就能获得系统控制权。这里的文件载体可以是邮件附件、恶意网页嵌入的图形,或者任何能触发 GDI 渲染的场景。
临时应对方案:修改注册表禁用元文件处理
在补丁安装之前,可以通过一个注册表修改来临时阻截此类攻击——关闭元文件处理能力。操作步骤如下(需要管理员权限):
- 点击“开始” → “运行”,输入
Regedit并回车。 - 定位到以反赌册表路径:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\GRE_Initialize - 在右侧空白处右键 → “新建” → “DWORD (32位) 值”。
- 将新建的值命名为
DisableMetaFiles。 - 双击该值,将数值数据修改为
1,确定。 - 关闭注册表编辑器,重启系统生效。
这个临时方案会关闭 WMF/EMF 文件的渲染支持,可能会影响部分依赖元文件的应用程序(如旧版 Office 中的剪贴画),但在补丁就绪前,这是性价比最高的防御手段。
官方补丁:MS08-021
微软已经在安全公告 MS08-021 中发布了针对此漏洞的补丁(知识库编号 948590),所有受影响系统都应尽快安装。补丁地址为微软官方更新网站,用户也可以通过 Windows Update 自动获取。
漏洞发现者 Sebastian Apelt 对此漏洞的发现做出了贡献,相关技术细节可在 iDefense、Secunia 等安全公告中查阅。
