无需Native Code的RCE——IE8中的写入原语利用
字数 1787 2025-08-05 08:19:22
IE8类型混淆漏洞利用技术分析
漏洞概述
CVE-2019-0752是Internet Explorer 8(及更低仿真级别)中的一个类型混淆漏洞,允许攻击者通过精心构造的VBScript代码实现无需原生代码的远程代码执行(RCE)。该漏洞源于IE对IDispatchEx接口中DISPATCH_PROPERTYPUT和DISPATCH_PROPERTYPUTREF操作类型的错误处理,导致类型混淆并最终产生一个"write-what-where"原语。
漏洞背景
IE的快速路径机制
IE为了提高DOM方法和属性的访问性能,为部分常用属性和方法实现了"快速路径"机制:
- 快速路径函数指针存储在静态表
mshtml!_FastInvokeTable中 - 对于属性,快速路径通常只包含getter方法而非setter方法
- 当检测到
DISPATCH_PROPERTYPUT操作时,IE会避免使用快速路径机制
IDispatchEx操作类型
IDispatchEx接口支持两种不同的属性赋值操作:
DISPATCH_PROPERTYPUT(0x4):用于标量值(整数、字符串等)的赋值DISPATCH_PROPERTYPUTREF(0x8):用于对象引用的赋值
漏洞分析
根本原因
漏洞存在于mshtml!CBase::ContextInvokeEx中的IDispatchEx::InvokeEx实现:
- 代码错误地仅通过
DISPATCH_PROPERTYPUT位检测put操作 DISPATCH_PROPERTYPUTREF操作会被错误路由到_FastInvokeTable中的getter方法- getter和setter方法签名不同,导致类型混淆
可利用场景分析
研究发现有三种可能的函数签名混淆情况:
- Case 1:安全,仅覆盖BSTR前4字节,无法利用
- Case 2:部分可控,但堆栈不平衡导致进程终止
- Case 3:完全可利用,通过
CElement::get_scrollLeft实现任意地址写入
漏洞利用
初始PoC
Class MyClass
End Class
Sub test()
Dim obj : Set obj = New MyClass
document.body.scrollLeft = obj
End Sub
此PoC通过将MyClass实例赋给scrollLeft属性,触发DISPATCH_PROPERTYPUTREF调用,最终导致CElement::get_scrollLeft被错误调用,将对象引用解释为写入地址。
利用步骤
1. 从任意写到任意读
由于漏洞仅提供写入原语而无读取能力,采用以下技术:
- 分配超大数组(0x30000000字节)覆盖大部分地址空间
- 在固定地址(如0x28281000)写入特定值
- 扫描数组找到被修改的元素("gremlin")
- 将gremlin类型设置为
VT_BYREF | VT_I4,创建间接读取原语
2. 构建任意DWORD值
由于写入值限制(<0x001767dd),采用分步写入:
- 分4次写入小值(0x00-0xff)
- 每次从后续地址开始
- 最终构建完整的4字节值
3. 从内存控制到代码执行
颠覆调度机制实现代码执行:
- 创建伪造的vtable,将条目替换为
WinExec地址 - 准备COM对象(Scripting.Dictionary)同时作为有效ANSI命令字符串
- 精心构造对象内存布局:
- 前4字节作为vtable指针(0x28282828)
- 同时解释为ANSI字符串"(((("
- 使用路径遍历("..")取消虚假路径
- 构造有效的PowerShell命令
4. 绕过CFG
在Windows 10上:
- CFG不限制
WinExec等API的调用 - 即使启用CFG,仍可实现代码执行
完整利用技术
关键数据结构
Scripting.Dictionary内存布局
+0x00: vtable指针 (红色)
+0x04: 引用计数器 (蓝色)
+0x08: Pld指针 (绿色)
+0x0C: 剩余空间 (用于构造命令)
精心构造的命令字符串
"((((\..\.ewe" + [PowerShell命令] + "#" + [pld指针]
增强保护模式(EPM)下的行为
- 在EPM下仍可利用
- 生成的代码执行受AppContainer限制
- 不影响利用的可靠性
防御建议
- 及时安装安全更新(MS补丁)
- 禁用VBScript支持
- 启用增强保护模式(EPM)
- 考虑使用更新的浏览器版本
结论
该漏洞利用展示了:
- 仅通过内存读写原语实现RCE的可能性
- 无需ROP或shellcode的高级利用技术
- 即使在现代防护(如CFG)下仍可能实现代码执行
- 强调了内存安全漏洞的严重性和创新性利用技术的发展趋势