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调用触发漏洞:

  1. 第一次调用(控制码0x1207F):

    • 分配tpInfo对象
    • 创建MDL对象(地址0x13371337)
    • 尝试锁定无效内存页触发异常
    • 异常处理中释放MDL但未置空指针
  2. 第二次调用(控制码0x120C3):

    • 尝试分配过大内存触发异常
    • 异常处理中再次释放已释放的MDL
    • 导致双重释放崩溃

4. 详细调试过程

4.1 第一次DeviceIoControl调用分析

  1. 调用路径:

    AfdDispatchDeviceControl -> AfdTransmitFile -> AfdTliGetTpInfo
    
  2. 关键操作:

    • AfdTliGetTpInfo调用ExAllocateFromNPagedLookasideList分配tpInfo对象
    • 调用IoAllocateMdl创建MDL对象
    • 调用MmProbeAndLockPages尝试锁定无效地址0x13371337
    • 触发异常后进入异常处理流程
  3. 异常处理:

    • 调用AfdReturnTpInfo释放MDL
    • 但未将tpInfo->mdl置空,留下悬挂指针

4.2 第二次DeviceIoControl调用分析

  1. 调用路径:

    AfdDispatchDeviceControl -> AfdTransmitPackets -> AfdTliGetTpInfo
    
  2. 关键操作:

    • 传入过大参数(0x0AAAAAAA)
    • 尝试分配24*0x0AAAAAAA字节内存失败
    • 触发异常后再次调用AfdReturnTpInfo
    • 对已释放的MDL进行二次释放
    • 导致系统崩溃

5. 漏洞利用思路

5.1 利用步骤

  1. 构造合适大小的MDL对象

    • 通过计算确定MDL大小为0xA0字节
    • 使用IoAllocateMdl分配该大小的对象
  2. 释放MDL并覆盖

    • 触发第一次异常释放MDL
    • 使用WorkerFactory对象(大小0xA0)覆盖释放的内存
  3. 伪造WorkerFactory结构

    • 释放WorkerFactory对象
    • 使用NtQueryEaFile伪造WorkerFactory结构
    • 重点伪造+0x38处的可写地址
  4. 实现任意地址写

    • 通过NtSetInfomationWorkerFactory写入伪造地址
    • 将shellcode地址写入HalDispatchTable+4
    • 调用NtQueryIntervalProfile执行shellcode

5.2 关键API

  1. NtCreateWorkerFactory:创建WorkerFactory对象
  2. NtSetInfomationWorkerFactory:实现任意地址写
  3. 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 漏洞关键点

  1. 异常处理路径中未正确清理资源
  2. 释放后指针未置空导致UAF
  3. 通过构造特定大小的对象实现内存覆盖

6.2 防护建议

  1. 及时安装微软安全更新
  2. 启用DEP、ASLR等缓解措施
  3. 对驱动进行严格的代码审计,特别是异常处理路径

6.3 学习价值

  1. 展示了内核UAF漏洞的典型利用方式
  2. 介绍了WorkerFactory对象在利用中的使用
  3. 演示了如何通过异常处理触发漏洞条件

7. 参考资源

  1. Pwn2Own 2014 AFD.sys Privilege Escalation Paper
  2. Exploit-DB CVE-2014-1767
  3. 看雪论坛相关分析文章
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 关键函数调用链 漏洞触发时的调用链如下: 3.2 漏洞本质 在 afd!AfdReturnTpInfo 函数中,tpInfo对象的mdl成员在释放后没有置空,造成悬挂指针。当对该指针进行二次释放时,会导致系统崩溃。 3.3 POC分析 POC通过两次DeviceIoControl调用触发漏洞: 第一次调用(控制码0x1207F): 分配tpInfo对象 创建MDL对象(地址0x13371337) 尝试锁定无效内存页触发异常 异常处理中释放MDL但未置空指针 第二次调用(控制码0x120C3): 尝试分配过大内存触发异常 异常处理中再次释放已释放的MDL 导致双重释放崩溃 4. 详细调试过程 4.1 第一次DeviceIoControl调用分析 调用路径: 关键操作: AfdTliGetTpInfo 调用 ExAllocateFromNPagedLookasideList 分配tpInfo对象 调用 IoAllocateMdl 创建MDL对象 调用 MmProbeAndLockPages 尝试锁定无效地址0x13371337 触发异常后进入异常处理流程 异常处理: 调用 AfdReturnTpInfo 释放MDL 但未将tpInfo->mdl置空,留下悬挂指针 4.2 第二次DeviceIoControl调用分析 调用路径: 关键操作: 传入过大参数(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 伪造结构布局 6. 总结与防护 6.1 漏洞关键点 异常处理路径中未正确清理资源 释放后指针未置空导致UAF 通过构造特定大小的对象实现内存覆盖 6.2 防护建议 及时安装微软安全更新 启用DEP、ASLR等缓解措施 对驱动进行严格的代码审计,特别是异常处理路径 6.3 学习价值 展示了内核UAF漏洞的典型利用方式 介绍了WorkerFactory对象在利用中的使用 演示了如何通过异常处理触发漏洞条件 7. 参考资源 Pwn2Own 2014 AFD.sys Privilege Escalation Paper Exploit-DB CVE-2014-1767 看雪论坛相关分析文章