CVE-2023-36802漏洞和exp分析
字数 1801 2025-08-24 07:48:33

CVE-2023-36802漏洞分析与利用技术详解

漏洞概述

CVE-2023-36802是Microsoft Streaming Service Proxy服务中的一个权限提升漏洞,存在于mskssrv.sys内核驱动程序中。该漏洞源于类型混淆问题,允许攻击者通过精心构造的IOCTL请求实现内核内存操作,最终导致权限提升。

漏洞背景

受影响组件

  • 服务名称: Microsoft Streaming Service Proxy
  • 驱动文件: mskssrv.sys
  • 组件类型: 内核模式驱动程序

漏洞类型

  • 类型混淆漏洞: 驱动程序错误地将FSContextReg对象当作FSStreamReg对象处理
  • 后果: 导致越界内存访问(OOB)和任意地址写

技术背景知识

驱动程序通信机制

Windows用户态程序与内核驱动通信的基本流程:

  1. 创建设备句柄: 使用CreateFile打开设备
  2. 发送控制命令: 使用DeviceIoControl发送IOCTL请求
  3. 内核处理流程:
    • I/O管理器创建IRP
    • 设置IRP_MJ_DEVICE_CONTROL函数代码
    • 调用驱动程序的DispatchDeviceControl例程

关键数据结构

mskssrv.sys驱动维护两种主要对象:

  1. FSContextReg对象: 上下文注册对象
  2. FSStreamReg对象: 流注册对象

漏洞详细分析

漏洞触发路径

  1. 用户态调用DeviceIoControl发送IOCTL_FRAMESERVER_PUBLISH_RX
  2. 驱动处理流程:
    • FSRendezvousServer::PublishRx()
    • FSRendezvousServer::FindObject()
    • FSStreamReg::PublishRx()

根本原因

FSRendezvousServer::FindObject函数虽然检查了FSStreamReg对象是否存在,但在调用FSStreamReg::PublishRx时没有验证传入的对象类型。攻击者可以传入FSContextReg对象而非预期的FSStreamReg对象,导致类型混淆。

内存布局问题

  • 正常情况: FSStreamReg::PublishRx处理0x1d8字节的FSStreamReg对象
  • 漏洞利用: 传入较小的FSContextReg对象,导致越界操作

漏洞利用技术

利用步骤概述

  1. 池喷射(Spray the pool): 分配大量0x80大小的对象
  2. 地址泄露: 使用NtQuerySystemInformation获取关键内核地址
  3. PreviousMode修改: 通过ObfDereferenceObject将KTHREAD.PreviousMode置0
  4. 权限提升: 读写内核内存替换进程token

关键利用技术详解

1. 池喷射技术

// 喷射大小为0x80的对象
NtFsControlFile(..., FSCTL_CREATE_OBJECT, ...);

2. 地址泄露

// 获取KTHREAD地址(PreviousMode字段)
// 获取EPROCESS地址(当前进程和系统进程)
NtQuerySystemInformation(SystemHandleInformation, ...);

3. PreviousMode修改

通过类型混淆漏洞,使FSStreamReg::PublishRx处理错误的相邻对象,调用ObfDereferenceObject递减错误地址的值(将PreviousMode从1改为0)。

4. 内核内存读写

PreviousMode=0后,可使用以下函数直接读写内核内存:

NtReadVirtualMemory(hProcess, src, &buffer, size, &bytesRead);
NtWriteVirtualMemory(hProcess, dst, &buffer, size, &bytesWritten);

5. Token替换

  1. 读取系统进程的token
  2. 写入当前进程的EPROCESS.token
  3. 执行高权限命令

利用代码关键部分

void thread_sep() {
    printf("\t[+] Loop Thread Start..\n");
    ULONG_PTR InBuf[0x20] = {0};
    InBuf[4] = 0x100000001;
    DeviceIoControl(cReg, IOCTL_PUBLISH_RX, InBuf, 0x100, NULL, 0, NULL, NULL);
    printf("\t\t[+] Loop thread loop finished..\n");
    SetEvent(hEvent);
}

防护措施

缓解措施

  1. 禁用Microsoft Streaming Service服务
  2. 应用微软发布的安全更新
  3. 启用驱动签名验证

检测方法

