从BinDiff到0day 在IE中利用CVE-2019-1208
字数 2175 2025-08-25 22:59:09
CVE-2019-1208漏洞分析与利用教学文档
1. 漏洞概述
CVE-2019-1208是Internet Explorer(IE)中的一个Use-After-Free(UAF)漏洞,由趋势科技研究员发现并于2019年6月报告给微软。该漏洞被评为"严重"等级,并在2019年9月的微软补丁星期二中被修复。
漏洞特性:
- 类型:Use-After-Free (UAF)
- 影响组件:VBScript引擎(vbscript.dll)
- 攻击场景:
- 通过IE访问恶意网站
- 通过Office文档中的IE渲染引擎
- 通过嵌入ActiveX控件的应用程序
- 潜在影响:
- 获取当前用户权限
- 如果当前用户是管理员,可完全控制系统
- 安装/卸载程序、查看修改数据、创建新用户等
2. 漏洞发现过程
2.1 使用BinDiff分析
研究员通过BinDiff工具比较vbscript.dll的5月和6月版本,发现以下函数有修改:
- SafeArrayAddRef
- SafeArrayReleaseData
- SafeArrayReleaseDescriptor
这些函数是VBScript引擎中处理SafeArray引用计数的关键函数。
2.2 漏洞触发原理
漏洞触发流程:
- 创建包含自定义类的数组:
arr = Array(New MyClass) - 在回调函数中修改数组:
arr = Array(0) - 调用Join函数触发UAF
关键点在于回调函数中创建的新SafeArray不受SafeArrayAddRef保护,导致引用计数管理错误。
3. 漏洞技术分析
3.1 漏洞触发代码流
-
初始化阶段:
Class MyClass Public Default Property Get ' 回调函数 arr = Array(0) ' 创建新的不受保护的SafeArray End Property End Class arr = Array(New MyClass) ' 创建初始SafeArray -
触发阶段:
Join(arr) ' 触发MyClass的回调函数 -
释放阶段:
- 回调返回后,VBsJoin调用SafeArrayReleaseData和SafeArrayReleaseDescriptor
- 由于新SafeArray不受保护,引用计数直接归零
- SafeArrayData和SafeArrayDescriptor被释放
-
崩溃阶段:
- 当尝试访问已释放的SafeArrayDescriptor时,导致进程崩溃
3.2 内存管理问题
- SafeArray是VBScript中用于处理数组的数据结构
- 正常流程中,SafeArrayAddRef应增加引用计数
- 回调函数打破了这一假设,导致UAF
4. 漏洞利用开发
4.1 初始利用尝试
- 使用BSTR(Basic String)作为数据结构
- 尝试修改回调中的SafeArray维度
- 遇到"数组类型不匹配"运行时错误
- 使用
On Error Resume Next绕过错误
4.2 堆风水技术
- 获取0x20字节的已释放内存
- 使用大小为0x20字节的BSTR填充该内存
- 伪造一个大型SafeArray:
- 一维数组
- 0x7FFFFFFF个元素
- 每个元素1字节
4.3 内存读/写原语
通过伪造的SafeArray可以实现:
- 读取0x00000000到0x7FFFFFFF范围内的内存
- 写入相同范围内的内存
4.4 地址泄露
参考Simon Zuckerbraun的研究:
- 使用堆喷射技术获取固定读/写地址(0x28281000)
5. 实现远程代码执行(RCE)
5.1 使用Scripting.Dictionary对象
- 伪造一个假的Dictionary对象
- 使用BSTR构建伪造结构
5.2 具体步骤
- 读取原始Dictionary内存并保存到BSTR
- 将
VBADictionary::Exists替换为kernel32!WinExec - 将WinExec参数(
\..\calc.exe)写入BSTR - 修改内存标志使fake_array成为有效对象
- 触发伪造的函数调用
5.3 最终效果
成功弹出计算器,证明远程代码执行实现。
6. 防御措施
微软采取的防御:
- 在Windows 10中默认禁用VBScript
- 在Windows 7/8中禁止IE使用VBScript
用户应采取的措施:
- 及时安装安全更新
- 禁用不必要的组件:
- 通过注册表或组策略禁用VBScript
- 提高安全意识:
- 警惕垃圾邮件和社会工程攻击
- 避免访问不可信网站
7. 技术细节补充
7.1 SafeArray结构
SafeArray是COM中用于安全传递数组的数据结构,包含:
- 维度信息
- 元素类型和大小
- 锁定计数
- 数据指针
7.2 VBScript引擎内存管理
VBScript使用引用计数管理对象生命周期:
- AddRef增加引用计数
- Release减少引用计数
- 当计数归零时释放对象
7.3 漏洞根本原因
回调函数中创建的SafeArray未受保护,导致:
- 引用计数未正确增加
- 提前释放关键数据结构
- 后续访问已释放内存
8. 完整PoC代码结构
Class MyClass
Public Default Property Get
' 回调函数中修改数组
arr = Array(0)
' 绕过类型检查
On Error Resume Next
End Property
End Class
' 初始化漏洞触发数组
arr = Array(New MyClass)
' 触发漏洞
Join(arr)
' 后续利用代码
' ...
9. 相关研究参考
- Simon Zuckerbraun的VBScript利用技术
- 趋势科技技术简报:
A Proof-of-Concept Exploiting CVE-2019-1208 in Internet-Explorer - 微软安全公告
10. 总结
CVE-2019-1208展示了:
- 回调函数中不安全操作的危险性
- 引用计数管理的重要性
- VBScript引擎的历史安全问题
- 从UAF到RCE的完整利用链
该漏洞再次强调了及时更新和禁用不必要组件的重要性。