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

CVE-2022-50474:Linux内核macio设备内存泄漏漏洞

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

漏洞信息

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

相关标签

内存泄漏Linux内核macintoshmacio设备驱动引用计数泄漏本地提权拒绝服务CWE-401PowerPC

漏洞概述

CVE-2022-50474是Linux内核macintosh平台macio设备驱动中的一个内存泄漏漏洞。该漏洞位于macio_add_one_device()函数中,在设备注册失败时未能正确释放已分配的内存资源。

在Linux内核的macintosh(苹果PowerPC/Macintosh平台)支持子系统中,macio总线用于管理苹果设备上的各类外设。漏洞的根本原因在于:自内核提交1fa5ae857bb1("driver core: get rid of struct device's bus_id string array")之后,设备的名称改为动态分配方式。当device_initialize()成功初始化设备后,会获取一个引用计数,但当of_device_register()注册失败时,该引用未被正确释放,导致内存泄漏。

该漏洞的CVSS评分为5.5分,属于中等严重等级。虽然机密性和完整性影响均为无,但可用性影响为高,因为持续的内存泄漏可能导致系统内存耗尽,最终引发系统不稳定或拒绝服务。攻击者需要本地低权限访问即可触发该漏洞,无需用户交互。

技术细节

从技术层面分析,该漏洞涉及Linux内核设备模型中的引用计数管理机制。

1. **漏洞触发路径**:在macio_add_one_device()函数中,首先调用device_initialize()初始化设备结构体,该函数会获取一个kobject引用。然后调用of_device_register()尝试将设备注册到设备树中。

2. **内存泄漏机制**:当of_device_register()失败时,代码路径没有正确处理device_initialize()所获取的引用。正确的做法应该是调用put_device()来释放该引用,使引用计数归零后由kobject_cleanup()自动释放设备结构体。由于缺少put_device()调用,设备结构体及其关联的动态分配名称内存将无法被释放。

3. **修复方案**:补丁通过调用put_device()来放弃device_initialize()中获取的引用。同时,由于macio设备在macio_release_dev()中已经完成了释放操作,因此可以移除多余的kfree()调用。

4. **利用方式**:攻击者通过本地低权限访问,持续触发macio设备注册失败的条件(例如通过加载特定的内核模块或操纵设备树节点),反复造成内存泄漏。虽然每次泄漏的内存量有限,但持续触发可导致内核内存逐渐耗尽,最终引发内核panic或系统拒绝服务。

5. **影响范围**:该漏洞影响Linux内核中所有包含macintosh/macio子系统支持的版本,特别是PowerPC架构的Macintosh平台。

攻击链分析

STEP 1
步骤1:本地访问
攻击者获取目标系统的本地低权限访问权限(通过物理访问或已获取的低权限shell)
STEP 2
步骤2:加载内核模块
攻击者加载特制的内核模块或利用现有机制触发macio设备注册流程
STEP 3
步骤3:触发注册失败
通过操纵设备树节点或制造错误条件,使of_device_register()调用失败
STEP 4
步骤4:内存泄漏累积
每次注册失败时,device_initialize()获取的引用未被put_device()释放,导致内存泄漏持续累积
STEP 5
步骤5:资源耗尽
反复触发漏洞条件,最终导致内核内存耗尽,系统性能下降或拒绝服务

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2022-50474 PoC - Linux Kernel macio Memory Leak // This PoC demonstrates the memory leak by repeatedly triggering // macio device registration failure condition #include <linux/module.h> #include <linux/init.h> #include <linux/of.h> #include <linux/platform_device.h> #include <linux/slab.h> // Simulate the vulnerable code path in macio_add_one_device() // When of_device_register() fails, device_initialize() reference is leaked static int __init macio_leak_init(void) { struct platform_device *pdev; int i; int ret; pr_info("CVE-2022-50474 PoC: Triggering macio memory leak\n"); // Repeatedly attempt device registration to trigger memory leak for (i = 0; i < 1000; i++) { // Allocate a platform device (similar to macio device) pdev = kzalloc(sizeof(struct platform_device), GFP_KERNEL); if (!pdev) break; // device_initialize() acquires a reference device_initialize(&pdev->dev); // Simulate of_device_register() failure // In vulnerable version, put_device() is NOT called here // This causes the reference to leak ret = -1; // Force failure if (ret) { // VULNERABILITY: Missing put_device() call // In fixed version, put_device(&pdev->dev) should be called here // Without it, the device structure leaks memory continue; } } pr_info("CVE-2022-50474 PoC: Memory leak triggered %d times\n", i); return 0; } static void __exit macio_leak_exit(void) { pr_info("CVE-2022-50474 PoC: Module unloaded\n"); } module_init(macio_leak_init); module_exit(macio_leak_exit); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("CVE-2022-50474 macio memory leak PoC"); // Fixed version should include: // if (ret) { // put_device(&pdev->dev); // Release the reference // return ret; // }

影响范围

Linux kernel < 5.10 (含macintosh/macio子系统的所有受影响版本)
Linux kernel 5.10.x(需检查具体子版本)
Linux kernel 5.15.x(需检查具体子版本)
Linux kernel 5.18+(需检查具体子版本)

防御指南

临时缓解措施
在无法立即升级内核的情况下,建议采取以下临时缓解措施:1)限制普通用户加载内核模块的权限,仅允许特权用户执行modprobe等操作;2)通过内核启动参数或sysctl限制非特权用户对设备节点的访问;3)监控系统内存使用情况,及时发现异常内存增长;4)如果系统运行在非PowerPC/Macintosh平台,可考虑在编译时禁用macintosh相关驱动以减少攻击面;5)使用Linux内核的kmemleak检测功能定期扫描内存泄漏情况。

参考链接

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