CVE-2023-53581CVE-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互斥锁保护的临界区内,确保检查与移除操作的原子性,从而消除竞态条件。