CVE-2023-53631CVE-2023-53631是Linux内核platform/x86子系统中dell-sysman驱动存在的一个引用计数泄漏漏洞。该漏洞源于在调用kset_find_obj()函数查找属性时,如果发现重复的属性,该函数会返回一个对属性的引用。然而,在原有代码中并未对该返回的引用进行适当的释放处理,导致每次查找到重复属性时都会泄漏一个引用。随着时间推移或在高频率操作场景下,泄漏的引用会逐渐累积,最终可能导致内核对象无法被正常释放,引发内存泄漏问题,严重时甚至造成系统不稳定或拒绝服务。
该漏洞由Linux内核社区的安全研究人员发现并修复,修复方案是在检测到重复属性时调用kobject_put()来正确释放多余的引用计数。漏洞的CVSS 3.1评分为5.5分,属于中危级别。攻击者需要具有本地低权限访问才能利用此漏洞,且无需用户交互。漏洞的影响主要体现在可用性方面,可能导致系统资源耗尽或内核对象管理异常。
该漏洞影响多个Linux内核稳定版本,Linux内核维护团队已在多个stable分支中发布了修复补丁。涉及的修复提交包括6ced15ff1746、7295a996fdab、9d9e03bec147、c5402011992b和d079a3e1ccdd等多个commit。
该漏洞的技术原理涉及Linux内核对象管理机制中的引用计数(kref)系统。在Linux内核中,kobject是设备模型的基础结构,每个kobject都维护一个引用计数。当通过kset_find_obj()在内核对象集合中查找特定属性时,如果找到匹配的对象,该函数会通过kobject_get()增加目标对象的引用计数并返回。
在dell-sysman驱动的相关代码路径中,当检测到重复属性时,代码调用了kset_find_obj()来查找已存在的属性对象。虽然kset_find_obj()成功返回了属性对象(同时增加了引用计数),但代码并未在适当的时机调用kobject_put()来平衡这次引用增加。这种不对称的操作导致了引用计数的泄漏。
利用方式方面,攻击者需要具有本地系统的低权限访问权限(PR:L)。通过反复触发导致重复属性查找的代码路径,攻击者可以使内核中的kobject引用计数不断累积。由于每个泄漏的引用都会阻止底层资源的释放,长期运行或在高频率触发条件下,泄漏的引用可能导致:
1. 内核内存持续增长,最终耗尽系统内存资源;
2. kobject及其关联的数据结构无法被正确释放,导致内核对象生命周期管理混乱;
3. 在极端情况下,可能触发内核的OOM(Out of Memory)killer或导致系统不稳定。
修复方案是在检测到重复属性后,立即调用kobject_put()来释放kset_find_obj()增加的引用计数,确保引用计数的平衡。该修复经过编译测试验证。