从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 漏洞触发原理

漏洞触发流程:

  1. 创建包含自定义类的数组:arr = Array(New MyClass)
  2. 在回调函数中修改数组:arr = Array(0)
  3. 调用Join函数触发UAF

关键点在于回调函数中创建的新SafeArray不受SafeArrayAddRef保护,导致引用计数管理错误。

3. 漏洞技术分析

3.1 漏洞触发代码流

  1. 初始化阶段:

    Class MyClass
        Public Default Property Get
            ' 回调函数
            arr = Array(0)  ' 创建新的不受保护的SafeArray
        End Property
    End Class
    
    arr = Array(New MyClass)  ' 创建初始SafeArray
    
  2. 触发阶段:

    Join(arr)  ' 触发MyClass的回调函数
    
  3. 释放阶段:

    • 回调返回后,VBsJoin调用SafeArrayReleaseData和SafeArrayReleaseDescriptor
    • 由于新SafeArray不受保护,引用计数直接归零
    • SafeArrayData和SafeArrayDescriptor被释放
  4. 崩溃阶段:

    • 当尝试访问已释放的SafeArrayDescriptor时,导致进程崩溃

3.2 内存管理问题

  • SafeArray是VBScript中用于处理数组的数据结构
  • 正常流程中,SafeArrayAddRef应增加引用计数
  • 回调函数打破了这一假设,导致UAF

4. 漏洞利用开发

4.1 初始利用尝试

  1. 使用BSTR(Basic String)作为数据结构
  2. 尝试修改回调中的SafeArray维度
    • 遇到"数组类型不匹配"运行时错误
    • 使用On Error Resume Next绕过错误

4.2 堆风水技术

  1. 获取0x20字节的已释放内存
  2. 使用大小为0x20字节的BSTR填充该内存
  3. 伪造一个大型SafeArray:
    • 一维数组
    • 0x7FFFFFFF个元素
    • 每个元素1字节

4.3 内存读/写原语

通过伪造的SafeArray可以实现:

  • 读取0x00000000到0x7FFFFFFF范围内的内存
  • 写入相同范围内的内存

4.4 地址泄露

参考Simon Zuckerbraun的研究:

  • 使用堆喷射技术获取固定读/写地址(0x28281000)

5. 实现远程代码执行(RCE)

5.1 使用Scripting.Dictionary对象

  1. 伪造一个假的Dictionary对象
  2. 使用BSTR构建伪造结构

5.2 具体步骤

  1. 读取原始Dictionary内存并保存到BSTR
  2. VBADictionary::Exists替换为kernel32!WinExec
  3. 将WinExec参数(\..\calc.exe)写入BSTR
  4. 修改内存标志使fake_array成为有效对象
  5. 触发伪造的函数调用

5.3 最终效果

成功弹出计算器,证明远程代码执行实现。

6. 防御措施

微软采取的防御:

  • 在Windows 10中默认禁用VBScript
  • 在Windows 7/8中禁止IE使用VBScript

用户应采取的措施:

  1. 及时安装安全更新
  2. 禁用不必要的组件:
    • 通过注册表或组策略禁用VBScript
  3. 提高安全意识:
    • 警惕垃圾邮件和社会工程攻击
    • 避免访问不可信网站

7. 技术细节补充

7.1 SafeArray结构

SafeArray是COM中用于安全传递数组的数据结构,包含:

  • 维度信息
  • 元素类型和大小
  • 锁定计数
  • 数据指针

7.2 VBScript引擎内存管理

VBScript使用引用计数管理对象生命周期:

  • AddRef增加引用计数
  • Release减少引用计数
  • 当计数归零时释放对象

7.3 漏洞根本原因

回调函数中创建的SafeArray未受保护,导致:

  1. 引用计数未正确增加
  2. 提前释放关键数据结构
  3. 后续访问已释放内存

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. 相关研究参考

  1. Simon Zuckerbraun的VBScript利用技术
  2. 趋势科技技术简报:
    A Proof-of-Concept Exploiting CVE-2019-1208 in Internet-Explorer
  3. 微软安全公告

10. 总结

CVE-2019-1208展示了:

  1. 回调函数中不安全操作的危险性
  2. 引用计数管理的重要性
  3. VBScript引擎的历史安全问题
  4. 从UAF到RCE的完整利用链

该漏洞再次强调了及时更新和禁用不必要组件的重要性。

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 漏洞触发代码流 初始化阶段: 触发阶段: 释放阶段: 回调返回后,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代码结构 9. 相关研究参考 Simon Zuckerbraun的VBScript利用技术 趋势科技技术简报: A Proof-of-Concept Exploiting CVE-2019-1208 in Internet-Explorer 微软安全公告 10. 总结 CVE-2019-1208展示了: 回调函数中不安全操作的危险性 引用计数管理的重要性 VBScript引擎的历史安全问题 从UAF到RCE的完整利用链 该漏洞再次强调了及时更新和禁用不必要组件的重要性。