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

CVE-2023-53660 Linux内核BPF cpumap清理ptr_ring时类型错误

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

漏洞信息

漏洞编号
CVE-2023-53660
漏洞类型
类型混淆/内存管理错误
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel (BPF cpumap 子系统)

相关标签

Linux KernelBPFcpumapXDP内存管理类型混淆本地提权拒绝服务内核漏洞CVE-2023-53660

漏洞概述

CVE-2023-53660是Linux内核BPF cpumap子系统中的一个内存管理漏洞。当使用xdp_redirect_cpu工具同时启用skb模式和stress模式时,__cpu_map_entry_free函数在清理ptr_ring的过程中未能正确处理skb(socket buffer)类型的内存,而是将其当作XDP帧来处理,导致触发内核警告'Incorrect XDP memory type usage'。该漏洞的根本原因有两个方面:一是cpu_map_kthread_run()内核线程被过早停止,导致ptr_ring中残留有skb数据;二是__cpu_map_ring_cleanup()函数没有处理skb模式,将ptr_ring中的skb当作XDP帧进行释放。该漏洞会导致系统稳定性下降,可能引发内核panic或不可用状态,对系统可用性造成高影响。虽然该漏洞需要本地低权限即可触发,但由于其影响仅限于可用性,且需要特定的内核配置和操作场景,因此整体严重等级评定为中危(CVSS 5.5)。该漏洞已在Linux内核主线及多个稳定版本中通过补丁修复,主要通过确保ptr_ring在清理时为空以及正确处理skb类型内存来解决。

技术细节

该漏洞位于Linux内核的net/core/xdp.c和kernel/bpf/cpumap.c文件中。具体技术原理如下:

1. BPF cpumap是XDP(eXpress Data Path)框架的一部分,用于将网络数据包从一个CPU核重定向到另一个CPU核进行处理。cpumap使用ptr_ring数据结构来在CPU之间传递数据包帧。

2. 在cpumap中,数据可以以两种模式传递:XDP原生帧模式(xdp_frame)和skb模式。当以skb模式运行时,ptr_ring中存储的是skb指针而非xdp_frame指针。

3. 漏洞触发流程:
- 当cpumap条目被释放时(__cpu_map_entry_free),会调用__cpu_map_ring_cleanup()来清理ptr_ring中残留的数据帧。
- 该函数假设ptr_ring中所有数据都是xdp_frame类型,调用xdp_return_frame()进行释放。
- 如果ptr_ring中实际包含skb指针(skb模式),xdp_return_frame()会将其当作xdp_frame处理,导致类型不匹配。
- xdp_return_frame()内部调用__xdp_return(),该函数检查内存类型标识符,发现类型不正确(-2128176192),触发内核警告。

4. 触发条件:需要运行xdp_redirect_cpu测试工具,同时启用skb-mode和stress-mode选项,在CPU核热插拔或cpumap条目释放时触发。

5. 利用方式:本地攻击者通过加载特定的BPF程序并触发cpumap的创建和销毁,可以导致内核警告、系统不稳定,严重时可能导致内核panic,影响系统可用性。

攻击链分析

STEP 1
步骤1:加载BPF程序
攻击者加载xdp_redirect_cpu类型的BPF程序到系统中,配置cpumap使用skb模式进行数据包重定向
STEP 2
步骤2:启用stress模式
通过xdp_redirect_cpu的stress选项持续创建和销毁cpumap条目,增加触发竞争条件的概率
STEP 3
步骤3:触发CPU热插拔
通过/sys/devices/system/cpu/cpu*/online接口触发CPU热插拔操作,导致cpumap条目被释放,调用__cpu_map_entry_free
STEP 4
步骤4:竞争条件触发
cpu_map_kthread_run()内核线程被过早停止,但ptr_ring中仍残留skb数据未被处理
STEP 5
步骤5:类型混淆
__cpu_map_ring_cleanup()将skb指针错误地当作xdp_frame指针处理,调用xdp_return_frame()释放内存
STEP 6
步骤6:内核警告/Panic
__xdp_return()检测到内存类型不匹配,触发内核警告'Incorrect XDP memory type usage',严重时导致内核panic,系统不可用

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// PoC for CVE-2023-53660 - Trigger BPF cpumap skb-mode cleanup bug // This requires root privileges to load BPF programs #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/resource.h> // Steps to reproduce: // 1. Enable stress mode in xdp_redirect_cpu // 2. Use skb-mode for cpumap // 3. Trigger CPU hotplug or cpumap entry removal // 4. Observe kernel warning: "Incorrect XDP memory type usage" int main() { // Increase resource limits for BPF operations struct rlimit r = {RLIM_INFINITY, RLIM_INFINITY}; setrlimit(RLIMIT_MEMLOCK, &r); printf("CVE-2023-53660 PoC Trigger\n"); printf("Run xdp_redirect_cpu with --stress --skb-mode flags\n"); printf("Then trigger CPU hotplug to cause cpumap cleanup:\n"); printf(" echo 0 > /sys/devices/system/cpu/cpu1/online\n"); printf(" echo 1 > /sys/devices/system/cpu/cpu1/online\n"); printf("Check dmesg for: 'Incorrect XDP memory type usage'\n"); // The actual trigger requires: // 1. xdp_redirect_cpu from samples/bpf with --skb-mode --stress // 2. CPU hotplug operations to trigger __cpu_map_entry_free // 3. The prematurely stopped kthread leaves skbs in ptr_ring // 4. __cpu_map_ring_cleanup misinterprets skbs as xdp_frames return 0; }

影响范围

Linux Kernel < 6.5 (包含rc版本)
Linux Kernel 6.5.0-rc2+ (已知受影响版本)

防御指南

临时缓解措施
在无法立即升级内核的情况下,可以采取以下临时缓解措施:1) 通过sysctl设置kernel.unprivileged_bpf_disabled=1,禁止非特权用户加载BPF程序;2) 避免在生产环境中使用xdp_redirect_cpu的stress模式与skb-mode组合;3) 限制本地用户对/sys/devices/system/cpu/的访问权限,防止触发CPU热插拔操作;4) 监控系统日志(dmesg),及时发现'Incorrect XDP memory type usage'警告并采取相应措施。

参考链接

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