CVE-2023-53533CVE-2023-53533是Linux内核中发现的一个中等严重程度的引用计数泄漏漏洞,存在于树莓派触摸屏驱动(raspberrypi-ts)的rpi_ts_probe函数中。该漏洞的CVSS评分为5.5分,CVSS向量为CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H,表明该漏洞需要本地低权限访问即可利用,无需用户交互,主要影响系统的可用性,对机密性和完整性无直接影响。该漏洞的根本原因是在Linux内核的树莓派触摸屏驱动初始化过程中,rpi_ts_probe函数调用rpi_firmware_get()来获取固件引用,但是当后续的初始化步骤失败时,原有的代码并没有正确释放已经获取的固件引用。具体来说,在probe函数的错误处理路径中,缺少对rpi_firmware_put()的调用,导致每次驱动加载失败都会泄漏一个引用计数。树莓派触摸屏驱动是Linux内核中用于支持树莓派触摸屏硬件的驱动程序,主要应用于树莓派系列单板计算机。该驱动通过树莓派固件接口与底层硬件通信,因此需要在初始化时通过rpi_firmware_get()函数获取固件引用。引用计数是Linux内核中管理资源生命周期的核心机制之一,当引用计数泄漏时,会导致资源无法被正确释放,长期累积可能导致系统资源耗尽。该漏洞的影响范围包括所有使用树莓派触摸屏硬件的Linux系统,主要是树莓派3、树莓派4、树莓派5等型号的单板计算机。攻击者可以通过本地低权限访问来利用此漏洞,通过反复触发驱动加载失败路径来累积引用计数泄漏。例如,攻击者可以通过sysfs文件系统中的bind和unbind操作来反复触发probe函数,或者通过加载和卸载内核模块来触发probe过程。虽然该漏洞的利用需要本地访问权限,且不会直接导致权限提升或数据泄露,但持续的引用计数泄漏最终可能导致系统资源耗尽,影响系统的可用性。当固件引用计数达到其上限时,新的固件操作将失败,可能导致系统不稳定或拒绝服务状态。该漏洞已在Linux内核的多个稳定版本中得到修复,涉及的修复提交包括0d6a5c9489c8、1dfa3c9dd27b、36d087e49dab、5bca3688bdbc和7acad58049ac等多个commit。修复方案是使用devm_rpi_firmware_get()辅助函数来管理固件引用,该函数使用设备资源管理框架(devres),能够在设备卸载或驱动分离时自动释放固件引用,无需手动调用rpi_firmware_put()。系统管理员应及时应用官方安全补丁来修复此漏洞,确保系统的安全性和稳定性。
该漏洞的技术原理在于Linux内核驱动程序中资源管理的缺陷。在raspberrypi-ts驱动的rpi_ts_probe函数中,初始化流程首先调用rpi_firmware_get()获取树莓派固件的引用计数,然后继续执行后续的设备初始化步骤(如分配输入设备、注册中断处理程序等)。如果在这些后续步骤中任意一步失败,原有代码会跳转到错误处理标签并返回,但错误处理路径中没有调用rpi_firmware_put()来释放已经获取的固件引用,导致引用计数永久泄漏。攻击者可以通过反复触发probe失败路径来累积泄漏的引用计数,最终耗尽固件引用资源。修复方案采用devm_rpi_firmware_get()辅助函数,该函数将固件引用与设备生命周期绑定,当设备被卸载或驱动分离时,设备资源管理框架会自动调用对应的释放函数,无需开发人员手动管理资源的释放。这种devres(Device Resource Management)机制是Linux内核中推荐的资源管理模式,可以有效避免因遗漏错误处理路径而导致的资源泄漏问题。