CVE-2022-50548CVE-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()释放已分配的资源,确保无论函数以何种路径返回,所有分配的资源都能被正确释放。