CVE-2022-50489CVE-2022-50489是Linux内核drm/mipi-dsi子系统中的一个资源泄漏漏洞。该漏洞存在于MIPI-DSI(Mobile Industry Processor Interface - Display Serial Interface)主机的注销流程中。当MIPI-DSI主机通过mipi_dsi_host_unregister()函数注销时,代码会遍历当前连接在该总线上的所有设备并执行unregister操作。然而,在注销设备之前,代码并未先将其从总线上detach(分离),这导致了一系列资源泄漏问题。
该漏洞的根本原因在于设备生命周期管理的缺陷。在Linux设备模型中,设备的正确移除流程应该是先detach(解除与总线的关联),然后再unregister(从系统中注销)。如果省略了detach步骤,当主机驱动程序试图在设备分离时执行某些清理操作(如释放电源、释放GPIO资源、释放时钟等)时,这些清理操作将不会被执行,从而造成资源泄漏。在某些情况下,这还可能导致内核在后续操作中访问已释放的资源,触发空指针解引用或use-after-free等更严重的问题。
该漏洞的CVSS评分为5.5,属于中等严重等级。虽然利用条件需要本地低权限访问,但其可用性影响为高,可能导致系统不稳定或内核崩溃。攻击者可以通过触发MIPI-DSI主机的注销流程(如卸载相关驱动模块)来利用此漏洞,造成系统资源耗尽或内核panic。
该漏洞的技术原理涉及Linux内核设备模型中MIPI-DSI总线的设备管理流程。
在Linux内核的drm/mipi-dsi.c文件中,mipi_dsi_host_unregister()函数负责注销MIPI-DSI主机。该函数的原始实现中,仅调用device_unregister()来注销连接到该主机的所有DSI设备,但缺少了调用device_unregister()之前应当执行的mipi_dsi_device_detach()操作。
正确的设备移除流程应为:
1. 调用mipi_dsi_device_detach()将设备从总线上分离,触发主机的detach回调
2. 主机驱动程序在detach回调中执行资源清理(如释放PHY、关闭电源域等)
3. 调用device_unregister()将设备从系统中注销
由于缺少第一步,当主机驱动实现有detach回调函数时,该回调永远不会被调用,导致:
- 电源管理资源未正确释放
- PHY(物理层)资源泄漏
- GPIO引脚未释放
- 时钟未关闭
- 中断处理未清理
在特定场景下,如果主机驱动在detach回调中执行了关键的清理操作,未调用detach可能导致后续操作中访问无效指针,触发内核oops或panic。
攻击者可以通过编写一个内核模块,在特定时机触发MIPI-DSI主机的注销(例如通过绑定/解绑相关驱动),从而触发资源泄漏。持续触发该漏洞可能导致系统资源耗尽,最终引发系统不稳定。