CVE-2024-38063:通过IPv6远程内核漏洞利用分析

本文深入分析了Windows内核IPv6协议栈中的高危漏洞CVE-2024-38063,详细解析了从补丁对比、漏洞触发条件到利用链构建的全过程,揭示了通过畸形IPv6选项头实现内核内存破坏的技术细节。

CVE-2024-38063 - 通过IPv6远程利用Windows内核漏洞

漏洞背景

在2024年8月13日发布的Windows补丁中,微软修复了TCP/IP驱动(tcpip.sys)中一个CVSS评分高达9.8的严重漏洞。该漏洞存在于IPv6选项处理函数Ipv6pProcessOptions()中,攻击者可通过特制IPv6数据包实现远程内核利用。

补丁分析

通过Bindiff对比发现,整个驱动中仅有一个函数被修改:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
// 补丁前
Ipv6pProcessOptions() {
    if (Feature_2660322619__private_IsEnabledDeviceUsage_3()) {
        IppSendErrorList(packet_list, always_send_icmp);
    }
}

// 补丁后 
Ipv6pProcessOptions() {
    if (Feature_2660322619__private_IsEnabledDeviceUsage_3()) {
        IppSendError(packet_list->FirstEntry, always_send_icmp); // 关键修改
    }
}

补丁将IppSendErrorList()调用替换为IppSendError(),表明漏洞与链表处理相关。Feature_2660322619函数是微软用于紧急回滚补丁的机制。

漏洞触发条件

  1. 构造畸形IPv6包:使用Scapy构建包含非法选项的IPv6包:
1
2
3
def build_malicious_option():
    return Ether()/IPv6(dst=target, nh=60)/\
           struct.pack('BBBB', 59, 0, 0x81, 0) + b'1337'
  1. 触发链表处理:当系统高负载时,内核会将多个IPv6包合并处理:
1
2
3
4
5
// 漏洞代码路径
Ipv6pProcessOptions()
    IppSendErrorList(packet_list)  // 遍历链表
        IppSendError(packet)       // 处理每个包时
            packet->packet_size = 0 // 关键状态破坏

漏洞利用链

  1. 内存破坏阶段:通过IPv6分片重组超时处理函数Ipv6pReassemblyTimeout()触发溢出:
1
2
3
4
5
6
7
; 漏洞汇编代码
movzx   edx, word ptr [rcx+18h] ; fragment_list->net_buffer_length
add     dx, [rbx+10h]           ; + reassembly->packet_length(0xFFD0)
add     dx, 8                   ; DX寄存器溢出
call    ExAllocatePoolWithTag   ; 仅分配48字节
mov     r8d, [rbx+10h]          ; 使用原始长度0xFFD0
call    memmove                 ; 导致65,488字节溢出
  1. 利用条件
  • 需要构造特殊分片使reassembly->packet_length下溢为0xFFD0
  • 通过高速发包触发内核包合并
  • 精确控制溢出数据实现EIP劫持

技术难点

  1. 环境配置:需限制目标VM为单核CPU以增强包合并概率
  2. 时序竞争:漏洞触发依赖内核调度时序
  3. 利用开发:需要构造包含有效负载的IPv6分片链

防护建议

  1. 立即安装2024年8月Windows安全更新
  2. 在网络边界过滤异常的IPv6选项包
  3. 启用控制流防护(CFG)缓解内存破坏攻击

该漏洞展示了Windows IPv6协议栈中复杂的链表处理逻辑如何导致远程内核漏洞,是网络协议安全研究的典型案例。完整利用代码已提交给微软安全响应中心。

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