IPBUF安全漏洞报告
English
CVE-2022-50545 CVSS 5.5 中危

CVE-2022-50545 Linux内核r6040驱动phy_device内存泄漏漏洞

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

漏洞信息

漏洞编号
CVE-2022-50545
漏洞类型
内存泄漏(Memory Leak)
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux内核 r6040网络驱动

相关标签

Linux内核r6040驱动内存泄漏kmemleakphy_device网络驱动本地提权拒绝服务可用性影响内核漏洞

漏洞概述

CVE-2022-50545是Linux内核r6040网卡驱动程序中的一个内存泄漏漏洞。该漏洞位于r6040驱动的probe(探测)和remove(移除)流程中,由于在移除r6040设备或在r6040_mii探测成功后的错误处理路径中未正确调用phy_disconnect()来断开与PHY设备的连接,导致phy_device的引用计数无法正确释放,从而造成内存泄漏。kmemleak检测到未释放的内存对象(大小为2048字节),泄漏点位于phy_device_create函数中通过kmalloc_trace分配的内存。该漏洞的CVSS评分为5.5,属于中危级别,攻击者需要本地低权限访问即可触发,攻击成功后将导致系统可用性受到高影响,可能引发内核内存耗尽等严重后果。问题已在多个Linux内核稳定版本中通过补丁修复,主要方案是在适当的位置添加phy_disconnect()调用以确保phy_device引用计数正确递减。

技术细节

从技术层面分析,该漏洞的根本原因在于r6040驱动的生命周期管理中对PHY设备引用计数的处理不当。具体流程如下:

1. 在r6040_init_one()(probe流程)中,首先调用mdiobus_register(),该函数内部会调用mdiobus_scan()扫描MII总线并为每个发现的PHY设备分配phy_device结构,此时每个phy_device的引用计数为3。

2. 随后调用r6040_mii_probe(),通过phy_connect()连接到第一个phy_device,使其引用计数增加到4,其余phy_device保持为3。

3. 如果在register_netdev()之后发生错误(例如通过故障注入),进入错误处理路径err_out_mdio_unregister和err_out_mdio,调用mdiobus_unregister()和mdiobus_free()。

4. mdiobus_free()会释放除第一个phy_device之外的所有phy_device(引用计数减至0),但第一个phy_device的引用计数仍为1,因为没有调用phy_disconnect()来断开连接。

5. 同样地,在r6040_remove_one()(remove流程)中也存在相同的问题。

修复方案是在适当的位置(错误处理路径和remove函数中)添加phy_disconnect(lp->phydev)调用,确保第一个phy_device的引用计数正确递减至0,从而被正常释放。

攻击链分析

STEP 1
步骤1:环境准备
攻击者需要在运行受影响Linux内核版本的系统上拥有本地低权限访问权限,且系统需要配备使用r6040驱动的网络设备(或在虚拟机环境中模拟该设备)。
STEP 2
步骤2:加载r6040驱动
通过modprobe r6040命令加载r6040网卡驱动,触发probe流程。驱动初始化时会扫描MII总线,分配phy_device结构体。
STEP 3
步骤3:触发错误路径
通过内核故障注入机制(如failslab模块)或利用其他内核漏洞,在register_netdev()调用之后但在正常完成之前触发错误,使驱动进入错误处理路径。
STEP 4
步骤4:触发内存泄漏
错误处理路径调用mdiobus_unregister()和mdiobus_free(),但由于缺少phy_disconnect()调用,第一个phy_device的引用计数无法归零,导致内存泄漏。
STEP 5
步骤5:重复利用放大影响
通过反复加载和卸载r6040驱动(modprobe/modprobe -r循环),持续触发内存泄漏,逐步耗尽内核内存,最终可能导致系统不稳定或拒绝服务。
STEP 6
步骤6:影响可用性
持续的内存泄漏将导致内核可用内存减少,可能触发OOM(Out of Memory)killer终止关键进程,或使系统进入不可用状态。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// Trigger kmemleak detection for CVE-2022-50545 // This PoC demonstrates how to trigger the memory leak by repeatedly // probing and removing the r6040 network driver with fault injection. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <sys/stat.h> // Step 1: Enable kmemleak scanning echo 1 > /sys/kernel/debug/kmemleak // not standard path, may vary // Step 2: Enable fault injection for mdiobus_register // Using Linux kernel fault injection framework echo 1 > /sys/kernel/debug/failslab/ignore-gfp-wait echo 100 > /sys/kernel/debug/failslab/probability echo 100 > /sys/kernel/debug/failslab/interval echo 1 > /sys/kernel/debug/failslab/times // Step 3: Simulate probe and remove cycle of r6040 driver // This requires a system with r6040 hardware or a virtual environment int main() { printf("Triggering CVE-2022-50545 memory leak...\n"); // Load r6040 module (requires root privileges) system("modprobe r6040"); // Wait for probe to complete sleep(1); // Remove r6040 module - this triggers the remove path system("modprobe -r r6040"); // Check kmemleak for leaked objects system("cat /sys/kernel/debug/kmemleak | grep -A 20 'r6040'"); printf("Check dmesg for kmemleak warnings\n"); system("dmesg | grep -i kmemleak"); return 0; } // Alternative: Use the Linux kernel's fault injection with a custom trigger // The fault should be injected after r6040_mii_probe() succeeds // but before register_netdev() completes, causing the error handling // path to be taken without proper phy_disconnect() call.

影响范围

Linux kernel < 4.9.337
Linux kernel 4.14.x < 4.14.303
Linux kernel 4.19.x < 4.19.270
Linux kernel 5.4.x < 5.4.229
Linux kernel 5.10.x < 5.10.165
Linux kernel 5.15.x < 5.15.93
Linux kernel 5.19.x < 5.19.11
Linux kernel 6.0.x < 6.0.1

防御指南

临时缓解措施
在无法立即升级内核的情况下,可以通过以下临时措施缓解风险:1)使用内核模块黑名单机制(echo blacklist r6040 >> /etc/modprobe.d/blacklist.conf)禁止r6040驱动自动加载;2)如果系统不使用r6040网卡,可在编译内核时禁用该驱动;3)限制本地用户的权限,防止未授权用户加载和卸载内核模块;4)启用kmemleak定期扫描并监控内存泄漏情况;5)监控dmesg日志中的kmemleak警告,及时发现异常。

参考链接

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