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

CVE-2022-50548 Linux内核hi846驱动内存泄漏漏洞

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

漏洞信息

漏洞编号
CVE-2022-50548
漏洞类型
内存泄漏
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel (media/i2c/hi846驱动)

相关标签

内存泄漏Linux Kernel内核漏洞V4L2media子系统i2c驱动hi846设备树拒绝服务本地提权

漏洞概述

CVE-2022-50548是Linux内核中media子系统中i2c hi846摄像头驱动的一个内存泄漏漏洞。该漏洞位于hi846_parse_dt()函数中,当解析设备树(Device Tree)过程中,与支持的链路频率(link frequencies)相关的检查失败时,V4L2 fwnode(firmware node)资源未被正确释放便直接返回,从而导致内存泄漏问题。

hi846是一款由SK Hynix生产的图像传感器芯片,常用于嵌入式设备和移动设备的摄像头模组中。该驱动负责通过I2C总线与传感器进行通信,并使用V4L2子系统的fwnode API来解析设备树中的硬件配置信息,如可用的链路频率、数据通道数量等。在设备初始化过程中,驱动会调用v4l2_fwnode_endpoint_alloc_parse()等函数分配fwnode端点资源,这些资源在正常路径下会在函数返回前被释放。

然而,当代码检查链路频率是否在支持的范围内时,如果检测到不支持的频率值,函数会直接返回错误码而没有执行资源释放操作,导致已分配的V4L2 fwnode资源永久泄漏。虽然该漏洞本身不会直接导致权限提升或远程代码执行,但持续的内存泄漏会逐渐消耗系统内存资源,最终可能导致系统可用内存耗尽,引发系统不稳定或拒绝服务状态。该漏洞的CVSS评分为5.5,属于中等严重等级,其攻击向量为本地攻击,需要低权限即可触发,无需用户交互。

技术细节

该漏洞的根本原因在于hi846_parse_dt()函数中资源管理的错误处理路径不完整。具体技术细节如下:

1. **资源分配阶段**:当hi846_parse_dt()被调用时,驱动首先通过v4l2_fwnode_endpoint_alloc_parse()分配并解析V4L2 fwnode端点数据结构,该函数会动态分配内存来存储端点信息,包括链路频率数组、总线类型、数据通道等。

2. **频率验证阶段**:随后,代码会检查设备树中配置的链路频率是否在hi846传感器支持的频率范围内。hi846传感器支持一组特定的MIPI CSI-2链路频率(如448MHz、896MHz等)。

3. **泄漏触发条件**:当检查发现设备树中配置的链路频率不在支持的频率列表中时,当前代码直接返回错误码(如-EINVAL),而没有调用v4l2_fwnode_endpoint_free()来释放之前分配的fwnode资源。

4. **利用方式**:攻击者可以通过修改设备树配置(如果具有低权限访问)或通过特制的设备树blob,使hi846驱动的probe函数在加载时触发该错误路径。每次驱动加载失败都会泄漏一次内存结构,重复触发可导致内核内存逐渐耗尽。

修复方案是在错误处理路径中添加goto跳转到统一的清理标签(cleanup label),在该标签中调用v4l2_fwnode_endpoint_free()释放已分配的资源,确保无论函数以何种路径返回,所有分配的资源都能被正确释放。

攻击链分析

STEP 1
步骤1
攻击者获得系统的本地低权限访问权限(如通过普通用户账户登录系统)
STEP 2
步骤2
攻击者修改设备树(Device Tree)blob或通过overlay修改hi846传感器的link-frequencies属性,设置一个hi846驱动不支持的频率值
STEP 3
步骤3
触发hi836驱动的probe函数重新执行(如通过重新加载驱动模块或热插拔摄像头设备)
STEP 4
步骤4
hi846_parse_dt()函数被调用,分配V4L2 fwnode端点资源
STEP 5
步骤5
链路频率检查失败,函数直接返回错误码,未释放已分配的fwnode资源
STEP 6
步骤6
重复触发上述过程,持续消耗内核内存,最终导致系统可用内存耗尽,引发系统不稳定或拒绝服务

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* CVE-2022-50548 - Linux Kernel hi846 driver memory leak PoC * This PoC demonstrates how to trigger the memory leak by * loading the hi846 driver with an unsupported link frequency * configured in the device tree. * * Note: Actual exploitation requires modifying the device tree * to specify a link frequency not supported by the hi846 sensor. */ #include <linux/module.h> #include <linux/i2c.h> #include <linux/of.h> #include <linux/init.h> /* Simulate the vulnerable code path in hi846_parse_dt() */ static int trigger_leak(struct i2c_client *client) { struct v4l2_fwnode_endpoint ep = {0}; int ret; /* Step 1: Allocate fwnode endpoint resources (simulated) */ ep.link_frequencies = kmalloc(sizeof(u64) * 4, GFP_KERNEL); if (!ep.link_frequencies) return -ENOMEM; ep.nr_of_link_frequencies = 4; ep.link_frequencies[0] = 9999999; /* Unsupported frequency */ /* Step 2: Check fails because frequency is not supported */ if (ep.link_frequencies[0] != 448000000 && ep.link_frequencies[0] != 896000000) { /* BUG: Missing v4l2_fwnode_endpoint_free(&ep) here */ return -EINVAL; /* Memory leak occurs */ } /* Normal cleanup - never reached in vulnerable path */ kfree(ep.link_frequencies); return 0; } static int __init hi846_leak_init(void) { pr_info("CVE-2022-50548 PoC: Triggering memory leak\n"); /* In real scenario, modify device tree link-frequency property * to an unsupported value and load the hi846 driver module */ return 0; } static void __exit hi846_leak_exit(void) { pr_info("CVE-2022-50548 PoC: Unloaded\n"); } module_init(hi846_leak_init); module_exit(hi846_leak_exit); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("PoC for CVE-2022-50548 hi846 memory leak"); /* * To actually trigger this vulnerability: * 1. Modify the device tree entry for the hi846 sensor * 2. Set the 'link-frequencies' property to an unsupported value * (e.g., <100000000>) * 3. Reboot or reload the hi846 driver * 4. Observe memory leak via /proc/meminfo or kmemleak * * Each failed probe attempt will leak the allocated fwnode structure. */

影响范围

Linux Kernel < 6.0(包含hi846驱动的所有受影响版本)
具体修复提交:4368730678412a8fa71960dbda81e122dafa70f7
具体修复提交:80113026d415e27483669db7a88b548d1ec3d3d1
具体修复提交:a05a9ae9ef3fffc9bc7ec2bc432a249a01155f6e

防御指南

临时缓解措施
在无法立即升级内核的情况下,可以通过以下临时措施缓解:1)限制普通用户对设备树blob和相关系统配置文件的访问权限;2)确保hi846摄像头设备的设备树配置中link-frequencies属性设置为支持的频率值(如448MHz或896MHz),避免触发错误路径;3)使用kmemleak等工具定期监控内核内存泄漏情况;4)通过Linux安全模块(如SELinux、AppArmor)限制驱动加载和设备管理的权限。

参考链接

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