CVE-2024-43639:微软Windows KDC代理远程代码执行漏洞
日期:2025年3月4日 | 来源:Trend Micro研究团队
漏洞概述
微软Windows KDC代理服务(Key Distribution Center Proxy)存在整数溢出漏洞(CVE-2024-43639)。该漏洞源于对Kerberos响应长度缺少校验,远程未认证攻击者可诱导KDC代理将Kerberos请求转发至受控服务器,并返回特制Kerberos响应,最终在目标服务安全上下文中执行任意代码。
技术背景
Kerberos协议与KDC代理
Windows操作系统默认集成多种认证协议(Kerberos、NTLM、TLS/SSL等),其中Kerberos用于Active Directory域内认证。Kerberos基于票据机制,通过密钥分发中心(KDC)实现安全身份验证。客户端与服务通过端口88(UDP/TCP)与KDC交换消息,TCP传输时消息前附加4字节网络字节序的长度前缀。
为支持远程工作负载(如RDP Gateway、DirectAccess),微软引入KDC代理协议(KKDCP),通过HTTPS代理Kerberos流量。KDC代理作为HTTP服务器,接收客户端以HTTPS POST发送的KDC代理消息(请求URI为/KdcProxy
),消息体采用ASN.1(Abstract Syntax Notation One)编码。
KDC代理消息结构
KDC代理消息使用ASN.1定义,结构如下:
|
|
- kerb-message:包含4字节长度前缀的Kerberos消息
- target-domain:目标域名的DNS或NetBIOS名称(请求必需,响应忽略)
- dclocator-hint:用于定位域控制器的可选字段
消息采用DER(Distinguished Encoding Rules)编码,每个字段包含标识符八位组(类型)、长度八位组和内容八位组。标识符八位组结构如下:
|
|
- Class:Universal(00)、Application(01)、Context-specific(10)、Private(11)
- P/C:原始数据类型(0)或构造类型(1)
KDC代理工作流程
- 接收KDC代理请求后,提取
target-domain
并查询DNS SRV记录(_kerberos._tcp.Default-First-Site-Name._sites.dc._msdcs.<target_domain>
) - 解析A记录并向IP地址发送LDAP ping(无连接LDAP rootDSE搜索),验证域控制器存活状态
- 从请求中提取
kerb-message
并转发至域控制器(仅TCP传输) - 接收Kerberos响应后,封装为KDC代理消息(仅含
kerb-message
字段),通过HTTPS 200响应返回客户端
漏洞分析
根本原因
漏洞位于kpssvc.dll
和msasn1.dll
的交互过程中。KDC代理读取域控制器返回的Kerberos响应时,未校验响应长度,导致整数溢出和内存破坏。
关键数据结构
-
_KPS_IO
结构(0x120字节):recvbuf
(0x100偏移):指向socket读取缓冲区的指针bytesread
(0x108偏移):已读取字节数bytestoread
(0x10C偏移):待读取字节数
-
ASN1_KDC_PROXY_MSG
结构(0x28字节):len
(0x8偏移):Kerberos响应长度buf
(0x10偏移):指向Kerberos响应缓冲区的指针
-
ASN1_encoder
结构(0x50字节):buf
(0x10偏移):指向DER编码数据缓冲区的指针len
(0x18偏移):DER编码数据长度current
(0x28偏移):当前写入位置指针
漏洞触发流程
- 响应读取:
KpsSocketRecvDataIoCompletion()
从socket读取4字节获取响应长度,随后读取完整响应,但未校验长度有效性 - 响应验证:
KpsCheckKerbResponse()
检查响应首字节是否为0x7E
或0x6B
(标准Kerberos消息标识),若非则跳过验证 - ASN.1编码:
KpsPackProxyResponse()
初始化ASN1_KDC_PROXY_MSG
结构,调用KpsDerPack()
启动DER编码 - 缓冲区管理:MSASN.1函数(如
ASN1EncCheck()
)通过LocalAlloc()
和LocalReAlloc()
动态分配缓冲区,初始大小1024字节 - 长度计算:
ASN1BEREncLength()
计算Length Octets所需字节数(5字节用于超大长度),加上响应长度后存入4字节无符号变量,导致整数溢出 - 内存破坏:
- 响应长度∈[4,294,967,291, 4,294,967,295]:溢出后分配极小缓冲区,
memcpy()
时堆溢出 - 响应长度∈[4,294,966,267, 4,294,967,290]:
LocalReAlloc()
因溢出缩减缓冲区,导致越界写或堆溢出 - 特殊 case:
LocalReAlloc()
参数为0时返回无效地址,访问时触发异常
- 响应长度∈[4,294,967,291, 4,294,967,295]:溢出后分配极小缓冲区,
攻击场景
远程未认证攻击者可:
- 诱导KDC代理将Kerberos请求转发至恶意域控制器
- 恶意控制器返回特制Kerberos响应(长度≥4,294,966,267字节)
- 触发整数溢出和内存破坏,实现任意代码执行(目标服务安全上下文)
注:仅修改前4字节长度前缀无效,实际响应长度必须匹配前缀值。
检测指南
检测设备需监控UDP 389和TCP 88端口流量:
- Kerberos响应通过TCP 88传输时,前4字节为网络字节序的长度前缀
- 无需完整解析响应,仅需提取长度前缀并隔离TCP流中的响应
- 响应长度≥0x80000000(2,147,483,648字节)时应视为可疑(根据Kerberos V5 RFC 7.2.2,最高位必须为0,最大合法长度为0x7FFFFFFF)
补丁与缓解
微软于2024年11月发布补丁,在KpsSocketRecvDataIoCompletion()
中添加长度校验。以下系统受影响:
- 仅配置为KDC代理服务器的系统(域控制器不受影响)
- 需启用KDC代理服务(KDCSVC/KPSSVC) 未配置KDC代理的环境不可利用。建议立即修补所有KPSSVC实例。
致谢
感谢Trend Micro研究团队的Simon Humbert和Guy Lederfein提供完整分析。更多研究服务详见http://go.trendmicro.com/tis/。
本文内容基于技术分析,仅供安全研究参考。