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 触发路径
- 用户调用
DeviceIoControl发送特定 IOCTL - 触发
AfdNotifySock函数 - 满足条件后调用
AfdNotifyRemoveIoCompletion
4.2 关键条件
inputbufferlength必须等于 0x30Outputbuffer必须为 0- 需要有效的 IO 完成对象句柄(通过
NtCreateIoCompletion创建) Inputbuffer->dwCounter必须设为 1dwLen必须设置为 1pData2必须指向一块可写的内存空间
5. 漏洞利用开发
5.1 关键 API 函数
NtCreateIoCompletion- 创建 IO 完成端口对象NtSetIoCompletion- 向 I/O 完成端口添加完成包NtCreateFile- 创建 AFD 端点对象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 利用原理
- 创建假缓冲区数组
- 查找 I/O ring 对象地址
- 使用任意写入覆盖
IoRing->RegBuffers - 填充伪缓冲区数组
- 通过
BuildIoRingReadFile和BuildIoRingWriteFile进行读写操作
6.3 具体利用步骤
- 创建两个命名管道(一个用于输入,一个用于输出)
CreateNamedPipe(..., PIPE_ACCESS_DUPLEX, ...); - 打开管道的客户端句柄
CreateFile(..., GENERIC_READ | GENERIC_WRITE, ...); - 创建 I/O ring
CreateIoRing(IORING_VERSION_3, ioRingFlags, ...); - 分配假缓冲区数组
- 查找 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 漏洞的原理、利用方法及防御措施。请注意,此信息仅用于安全研究和防御目的。