CVE-2024-43639:微软Windows KDC代理远程代码执行漏洞深度解析

本文详细分析了微软Windows KDC代理服务中的整数溢出漏洞CVE-2024-43639,涉及Kerberos协议处理、ASN.1编码机制及内存破坏原理,攻击者可实现未授权远程代码执行。

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定义,结构如下:

1
2
3
4
5
KDC-PROXY-MESSAGE::= SEQUENCE {
    kerb-message [0] OCTET STRING,
    target-domain [1] KERB-REALM OPTIONAL,
    dclocator-hint [2] INTEGER OPTIONAL
}
  • kerb-message:包含4字节长度前缀的Kerberos消息
  • target-domain:目标域名的DNS或NetBIOS名称(请求必需,响应忽略)
  • dclocator-hint:用于定位域控制器的可选字段

消息采用DER(Distinguished Encoding Rules)编码,每个字段包含标识符八位组(类型)、长度八位组和内容八位组。标识符八位组结构如下:

1
2
3
4
Bits: 8    7    6    5    4    3    2    1
      +-----------+-----+--------------------------+
      |   Class   | P/C |       Tag Number         |
      +-----------+-----+--------------------------+
  • Class:Universal(00)、Application(01)、Context-specific(10)、Private(11)
  • P/C:原始数据类型(0)或构造类型(1)

KDC代理工作流程

  1. 接收KDC代理请求后,提取target-domain并查询DNS SRV记录(_kerberos._tcp.Default-First-Site-Name._sites.dc._msdcs.<target_domain>
  2. 解析A记录并向IP地址发送LDAP ping(无连接LDAP rootDSE搜索),验证域控制器存活状态
  3. 从请求中提取kerb-message并转发至域控制器(仅TCP传输)
  4. 接收Kerberos响应后,封装为KDC代理消息(仅含kerb-message字段),通过HTTPS 200响应返回客户端

漏洞分析

根本原因

漏洞位于kpssvc.dllmsasn1.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偏移):当前写入位置指针

漏洞触发流程

  1. 响应读取KpsSocketRecvDataIoCompletion()从socket读取4字节获取响应长度,随后读取完整响应,但未校验长度有效性
  2. 响应验证KpsCheckKerbResponse()检查响应首字节是否为0x7E0x6B(标准Kerberos消息标识),若非则跳过验证
  3. ASN.1编码KpsPackProxyResponse()初始化ASN1_KDC_PROXY_MSG结构,调用KpsDerPack()启动DER编码
  4. 缓冲区管理:MSASN.1函数(如ASN1EncCheck())通过LocalAlloc()LocalReAlloc()动态分配缓冲区,初始大小1024字节
  5. 长度计算ASN1BEREncLength()计算Length Octets所需字节数(5字节用于超大长度),加上响应长度后存入4字节无符号变量,导致整数溢出
  6. 内存破坏
    • 响应长度∈[4,294,967,291, 4,294,967,295]:溢出后分配极小缓冲区,memcpy()时堆溢出
    • 响应长度∈[4,294,966,267, 4,294,967,290]:LocalReAlloc()因溢出缩减缓冲区,导致越界写或堆溢出
    • 特殊 case:LocalReAlloc()参数为0时返回无效地址,访问时触发异常

攻击场景

远程未认证攻击者可:

  1. 诱导KDC代理将Kerberos请求转发至恶意域控制器
  2. 恶意控制器返回特制Kerberos响应(长度≥4,294,966,267字节)
  3. 触发整数溢出和内存破坏,实现任意代码执行(目标服务安全上下文)

:仅修改前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/


本文内容基于技术分析,仅供安全研究参考。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计