CVE-2022-50475CVE-2022-50475是Linux内核RDMA(远程直接内存访问)核心子系统中的一个空指针解引用漏洞。该漏洞源于ib_port结构体在sysfs kobject添加之前未被正确初始化,或在移除后未被正确重置。当用户或进程通过sysfs文件系统访问与RDMA端口相关的属性节点(如hw_stat_port_show)时,内核会尝试通过未初始化或已释放的ib_port指针访问内存,从而触发空指针解引用错误,导致内核崩溃(kernel panic/Oops)。
该漏洞的影响范围涵盖使用RDMA功能的Linux系统,特别是在BlueField SoC等Mellanox硬件平台上使用mlx5_ib驱动的环境。漏洞触发后,系统会产生内核Oops异常,可能导致系统服务中断或系统完全不可用。由于该漏洞需要本地访问权限且需要低权限用户身份,因此被评定为中危级别,但其对系统可用性的影响为高(Availability: High),可造成拒绝服务攻击。
该漏洞已在Linux内核稳定版本中通过提交5e15ff29b156、ac7a7d707912、cd06d32a71fb和f981c697b2f9等补丁修复,修复方案是确保ib_port结构体在添加sysfs kobject之前完成设置,并在移除kobject后进行重置。
该漏洞的根本原因在于RDMA核心子系统(ib_core)的端口管理代码中,ib_port结构体的生命周期管理与sysfs kobject的生命周期管理不同步。具体来说:
1. **代码路径问题**:在ib_core模块的端口初始化函数中,sysfs kobject的创建和注册发生在ib_port结构体完全初始化之前。同样,在端口清理函数中,ib_port结构体的重置发生在sysfs kobject移除之后。
2. **漏洞触发流程**:当用户空间进程(如通过cat命令读取sysfs节点)访问/sys/class/infiniband/下的端口属性文件时,内核会调用port_attr_show回调函数,进而调用hw_stat_port_show等具体实现函数。这些函数通过container_of宏从kobject获取对应的ib_port指针,但如果ib_port尚未初始化或已被重置,container_of将返回无效地址。
3. **崩溃机制**:hw_stat_port_show函数尝试通过无效的ib_port指针访问端口硬件统计信息(如offset 0x50处的成员),触发数据中止异常(Data Abort),产生96000006类型的Oops错误,PC指向hw_stat_port_show+0x4c/0x80。
4. **利用方式**:本地低权限用户只需执行类似`cat /sys/class/infiniband/mlx5_0/ports/1/hw_counters`的命令即可触发崩溃,造成拒绝服务攻击。无需特殊权限或用户交互。
5. **修复方案**:在内核补丁中,将ib_port的赋值操作移到kobject_init_and_add之前,并在kobject_put之后将ib_port重置为NULL,确保在sysfs节点可访问期间ib_port始终有效。