CVE-2022-50477CVE-2022-50477是Linux内核RTC(实时时钟)子系统中存在的一个内存泄漏漏洞。该漏洞位于drivers/rtc/class.c文件的devm_rtc_allocate_device()函数中。在该函数的执行流程中,首先通过内存分配函数分配一个rtc_device结构体,随后调用dev_set_name()为设备设置名称。然而,如果dev_set_name()调用失败,之前成功分配的rtc_device结构体将无法被正确释放,从而导致内存泄漏问题。
该漏洞的CVSS评分为5.5分,属于中危级别。其攻击向量为本地攻击(AV:L),需要低权限(PR:L),无需用户交互(UI:N)。虽然该漏洞不会直接导致机密性泄露或完整性破坏(机密性影响为低、完整性影响为无),但会对系统可用性产生高影响(A:H),因为持续的内存泄漏可能导致系统资源耗尽,最终影响系统稳定性。
从漏洞描述中提供的内核堆栈跟踪信息可以看到,该漏洞在rx4581_probe()函数(rtc_rx4581驱动模块)通过SPI总线探测过程中被触发。触发场景为python3进程通过sysfs写入触发SPI设备绑定操作,最终调用到存在缺陷的devm_rtc_allocate_device()函数。该漏洞影响所有使用devm_rtc_allocate_device()接口的RTC设备驱动。
该漏洞的技术原理涉及Linux内核设备资源管理机制中的缺陷。具体分析如下:
1. **漏洞函数路径**:devm_rtc_allocate_device() -> dev_set_name() -> 内存泄漏
2. **缺陷代码逻辑**:在原始实现中,函数执行顺序为:
- 调用alloc()分配rtc_device结构体(大小约2048字节)
- 调用dev_set_name()设置设备名称
- 调用devm_add_action_or_reset()注册资源释放回调
3. **问题根源**:当dev_set_name()执行失败时(例如设备名称冲突或内存不足),由于devm_add_action_or_reset()尚未注册,分配的rtc_device结构体没有对应的自动释放机制,导致内存泄漏。
4. **修复方案**:将devm_add_action_or_reset()调用移到dev_set_name()之前执行,确保即使dev_set_name()失败,之前分配的rtc_device也能通过devm机制自动释放。
5. **触发场景**:通过sysfs接口绑定SPI设备时,内核会调用spi_probe() -> really_probe() -> rx4581_probe() -> devm_rtc_device_register() -> devm_rtc_allocate_device(),在设备名称设置失败时触发泄漏。
6. **利用方式**:攻击者可通过持续触发设备探测过程(如通过/sys/bus/spi/drivers/.../bind接口),反复造成内存泄漏,最终耗尽系统内存资源,导致系统不稳定或拒绝服务。