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
函数是微软用于紧急回滚补丁的机制。
漏洞触发条件
- 构造畸形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'
|
- 触发链表处理:当系统高负载时,内核会将多个IPv6包合并处理:
1
2
3
4
5
|
// 漏洞代码路径
Ipv6pProcessOptions()
IppSendErrorList(packet_list) // 遍历链表
IppSendError(packet) // 处理每个包时
packet->packet_size = 0 // 关键状态破坏
|
漏洞利用链
- 内存破坏阶段:通过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字节溢出
|
- 利用条件:
- 需要构造特殊分片使
reassembly->packet_length
下溢为0xFFD0
- 通过高速发包触发内核包合并
- 精确控制溢出数据实现EIP劫持
技术难点
- 环境配置:需限制目标VM为单核CPU以增强包合并概率
- 时序竞争:漏洞触发依赖内核调度时序
- 利用开发:需要构造包含有效负载的IPv6分片链
防护建议
- 立即安装2024年8月Windows安全更新
- 在网络边界过滤异常的IPv6选项包
- 启用控制流防护(CFG)缓解内存破坏攻击
该漏洞展示了Windows IPv6协议栈中复杂的链表处理逻辑如何导致远程内核漏洞,是网络协议安全研究的典型案例。完整利用代码已提交给微软安全响应中心。