CVE-2022-50474CVE-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平台。