监控以下行为:

  • 异常的DeviceIoControl调用,特别是IOCTL_FRAMESERVER_PUBLISH_RX
  • 异常的池分配模式(大量0x80大小分配)
  • NtReadVirtualMemory/NtWriteVirtualMemory对内核地址的访问

参考资源

  1. Microsoft官方安全公告
  2. CW Research Lab分析报告
  3. Windows内核编程相关文档

总结

CVE-2023-36802是一个典型的内核类型混淆漏洞,通过精心构造的IOCTL请求触发,结合池喷射和内存操作技术实现权限提升。理解此漏洞有助于分析类似的内核驱动漏洞模式,并提高系统防护能力。

CVE-2023-36802漏洞分析与利用技术详解 漏洞概述 CVE-2023-36802是Microsoft Streaming Service Proxy服务中的一个权限提升漏洞,存在于mskssrv.sys内核驱动程序中。该漏洞源于类型混淆问题,允许攻击者通过精心构造的IOCTL请求实现内核内存操作,最终导致权限提升。 漏洞背景 受影响组件 服务名称 : Microsoft Streaming Service Proxy 驱动文件 : mskssrv.sys 组件类型 : 内核模式驱动程序 漏洞类型 类型混淆漏洞 : 驱动程序错误地将FSContextReg对象当作FSStreamReg对象处理 后果 : 导致越界内存访问(OOB)和任意地址写 技术背景知识 驱动程序通信机制 Windows用户态程序与内核驱动通信的基本流程: 创建设备句柄 : 使用 CreateFile 打开设备 发送控制命令 : 使用 DeviceIoControl 发送IOCTL请求 内核处理流程 : I/O管理器创建IRP 设置IRP_ MJ_ DEVICE_ CONTROL函数代码 调用驱动程序的DispatchDeviceControl例程 关键数据结构 mskssrv.sys驱动维护两种主要对象: FSContextReg对象 : 上下文注册对象 FSStreamReg对象 : 流注册对象 漏洞详细分析 漏洞触发路径 用户态调用 DeviceIoControl 发送 IOCTL_FRAMESERVER_PUBLISH_RX 驱动处理流程: FSRendezvousServer::PublishRx() FSRendezvousServer::FindObject() FSStreamReg::PublishRx() 根本原因 FSRendezvousServer::FindObject 函数虽然检查了FSStreamReg对象是否存在,但在调用 FSStreamReg::PublishRx 时没有验证传入的对象类型。攻击者可以传入FSContextReg对象而非预期的FSStreamReg对象,导致类型混淆。 内存布局问题 正常情况 : FSStreamReg::PublishRx 处理0x1d8字节的FSStreamReg对象 漏洞利用 : 传入较小的FSContextReg对象,导致越界操作 漏洞利用技术 利用步骤概述 池喷射(Spray the pool) : 分配大量0x80大小的对象 地址泄露 : 使用 NtQuerySystemInformation 获取关键内核地址 PreviousMode修改 : 通过ObfDereferenceObject将KTHREAD.PreviousMode置0 权限提升 : 读写内核内存替换进程token 关键利用技术详解 1. 池喷射技术 2. 地址泄露 3. PreviousMode修改 通过类型混淆漏洞,使 FSStreamReg::PublishRx 处理错误的相邻对象,调用 ObfDereferenceObject 递减错误地址的值(将PreviousMode从1改为0)。 4. 内核内存读写 PreviousMode=0后,可使用以下函数直接读写内核内存: 5. Token替换 读取系统进程的token 写入当前进程的EPROCESS.token 执行高权限命令 利用代码关键部分 防护措施 缓解措施 禁用Microsoft Streaming Service服务 应用微软发布的安全更新 启用驱动签名验证 检测方法 监控以下行为: 异常的 DeviceIoControl 调用,特别是 IOCTL_FRAMESERVER_PUBLISH_RX 异常的池分配模式(大量0x80大小分配) NtReadVirtualMemory / NtWriteVirtualMemory 对内核地址的访问 参考资源 Microsoft官方安全公告 CW Research Lab分析报告 Windows内核编程相关文档 总结 CVE-2023-36802是一个典型的内核类型混淆漏洞,通过精心构造的IOCTL请求触发,结合池喷射和内存操作技术实现权限提升。理解此漏洞有助于分析类似的内核驱动漏洞模式,并提高系统防护能力。