CVE-2022-50547CVE-2022-50547是Linux内核中media子系统的solo6x10驱动存在的一个内存泄漏漏洞。该漏洞位于solo_sysfs_init()函数中,当device_register()调用失败时,之前通过dev_set_name()分配的设备名称内存未能被正确释放。根据device_register()函数的注释说明,在错误处理路径中应该使用put_device()来释放对设备的引用,这样kobject_cleanup()才能正确释放通过dev_set_name()分配的名称内存。
该漏洞的CVSS评分为5.5,属于中危级别。攻击者需要本地低权限访问即可触发此漏洞,无需用户交互。漏洞本身不会直接导致机密性泄露或完整性破坏,但可能导致系统可用性受到影响,因为持续的内存泄漏会逐渐消耗系统内存资源,最终可能导致系统性能下降或触发内存耗尽问题(OOM)。
该漏洞影响多个Linux内核稳定版本,已在多个内核补丁中得到修复。相关修复提交包括49060c0da57a、7b02c50d3978、7cf71bbe5d2e、7f5866dd96d9和83d4b1ae98a4等多个commit。solo6x10驱动用于支持Softlogic 6x10视频采集卡,该驱动在工业监控、视频采集等领域有一定应用场景。
该漏洞的技术原理如下:
1. **漏洞位置**:Linux内核drivers/media/pci/solo6x10/solo6x10-core.c文件中的solo_sysfs_init()函数。
2. **触发条件**:当device_register()函数调用返回错误时(例如设备注册过程中出现异常),需要正确清理已分配的资源。
3. **根本原因**:在solo_sysfs_init()函数中,首先通过dev_set_name()为设备分配名称内存,然后调用device_register()进行设备注册。如果device_register()失败,原始代码没有正确释放dev_set_name()分配的名称内存,导致内存泄漏。
4. **修复方案**:按照device_register()函数的文档说明,在错误处理路径中调用put_device()函数。put_device()会减少设备的引用计数,当引用计数降为零时,kobject_cleanup()会被调用,从而正确释放dev_set_name()分配的名称内存。
5. **利用方式**:攻击者需要本地访问权限,尝试加载solo6x10驱动或触发相关设备的注册流程。通过反复触发device_register()的错误路径,可以导致持续的内存泄漏。虽然单个泄漏量较小,但通过反复触发可累积造成显著的内存消耗。
6. **影响范围**:该漏洞主要影响系统可用性(A:H),不会泄露敏感信息或破坏数据完整性。