无需Native Code的RCE——IE8中的写入原语利用
字数 1787 2025-08-05 08:19:22

IE8类型混淆漏洞利用技术分析

漏洞概述

CVE-2019-0752是Internet Explorer 8(及更低仿真级别)中的一个类型混淆漏洞,允许攻击者通过精心构造的VBScript代码实现无需原生代码的远程代码执行(RCE)。该漏洞源于IE对IDispatchEx接口中DISPATCH_PROPERTYPUTDISPATCH_PROPERTYPUTREF操作类型的错误处理,导致类型混淆并最终产生一个"write-what-where"原语。

漏洞背景

IE的快速路径机制

IE为了提高DOM方法和属性的访问性能,为部分常用属性和方法实现了"快速路径"机制:

  1. 快速路径函数指针存储在静态表mshtml!_FastInvokeTable
  2. 对于属性,快速路径通常只包含getter方法而非setter方法
  3. 当检测到DISPATCH_PROPERTYPUT操作时,IE会避免使用快速路径机制

IDispatchEx操作类型

IDispatchEx接口支持两种不同的属性赋值操作:

  • DISPATCH_PROPERTYPUT(0x4):用于标量值(整数、字符串等)的赋值
  • DISPATCH_PROPERTYPUTREF(0x8):用于对象引用的赋值

漏洞分析

根本原因

漏洞存在于mshtml!CBase::ContextInvokeEx中的IDispatchEx::InvokeEx实现:

  1. 代码错误地仅通过DISPATCH_PROPERTYPUT位检测put操作
  2. DISPATCH_PROPERTYPUTREF操作会被错误路由到_FastInvokeTable中的getter方法
  3. getter和setter方法签名不同,导致类型混淆

可利用场景分析

研究发现有三种可能的函数签名混淆情况:

  1. Case 1:安全,仅覆盖BSTR前4字节,无法利用
  2. Case 2:部分可控,但堆栈不平衡导致进程终止
  3. 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. 从任意写到任意读

由于漏洞仅提供写入原语而无读取能力,采用以下技术:

  1. 分配超大数组(0x30000000字节)覆盖大部分地址空间
  2. 在固定地址(如0x28281000)写入特定值
  3. 扫描数组找到被修改的元素("gremlin")
  4. 将gremlin类型设置为VT_BYREF | VT_I4,创建间接读取原语

2. 构建任意DWORD值

由于写入值限制(<0x001767dd),采用分步写入:

  1. 分4次写入小值(0x00-0xff)
  2. 每次从后续地址开始
  3. 最终构建完整的4字节值

3. 从内存控制到代码执行

颠覆调度机制实现代码执行:

  1. 创建伪造的vtable,将条目替换为WinExec地址
  2. 准备COM对象(Scripting.Dictionary)同时作为有效ANSI命令字符串
  3. 精心构造对象内存布局:
    • 前4字节作为vtable指针(0x28282828)
    • 同时解释为ANSI字符串"(((("
    • 使用路径遍历("..")取消虚假路径
    • 构造有效的PowerShell命令

4. 绕过CFG

在Windows 10上:

  1. CFG不限制WinExec等API的调用
  2. 即使启用CFG,仍可实现代码执行

完整利用技术

关键数据结构

Scripting.Dictionary内存布局

+0x00: vtable指针 (红色)
+0x04: 引用计数器 (蓝色)
+0x08: Pld指针 (绿色)
+0x0C: 剩余空间 (用于构造命令)

精心构造的命令字符串

"((((\..\.ewe" + [PowerShell命令] + "#" + [pld指针]

增强保护模式(EPM)下的行为

  1. 在EPM下仍可利用
  2. 生成的代码执行受AppContainer限制
  3. 不影响利用的可靠性

防御建议

  1. 及时安装安全更新(MS补丁)
  2. 禁用VBScript支持
  3. 启用增强保护模式(EPM)
  4. 考虑使用更新的浏览器版本

结论

该漏洞利用展示了:

  1. 仅通过内存读写原语实现RCE的可能性
  2. 无需ROP或shellcode的高级利用技术
  3. 即使在现代防护(如CFG)下仍可能实现代码执行
  4. 强调了内存安全漏洞的严重性和创新性利用技术的发展趋势
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 此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内存布局 精心构造的命令字符串 增强保护模式(EPM)下的行为 在EPM下仍可利用 生成的代码执行受AppContainer限制 不影响利用的可靠性 防御建议 及时安装安全更新(MS补丁) 禁用VBScript支持 启用增强保护模式(EPM) 考虑使用更新的浏览器版本 结论 该漏洞利用展示了: 仅通过内存读写原语实现RCE的可能性 无需ROP或shellcode的高级利用技术 即使在现代防护(如CFG)下仍可能实现代码执行 强调了内存安全漏洞的严重性和创新性利用技术的发展趋势