CVE-2022-50522CVE-2022-50522是Linux内核中mcb(Multi-function CB,多功能通信总线)子系统中mcb-parse模块的一个资源管理漏洞。该漏洞位于chameleon_parse_gdd()函数中,当调用mcb_device_register()函数返回错误时,bus和device name的引用计数(refcount)未被正确释放,导致引用计数泄漏。
mcb子系统是Linux内核中用于支持工业通信卡(如Hilscher公司的现场总线卡)的驱动程序框架。chameleon_parse_gdd()函数负责解析Chameleon设备的GDD(Generic Device Description,通用设备描述)信息。在设备注册过程中,如果mcb_device_register()调用失败,原有代码没有正确处理错误路径,导致已经获取的bus和device name引用没有被释放。
该漏洞虽然被评为低危(CVSS 3.3分),但其影响范围涉及Linux内核的核心驱动子系统。由于Linux内核被广泛应用于服务器、桌面、嵌入式设备和云基础设施中,该漏洞的修复对于系统稳定性和资源管理至关重要。漏洞的修复通过调用put_device()函数正确释放引用,确保资源在mcb_release_dev()和kobject_cleanup()中被正确回收。该漏洞已于2025年10月7日披露,影响多个Linux内核稳定版本。
该漏洞的技术原理涉及Linux内核中的引用计数管理机制。在Linux内核驱动开发中,kobject和device结构体使用引用计数来跟踪对象生命周期。当对象被引用时,引用计数增加;当引用不再需要时,调用put_device()或kobject_put()来减少引用计数,当计数归零时自动释放内存。
在chameleon_parse_gdd()函数中,正常执行流程如下:
1. 分配并初始化bus和device结构体
2. 获取bus和device name的引用(引用计数+1)
3. 调用mcb_device_register()注册设备
4. 成功则正常返回
漏洞触发条件:当mcb_device_register()返回错误时,代码直接返回错误码,而没有调用put_device()来释放之前获取的bus和device name引用。这导致:
- bus对象的引用计数永远无法归零,造成内存泄漏
- device name的kobject引用泄漏
利用方式方面,由于该漏洞需要本地访问权限(AV:L)和低权限(PR:L),攻击者需要已经拥有目标系统的本地账户权限。攻击者可以通过编写特定的C程序,利用mcb子系统接口触发chameleon_parse_gdd()的调用,并在特定条件下使mcb_device_register()失败,从而造成持续的内存泄漏。虽然单次泄漏的影响有限,但通过反复触发可能导致内核内存耗尽,最终影响系统稳定性。
修复方案:在mcb_device_register()错误返回路径上添加put_device()调用,确保引用被正确释放。该修复已合并到多个Linux内核稳定版本中。