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用户态程序与内核驱动通信的基本流程:
- 创建设备句柄: 使用
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. 池喷射技术
// 喷射大小为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替换
- 读取系统进程的token
- 写入当前进程的EPROCESS.token
- 执行高权限命令
利用代码关键部分
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);
}
防护措施
缓解措施
- 禁用Microsoft Streaming Service服务
- 应用微软发布的安全更新
- 启用驱动签名验证
检测方法
监控以下行为:
- 异常的
DeviceIoControl调用,特别是IOCTL_FRAMESERVER_PUBLISH_RX - 异常的池分配模式(大量0x80大小分配)
NtReadVirtualMemory/NtWriteVirtualMemory对内核地址的访问
参考资源
- Microsoft官方安全公告
- CW Research Lab分析报告
- Windows内核编程相关文档
总结
CVE-2023-36802是一个典型的内核类型混淆漏洞,通过精心构造的IOCTL请求触发,结合池喷射和内存操作技术实现权限提升。理解此漏洞有助于分析类似的内核驱动漏洞模式,并提高系统防护能力。