CVE-2025-39947CVE-2025-39947是Linux内核中mlx5e网络驱动的一个空指针解引用漏洞,位于mlx5_uplink_netdev_get()函数中。该函数用于获取上行链路(uplink)网络设备的指针,该指针存储在mdev->mlx5e_res.uplink_netdev中。然而,当网络设备从mlx5_core.eth驱动解绑(unbind)时,该网络设备可能会被移除,其指针被清除为NULL。由于代码在使用该指针之前未进行有效性检查,直接访问该NULL指针会导致内核页面错误(page fault),从而触发内核崩溃(kernel panic)。该漏洞的触发路径涉及eswitch模式的启用操作,通过devlink接口设置eswitch模式时,系统会调用mlx5e_vport_rep_load()函数,该函数尝试访问已为NULL的uplink_netdev指针。CVSS评分为5.5,属于中危级别。虽然需要本地低权限访问才能触发,但该漏洞可导致系统完全不可用(高可用性影响),对运行关键业务服务的服务器构成严重威胁。受影响的组件包括所有使用Mellanox/NVIDIA mlx5系列网卡的Linux系统,特别是在虚拟化环境中频繁进行网卡绑定/解绑操作的场景。
该漏洞的技术原理如下:
1. mlx5e驱动在初始化时,会将上行链路网络设备的指针保存到mdev->mlx5e_res.uplink_netdev字段中。
2. 当网络设备从mlx5_core.eth驱动解绑时(例如通过`ip link set`命令或PCI设备热拔插),驱动会清除该指针,将其设置为NULL。
3. 然而,mlx5_uplink_netdev_get()函数在获取该指针后直接返回,没有进行NULL检查。
4. 调用方mlx5e_vport_rep_load()在偏移量0x1300处访问该结构体成员(可能是netdev_ops或类似字段),导致对地址0x0000000000001300的非法内存访问。
5. 触发路径为:用户空间通过netlink发送DEVLINK_ESWITCH_MODE_SET命令 → devlink_nl_eswitch_set_doit() → mlx5_devlink_eswitch_mode_set() → mlx5_eswitch_enable_locked() → esw_offloads_enable() → mlx5_esw_offloads_rep_load() → mlx5e_vport_rep_load(),最终在访问NULL指针时崩溃。
利用方式:攻击者需要本地低权限访问系统,通过netlink接口或devlink工具尝试修改eswitch模式。如果此时uplink网络设备恰好处于解绑状态或刚被解绑,就会触发空指针解引用,导致内核panic和系统拒绝服务。
修复方案:在使用指针之前检查是否为NULL,如果有效则立即调用netdev_hold()获取引用计数,防止netdev在使用过程中被释放。