内容提要
Akamai 研究人员已开发出用于即时根本原因分析的新型 AI 能力。该工具名为 PatchDiff-AI,是一个监督式多智能体系统。在本篇博文中,我们将使用该工具对 CVE-2025-60719 进行深度分析。该漏洞影响几乎所有 Windows 版本。
漏洞:Windows Ancillary Function Driver (afd.sys) for Winsock 中存在一个由竞争条件导致的释放后重用漏洞
影响:本地权限提升:低权限攻击者可操纵内核内存并获得系统权限
根本原因:驱动程序未能防止套接字端点在其他操作(如传输、获取信息或连接)正在主动解引用其关联对象时被解绑(释放)
修复:Microsoft 增加了同步屏障机制 (AfdPreventUnbind/AfdReallowUnbind),在关键操作期间显式锁定端点状态
请继续阅读,了解如何利用 PatchDiff-AI 工具快速分析高危 Patch Tuesday 漏洞的根本原因,并帮助安全团队更好地检测并抵御一日漏洞。
漏洞
CVE-2025-60719 暴露了 Windows 内核网络栈中的一个严重缺陷,该缺陷位于 Winsock API 的核心组件 afd.sys 中。成功利用该漏洞可使低权限进程获取系统权限。然而,我们在 AppContainer 进程中测试了我们的漏洞利用,但由于权限不足而失败。
该漏洞影响众多 Windows 产品,包括以下所有 Windows 版本:
Windows Server——2008 SP2 (x86/x64)、2008 R2 SP1、2012、2012 R2、2016、2019、2022、2022 23H2、2025
Windows 11——23H2、24H2、25H2
Windows 10——版本 1607、1809、21H2、22H2
其他已终止支持的版本
如此广泛的受影响版本范围显著扩大了攻击面。
根本原因分析
通过 PatchDiff-AI,我们可以快速分析厂商公告中用于修复漏洞的安全补丁。解析工具结果显示,相关代码变更涉及 AfdSocketTransfer*、AfdGetInformation、AfdBind 和 AfdConnect. 方法。
通过深入分析,可发现该漏洞的根本原因在于 AFD 端点结构(名为 AFD_ENDPOINT)的生命周期管理问题,以及在获取对象指针与使用该指针之间缺乏原子性(并发操作同步)。
在这些变更之间
PatchDiff-AI 工具突出显示了一个与漏洞核心逻辑直接相关的组件,即辅助功能驱动程序 (afd.sys),该组件可实现 Windows 的核心传输层网络支持。它提供 Winsock 接口、管理网络套接字,并处理其他 I/O 相关功能。
该工具分析基于已修复版本 10.0.26100.7171(作为安全更新 KB5068861 的一部分),并针对存在漏洞的版本 10.0.26100.6899(作为安全更新 KB5066835 的一部分)进行了测试。
共有五个被修改的函数,且全部被该工具归类为安全相关。
通过分析 AfdGetInformation 函数,我们可以识别出现在通过阻止解绑操作来保护的代码块,从而防止套接字被释放(图 1)。既然我们知道此变更涉及套接字生命周期并干预其状态,我们可以合理地推断这与 UAF(释放后重用)漏洞相关。
辅助功能驱动程序—— 快速入门
关于辅助功能驱动程序 (afd.sys) 的工作原理及使用方法,的确有一些全面的文章可供参考。简而言之,这是一个负责提供 Winsock API 服务的 Windows 组件。它使得低权限进程能够使用 TCP/IP 及其他通信协议的网络栈。
在图 2 中,我们发现许多通过输入/输出控制 (IOCTL) 调用 afd.sys 的引用二进制文件。通过分析,我们可以理解哪些调用与哪些接口相关,从而将用户模式应用程序调用与内核模块逻辑激活连接起来。这将有助于我们后续直接调用驱动程序并调试其行为。
深入逻辑分析
该漏洞是一个典型的竞争条件,会导致 UAF(释放后重用)场景。它会影响多个分发例程,包括 AfdSocketTransfer*、AfdGetInformation、AfdBind 和 AfdConnect。
核心问题出现在:当用户模式应用程序在发出特定 IOCTL 请求的同时,另一个线程正在关闭套接字。在未修补的版本中,驱动程序获取了指向端点、文件对象或设备对象的指针,并在未确保底层内存不会被并发关闭操作释放的情况下使用了这些指针。这就创造了一个时间窗口,使得内核在无效内存上操作,从而允许本地攻击者破坏内核内存或获取提升的权限。
当进程使用已绑定(监听)套接字的句柄调用 afd!AfdGetInformation 函数以获取特定信息类时,该过程将涉及检查一些必要条件,例如套接字类型及其协议层。然后,如果跟踪调用流程,我们会发现底层函数有一个针对调用者可用的不同操作的 switch-case 语句。
易受攻击的代码块位于 AFD_MAX_PATH_SEND_SIZE 分支内(图 3)。换句话说,触发该漏洞路径需要调用者在调用接口时提供正确的值,并且套接字必须处于已连接状态。
class AFD_INFORMATION_CLASS(IntEnum):
AFD_INLINE_MODE = 1 # s: BOOLEAN
AFD_NONBLOCKING_MODE = 2 # s: BOOLEAN
AFD_MAX_SEND_SIZE = 3 # q: ULONG
AFD_SENDS_PENDING = 4 # q: ULONG
AFD_MAX_PATH_SEND_SIZE = 5 # q: ULONG
AFD_RECEIVE_WINDOW_SIZE = 6 # q; s: ULONG
AFD_SEND_WINDOW_SIZE = 7 # q; s: ULONG
AFD_CONNECT_TIME = 8 # q: ULONG (seconds)
AFD_CIRCULAR_QUEUEING = 9 # s: BOOLEAN
AFD_GROUP_ID_AND_TYPE = 10 # q: AFD_GROUP_INFO
AFD_REPORT_PORT_UNREACHABLE = 11 # s: BOOLEAN
AFD_REPORT_NETWORK_UNREACHABLE = 12 # s: BOOLEAN
AFD_DELIVERY_STATUS = 14 # q: SIO_DELIVERY_STATUS
AFD_CANCEL_TL = 15 # s: void
在图 4 中,您可以看到漏洞代码(修复前)与已修补代码(修复后)的反编译版本对比。
竞争条件
afd.sys 驱动程序负责维护端点的生命周期,且该端点对象可由多线程并发访问。在图 5 中,m_Endpoint->State 表示套接字的状态。
为了保持套接字处于有效状态,内核模块必须极其谨慎地处理它。在这种情况下,存在一个时间窗口,其间另一个线程可能更改状态,并最终通过 unbind 控制命令完全释放端点。
本地攻击者可以利用这一点,通过在两个线程之间制造“竞争条件”来实现攻击:
线程 A:反复发送一个易受攻击的 IOCTL(例如:IOCTL_AFD_GET_INFIT)
线程 B:反复绑定与解绑套接字句柄
若线程 B 在线程 A 获取指针之后、使用该指针之前赢得竞争条件,线程 A 将取消引用已释放的内存。
摧毁防线
借助 PatchDiff-AI 报告及其他资源,我们可以了解如何利用 afd!AfdGetInformation 函数,并通过传递正确的参数调用它来赢得借助条件(见图 6)。
图 6:触发该漏洞的概念验证代码
在图7中,您可以看到从调用 AfdGetInformation 到引发页面错误异常的崩溃调用堆栈。
攻击媒介
这是一个仅影响本地系统的本地权限提升漏洞。攻击者若能以低权限本地进程执行任意代码,便可利用该竞争条件漏洞来获取更高权限。
尽管 PatchDiff-AI 工具并非专为开发漏洞利用程序而设计,但它有助于理解相关的漏洞利用流程。
初始化:攻击者通过调用 NtCreateFile() 打开一个有效的 AfdSocket。
堆布局整理/堆喷洒:虽然对触发崩溃并非绝对必要,但为实现可靠的权限提升利用,通常需要进行堆喷洒,以便将已释放的 AFD_ENDPOINT 结构替换为由攻击者控制的伪造结构。
触发漏洞:攻击者创建两个线程。线程 1 循环调用 NtDeviceIoControlFile 并传入易受攻击的 IOCTL(例如:IOCTL_AFD_GET_INFIT)。线程 2 循环执行连续的 IOCTL_AFD_BIND 和 IOCTL_AFD_UNBIND。
执行:当竞态条件达成时,内核会在攻击者伪造的对象上执行调用(例如 IoGetRelatedDeviceObject),从而导致内核内存被篡改。
如何保护您的系统
应用补丁:唯一有效的防护措施是安装相关的 Windows 安全更新。该补丁通过严格强化 afd.sys 中的解绑屏障机制来修复漏洞。
抵御:使用 SIGMA 或 YARA 规则集来识别与 AFD 的交互行为(可能预示着漏洞利用尝试),有助于降低相关威胁。在大多数情况下,追踪向 afd 驱动发起 IOCTL 调用的进程,并检测其是否通过重复调用来实施内核池内存喷洒,通常已足以识别此类攻击行为(见图 8)。
检测:由于 AFD 端点(套接字)最终通过 Windows I/O 子系统以文件句柄的形式暴露,我们可以拦截 IRP 调用并监控可疑活动,特别是针对已断开连接的端点的操作。
import "pe"
rule CVE_2025_60719 {
meta:
description = "Detects exploits for CVE-2025-60719 targeting afd.sys"
author = "Maor Dahan"
date = "2025-12-01"
reference = "https://github.com/akamai/CVE-2025-60719-AFD.SYS"
strings:
// Core Indicators - The specific device name is strong indicator
$str_device = "\\Device\\Afd\\Endpoint" ascii wide
$str_device_double = "\\\\Device\\\\Afd\\\\Endpoint" ascii
// Specific IOCTL constants used in the exploit
// 0x12003 = IOCTL_AFD_BIND
$ioctl_str_bind = "0x12003" ascii
$ioctl_hex_bind = { 03 20 01 00 }
// 0x12113 = IOCTL_AFD_UNBIND
$ioctl_str_unbind = "0x12113" ascii
$ioctl_hex_unbind = { 13 21 01 00 }
// 0x1207B = IOCTL_AFD_GET_INFORMATION
$ioctl_str_info = "0x1207B" ascii
$ioctl_hex_info = { 7B 20 01 00 }
condition:
($str_device or $str_device_double) and
(
(
pe.is_pe and
pe.imports("ntdll.dll", "NtDeviceIoControlFile") and
all of ($ioctl_hex_*)
)
or
(
not pe.is_pe and
(
(
all of ($ioctl_str_*) or
3 of ($ioctl_*)
)
)
)
)
}
结语
通过使用 PatchDiff-AI,您可以自动化关联二进制代码变更与安全逻辑,快速精准定位问题根源,避免迷失在无关代码修改的干扰中。这使得安全团队能够迅速采取行动,防范“一日漏洞”的利用。
CVE-2025-60719 案例研究重点揭示了内核驱动程序中补丁管理的复杂性,同时展示了 PatchDiff-AI 工具的分析如何为多维度应用提供深度详尽的洞察。
标签