Windows VBScript引擎远程执行代码漏洞 之CVE-2018-8373分析与复现
字数 1302
更新时间 2025-08-18 11:37:45

CVE-2018-8373: VBScript引擎远程执行代码漏洞分析与复现指南

一、漏洞概述

漏洞ID: CVE-2018-8373
漏洞名称: Microsoft VBScript引擎远程执行代码漏洞
漏洞类型: 远程代码执行 (Use-After-Free)
威胁等级: 高危
披露时间: 2018年8月14日

受影响系统版本

  • IE9: Windows Server 2008 (32/64位)
  • IE10: Windows Server 2012
  • IE11: 大部分版本

二、漏洞原理分析

1. 漏洞背景

VBScript引擎在处理内存中对象时存在Use-After-Free漏洞,攻击者可通过精心构造的脚本在当前用户上下文中执行任意代码。成功利用此漏洞的攻击者可获得与当前用户相同的权限。

2. 技术细节

漏洞核心在于VBScript引擎对数组对象的重置操作(ReDim)处理不当,导致内存释放后仍被引用。

关键流程:

  1. 创建包含数组的类对象
  2. 初始化时分配数组内存
  3. 通过属性访问触发数组重置
  4. 原始数组内存被释放但引用仍保留
  5. 后续操作使用已释放的内存导致UAF

3. 漏洞触发机制

Class MyClass
    Private array()
    
    Private Sub Class_Initialize()
        ReDim array(2)  ' 初始分配数组
    End Sub
    
    Public Default Property Get P()
        ReDim Preserve array(1)  ' 重置数组,释放原内存
        Set P = Me
    End Property
End Class

Set cls = New MyClass
cls.array(2) = cls  ' 触发UAF

三、漏洞复现环境

1. 测试环境

  • 操作系统: Windows 7 (32/64位)
  • IE版本: IE10
  • 调试工具: Windbg

2. 所需资源

四、漏洞调试分析

1. 关键函数调用栈

vbscript!CScriptRunTime::RunNoEH
vbscript!VBScriptClass::Create
vbscript!VBScriptClass::InitializeClass
vbscript!CScriptEntryPoint::Call

2. 内存操作关键点

  1. 数组创建:

    • vbscript!MakeArray创建初始数组
    • 保存数组元素地址到栈(如0x12ae6ff0)
  2. 数组重置:

    • RedimPreserveArray调用SafeArrayRedim
    • 原pvData(0x12ae6fd0)被释放
    • 新pvData(0x0818afe0)被分配
  3. UAF触发:

    • 栈上保留的旧地址(0x12ae6ff0)被后续使用
    • 访问已释放内存导致崩溃

3. EXP利用技术

  1. 内存布局操控:

    • 使用两个数组(array1和array2)
    • 释放array1.pvData后让array2重用该内存
    • 修改array2的SAFEARRAYBOUND结构,将长度设为0x0FFFFFFF
  2. 任意内存读写:

    • 通过混淆array(index_vul)(index_a+n,0)和array(index_b)(0,n)
    • 将variant类型在字符串和长整型间转换
    • 获取可读写内存区域(util_mem)
  3. Shellcode执行:

    • 伪造CONTEXT结构
    • 通过ROP链执行最终payload
    • 典型利用结果: 弹出计算器(calc.exe)

五、防护措施

1. 官方补丁

微软已于2018年8月14日发布安全更新,建议用户及时安装。

2. 缓解措施

  • 禁用VBScript执行
  • 启用增强的IE保护模式
  • 使用EMET等缓解工具

六、参考资源

  1. TrendMicro分析报告
  2. 微软安全公告
  3. 四维创智漏洞分析报告

附录:关键数据结构

SAFEARRAY结构

typedef struct tagSAFEARRAY {
    USHORT cDims;      // 数组维度
    USHORT fFeatures;  // 特性标志
    ULONG cbElements;  // 元素大小
    ULONG cLocks;      // 锁计数
    PVOID pvData;      // 数据指针
    SAFEARRAYBOUND rgsabound[1]; // 维度信息
} SAFEARRAY;

SAFEARRAYBOUND结构

typedef struct tagSAFEARRAYBOUND {
    ULONG cElements;  // 元素数量
    LONG lLbound;     // 下界
} SAFEARRAYBOUND;
相似文章
相似文章
 全屏