cve_study-CVE-2014-1767分析
字数 1662 2025-08-26 22:11:34
CVE-2014-1767 (AFD.sys) 漏洞分析与利用教学文档
1. 漏洞概述
CVE-2014-1767是Windows内核驱动AFD.sys中的一个经典UAF(Use-After-Free)漏洞,影响Windows 7 x86 SP1系统。该漏洞源于异常处理过程中对MDL对象的双重释放,导致可利用的悬挂指针。
2. 环境准备
- 操作系统:Windows 7 x86 SP1
- 调试工具:WinDbg
- 漏洞分析工具:IDA Pro
3. 漏洞成因分析
3.1 关键函数调用链
漏洞触发时的调用链如下:
AfdDispatchDeviceControl -> AfdTransmitPackets -> AfdTliGetTpInfo -> AfdReturnTpInfo -> IoFreeMdl
3.2 漏洞本质
在afd!AfdReturnTpInfo函数中,tpInfo对象的mdl成员在释放后没有置空,造成悬挂指针。当对该指针进行二次释放时,会导致系统崩溃。
3.3 POC分析
POC通过两次DeviceIoControl调用触发漏洞:
-
第一次调用(控制码0x1207F):
- 分配tpInfo对象
- 创建MDL对象(地址0x13371337)
- 尝试锁定无效内存页触发异常
- 异常处理中释放MDL但未置空指针
-
第二次调用(控制码0x120C3):
- 尝试分配过大内存触发异常
- 异常处理中再次释放已释放的MDL
- 导致双重释放崩溃
4. 详细调试过程
4.1 第一次DeviceIoControl调用分析
-
调用路径:
AfdDispatchDeviceControl -> AfdTransmitFile -> AfdTliGetTpInfo -
关键操作:
AfdTliGetTpInfo调用ExAllocateFromNPagedLookasideList分配tpInfo对象- 调用
IoAllocateMdl创建MDL对象 - 调用
MmProbeAndLockPages尝试锁定无效地址0x13371337 - 触发异常后进入异常处理流程
-
异常处理:
- 调用
AfdReturnTpInfo释放MDL - 但未将tpInfo->mdl置空,留下悬挂指针
- 调用
4.2 第二次DeviceIoControl调用分析
-
调用路径:
AfdDispatchDeviceControl -> AfdTransmitPackets -> AfdTliGetTpInfo -
关键操作:
- 传入过大参数(0x0AAAAAAA)
- 尝试分配24*0x0AAAAAAA字节内存失败
- 触发异常后再次调用
AfdReturnTpInfo - 对已释放的MDL进行二次释放
- 导致系统崩溃
5. 漏洞利用思路
5.1 利用步骤
-
构造合适大小的MDL对象:
- 通过计算确定MDL大小为0xA0字节
- 使用
IoAllocateMdl分配该大小的对象
-
释放MDL并覆盖:
- 触发第一次异常释放MDL
- 使用WorkerFactory对象(大小0xA0)覆盖释放的内存
-
伪造WorkerFactory结构:
- 释放WorkerFactory对象
- 使用
NtQueryEaFile伪造WorkerFactory结构 - 重点伪造+0x38处的可写地址
-
实现任意地址写:
- 通过
NtSetInfomationWorkerFactory写入伪造地址 - 将shellcode地址写入HalDispatchTable+4
- 调用
NtQueryIntervalProfile执行shellcode
- 通过
5.2 关键API
NtCreateWorkerFactory:创建WorkerFactory对象NtSetInfomationWorkerFactory:实现任意地址写NtQueryEaFile:伪造释放后的内存结构
5.3 伪造结构布局
pushad
mov eax, AllocAddr ; 起始地址
mov dword ptr[eax + 4], 0xa8
mov dword ptr[eax + 10h], 2
mov dword ptr[eax + 14h], 1
mov dword ptr[eax + 1ch], 80016h
mov dword ptr[eax + 28h], 20000028h
mov ebx, uHalDispatchTable
sub ebx, 18h
mov dword ptr[eax + 38h], ebx ; 可写地址
popad
6. 总结与防护
6.1 漏洞关键点
- 异常处理路径中未正确清理资源
- 释放后指针未置空导致UAF
- 通过构造特定大小的对象实现内存覆盖
6.2 防护建议
- 及时安装微软安全更新
- 启用DEP、ASLR等缓解措施
- 对驱动进行严格的代码审计,特别是异常处理路径
6.3 学习价值
- 展示了内核UAF漏洞的典型利用方式
- 介绍了WorkerFactory对象在利用中的使用
- 演示了如何通过异常处理触发漏洞条件