CVE-2023-21768 内核提权漏洞分析
字数 2270 2025-08-25 22:59:02

Windows AFD 驱动提权漏洞 CVE-2023-21768 深度分析与利用指南

1. 漏洞概述

CVE-2023-21768 是 Windows Ancillary Function Driver (AFD) 中的一个内核提权漏洞,存在于 AFD 驱动程序处理用户模式输入/输出(I/O)操作的方式中。该漏洞允许攻击者向 AFD 驱动程序发送恶意输入/输出控制(IOCTL)请求,可能导致以提升的权限执行任意代码。

2. AFD 驱动基础知识

2.1 AFD 驱动简介

  • AFD (Ancillary Function Driver) 是 Windows 操作系统中的一个内核模式驱动程序
  • 作为套接字(Socket)通信的核心模块之一
  • 提供操作系统与网络协议栈之间的接口
  • 支持 WinSock (Windows 网络服务编程接口)

2.2 AFD 主要功能

  • 实现套接字的管理
  • 处理套接字之间的数据传输
  • 监控套接字上的事件
  • 报告和处理网络通信错误

2.3 AFD 架构位置

User Mode
└── WinSock (用户态网络编程接口)
    └── Kernel Mode
        └── afd.sys (AFD 驱动)
            └── 网络协议栈

3. 漏洞技术分析

3.1 漏洞位置

漏洞位于 AfdNotifyRemoveIoCompletion 函数中,该函数由 AfdNotifySock 调用。

3.2 补丁对比分析

对比 Windows 11 22H2 补丁前后版本:

  • 未打补丁版本:10.0.22621.608 (KB5017389)
  • 已打补丁版本:10.0.22621.1105 (KB5022303)

补丁主要变化是在 AfdNotifyRemoveIoCompletion 函数开头增加了对参数的检查:

if (a3) {
    ProbeForWrite(a3, 0x28u, 4u);
}

3.3 漏洞根本原因

原版代码中,*(_DWORD **)(a3 + 24) 赋值给 v20 时没有任何检查机制,导致可能写入任意内核地址。

4. 漏洞触发条件

4.1 触发路径

  1. 用户调用 DeviceIoControl 发送特定 IOCTL
  2. 触发 AfdNotifySock 函数
  3. 满足条件后调用 AfdNotifyRemoveIoCompletion

4.2 关键条件

  1. inputbufferlength 必须等于 0x30
  2. Outputbuffer 必须为 0
  3. 需要有效的 IO 完成对象句柄(通过 NtCreateIoCompletion 创建)
  4. Inputbuffer->dwCounter 必须设为 1
  5. dwLen 必须设置为 1
  6. pData2 必须指向一块可写的内存空间

5. 漏洞利用开发

5.1 关键 API 函数

  1. NtCreateIoCompletion - 创建 IO 完成端口对象
  2. NtSetIoCompletion - 向 I/O 完成端口添加完成包
  3. NtCreateFile - 创建 AFD 端点对象
  4. NtDeviceIoControlFile - 发送 IOCTL 请求

5.2 IOCTL 代码

触发漏洞的 IOCTL 代码为 0x12127 (AFD_NOTIFYSOCK_IOCTL)

5.3 利用代码结构

// 1. 创建 IO 完成对象
HANDLE hCompletion;
NtCreateIoCompletion(&hCompletion, ...);

// 2. 向完成端口添加包
NtSetIoCompletion(hCompletion, ...);

// 3. 创建 AFD 端点
HANDLE hSocket;
UNICODE_STRING ObjectFilePath;
ObjectFilePath.Buffer = L"\\Device\\Afd\\Endpoint";
NtCreateFile(&hSocket, ..., &ObjectFilePath, ...);

// 4. 构造触发数据
AFD_NOTIFY_DATA Data;
Data.dwCounter = 1;
Data.dwLen = 1;
Data.pData1 = AllocMemory();
Data.pData2 = AllocMemory();

// 5. 发送 IOCTL 触发漏洞
NtDeviceIoControlFile(hSocket, ..., AFD_NOTIFYSOCK_IOCTL, &Data, 0x30, ...);

6. Windows 11 22H2 特有利用原语 - I/O Ring

6.1 I/O Ring 简介

  • Windows 11 22H2 引入的异步 I/O 机制
  • 类似 Linux 的 io_uring
  • 使用环形提交队列(Submission Queue)

6.2 I/O Ring 利用原理

  1. 创建假缓冲区数组
  2. 查找 I/O ring 对象地址
  3. 使用任意写入覆盖 IoRing->RegBuffers
  4. 填充伪缓冲区数组
  5. 通过 BuildIoRingReadFileBuildIoRingWriteFile 进行读写操作

