CVE-2023-53591CVE-2023-53591是Linux内核mlx5e网络驱动中的一个死锁漏洞,位于tc(Traffic Control)路由查询代码路径中。该漏洞源于mlx5_devcom组件的rw信号量与eswitch offloads封装表锁(encap_tbl_lock)之间的锁顺序冲突,形成典型的ABBA死锁。当系统尝试创建对等流(peer flows)时,会持有devcom读写信号量,而该信号量的获取位置在调用链中过于靠上,导致在后续调用mlx5e_attach_encap等函数时尝试获取encap_tbl_lock,从而与另一条已持有encap_tbl_lock后再请求devcom信号量的代码路径形成循环等待。攻击者可通过精心构造的tc flower规则触发该死锁,导致系统挂起或网络功能不可用。该漏洞影响所有使用Mellanox ConnectX系列网卡并配置了eswitch offload功能的Linux系统,CVSS评分为5.5分,属于中危级别。
该死锁漏洞的核心问题在于mlx5_devcom组件的锁机制设计缺陷。具体技术细节如下:
1. **死锁触发路径**:当用户通过tc工具配置flower规则触发mlx5e_tc_add_fdb_flow时,调用链依次为mlx5e_configure_flower -> __mlx5e_add_fdb_flow -> mlx5e_tc_add_fdb_flow -> mlx5e_attach_decap_route -> mlx5e_tc_tun_route_lookup -> mlx5e_tc_query_route_vport -> mlx5_devcom_get_peer_data。在mlx5_devcom_get_peer_data中获取了comp->sem(devcom读写信号量)。
2. **反向锁链**:与此同时,在mlx5e_attach_encap函数中需要获取esw->offloads.encap_tbl_lock,而该锁在另一条路径中(mlx5e_tc_query_route_vport -> mlx5_devcom_get_peer_data)已经被间接持有,形成了#0(encap_tbl_lock)-> #1(comp->sem)的反向依赖关系。
3. **修复方案**:开发者采用了RCU(Read-Copy-Update)机制重构代码:(a) 将devcom的data指针改为RCU保护,释放时同步等待RCU宽限期结束;(b) 对paired布尔标志使用READ_ONCE/WRITE_ONCE宏进行原子访问;(c) 新增mlx5_devcom_get_peer_data_rcu() API替代加锁版本的mlx5_devcom_get_peer_data(),实现无锁查询。
4. **利用条件**:攻击者需要本地低权限访问,能够使用tc工具配置网络规则,且系统需配备Mellanox ConnectX系列网卡并启用了switchdev/eSwitch offload模式。