6.3 具体利用步骤

  1. 创建两个命名管道(一个用于输入,一个用于输出)
    CreateNamedPipe(..., PIPE_ACCESS_DUPLEX, ...);
    
  2. 打开管道的客户端句柄
    CreateFile(..., GENERIC_READ | GENERIC_WRITE, ...);
    
  3. 创建 I/O ring
    CreateIoRing(IORING_VERSION_3, ioRingFlags, ...);
    
  4. 分配假缓冲区数组
  5. 查找 I/O ring 对象地址(使用 NtQuerySystemInformation
  6. 覆盖 IoRing->RegBuffersIoRing->RegBuffersCount
  7. 填充伪缓冲区数组
  8. 排队读写操作

7. 完整利用流程

  1. 获取系统令牌

    • 通过 I/O Ring 任意地址读写
    • 查找 system 进程令牌地址
    • 查找当前进程令牌地址
  2. 替换令牌

    • 将当前进程令牌替换为 system 令牌
  3. 执行特权操作

    • 以 SYSTEM 权限执行任意命令

8. 漏洞影响范围

主要影响 Windows 11 22H2 特定版本,其他版本可能不受影响。

9. 开发环境注意事项

  1. Windows 11 开发问题

    • 可能出现 IntelliSense 错误
    • 头文件包含顺序问题
    • 预处理器定义问题
  2. 推荐环境

    • 使用 Windows 10 进行开发
    • 确保 VS2022 配置正确

10. 防御措施

  1. 及时安装微软安全更新
  2. 禁用不必要的内核驱动
  3. 实施最小权限原则
  4. 监控可疑的 AFD 驱动调用

11. 参考资源

  1. [Windows AFD 驱动官方文档]
  2. [Winbindex 补丁对比工具]
  3. [x86matthew 的利用代码]
  4. [Yarden Shafir 的 I/O Ring 研究]
  5. [Windows Notification Facility (WNF) 研究]

通过本指南,您可以全面了解 CVE-2023-21768 漏洞的原理、利用方法及防御措施。请注意,此信息仅用于安全研究和防御目的。

Windows AFD 驱动提权漏洞 CVE-2023-21768 深度分析与利用指南 1. 漏洞概述 CVE-2023-21768 是 Windows Ancillary Function Driver (AFD) 中的一个内核提权漏洞,存在于 AFD 驱动程序处理用户模式输入/输出(I/O)操作的方式中。该漏洞允许攻击者向 AFD 驱动程序发送恶意输入/输出控制(IOCTL)请求,可能导致以提升的权限执行任意代码。 2. AFD 驱动基础知识 2.1 AFD 驱动简介 AFD (Ancillary Function Driver) 是 Windows 操作系统中的一个内核模式驱动程序 作为套接字(Socket)通信的核心模块之一 提供操作系统与网络协议栈之间的接口 支持 WinSock (Windows 网络服务编程接口) 2.2 AFD 主要功能 实现套接字的管理 处理套接字之间的数据传输 监控套接字上的事件 报告和处理网络通信错误 2.3 AFD 架构位置 3. 漏洞技术分析 3.1 漏洞位置 漏洞位于 AfdNotifyRemoveIoCompletion 函数中,该函数由 AfdNotifySock 调用。 3.2 补丁对比分析 对比 Windows 11 22H2 补丁前后版本: 未打补丁版本:10.0.22621.608 (KB5017389) 已打补丁版本:10.0.22621.1105 (KB5022303) 补丁主要变化是在 AfdNotifyRemoveIoCompletion 函数开头增加了对参数的检查: 3.3 漏洞根本原因 原版代码中, *(_DWORD **)(a3 + 24) 赋值给 v20 时没有任何检查机制,导致可能写入任意内核地址。 4. 漏洞触发条件 4.1 触发路径 用户调用 DeviceIoControl 发送特定 IOCTL 触发 AfdNotifySock 函数 满足条件后调用 AfdNotifyRemoveIoCompletion 4.2 关键条件 inputbufferlength 必须等于 0x30 Outputbuffer 必须为 0 需要有效的 IO 完成对象句柄(通过 NtCreateIoCompletion 创建) Inputbuffer->dwCounter 必须设为 1 dwLen 必须设置为 1 pData2 必须指向一块可写的内存空间 5. 漏洞利用开发 5.1 关键 API 函数 NtCreateIoCompletion - 创建 IO 完成端口对象 NtSetIoCompletion - 向 I/O 完成端口添加完成包 NtCreateFile - 创建 AFD 端点对象 NtDeviceIoControlFile - 发送 IOCTL 请求 5.2 IOCTL 代码 触发漏洞的 IOCTL 代码为 0x12127 (AFD_ NOTIFYSOCK_ IOCTL) 5.3 利用代码结构 6. Windows 11 22H2 特有利用原语 - I/O Ring 6.1 I/O Ring 简介 Windows 11 22H2 引入的异步 I/O 机制 类似 Linux 的 io_ uring 使用环形提交队列(Submission Queue) 6.2 I/O Ring 利用原理 创建假缓冲区数组 查找 I/O ring 对象地址 使用任意写入覆盖 IoRing->RegBuffers 填充伪缓冲区数组 通过 BuildIoRingReadFile 和 BuildIoRingWriteFile 进行读写操作 6.3 具体利用步骤 创建两个命名管道(一个用于输入,一个用于输出) 打开管道的客户端句柄 创建 I/O ring 分配假缓冲区数组 查找 I/O ring 对象地址(使用 NtQuerySystemInformation ) 覆盖 IoRing->RegBuffers 和 IoRing->RegBuffersCount 填充伪缓冲区数组 排队读写操作 7. 完整利用流程 获取系统令牌 通过 I/O Ring 任意地址读写 查找 system 进程令牌地址 查找当前进程令牌地址 替换令牌 将当前进程令牌替换为 system 令牌 执行特权操作 以 SYSTEM 权限执行任意命令 8. 漏洞影响范围 主要影响 Windows 11 22H2 特定版本,其他版本可能不受影响。 9. 开发环境注意事项 Windows 11 开发问题 可能出现 IntelliSense 错误 头文件包含顺序问题 预处理器定义问题 推荐环境 使用 Windows 10 进行开发 确保 VS2022 配置正确 10. 防御措施 及时安装微软安全更新 禁用不必要的内核驱动 实施最小权限原则 监控可疑的 AFD 驱动调用 11. 参考资源 [ Windows AFD 驱动官方文档 ] [ Winbindex 补丁对比工具 ] [ x86matthew 的利用代码 ] [ Yarden Shafir 的 I/O Ring 研究 ] [ Windows Notification Facility (WNF) 研究 ] 通过本指南,您可以全面了解 CVE-2023-21768 漏洞的原理、利用方法及防御措施。请注意,此信息仅用于安全研究和防御目的。