CVE-2023-53594CVE-2023-53594是Linux内核驱动核心(driver core)中device_add()函数存在的一个资源泄漏漏洞。该漏洞源于在device_add()函数中,当kobject_add()调用失败时,dev->kobj.parent已被设置为NULL,导致后续的cleanup_glue_dir()无法正确释放通过kobject_get()获取的资源,从而引发资源泄漏问题。
具体而言,在device_add()的执行流程中,首先会调用get_device_parent()函数,在该函数内部会调用class_dir_create_and_add(),进而调用kobject_add()并执行kobject_get()操作获取引用。随后,dev->kobj.parent被设置为kobj。如果后续的kobject_add()调用失败,虽然会将dev->kobj.parent设置为NULL,但此时get_glue_dir(dev)会返回NULL,导致cleanup_glue_dir()不会调用kobject_put()来释放之前获取的资源。
该漏洞的实际表现为:当尝试加载mac80211_hwsim.ko模块时,会出现"sysfs: cannot create duplicate filename '/devices/virtual/mac80211_hwsim'"的错误,导致模块加载失败。内核日志中会显示kobject_add_internal失败并提示不要在同一目录中注册同名对象。该漏洞会影响系统的可用性,可能导致某些内核模块无法正常加载。
该漏洞的技术原理涉及Linux内核设备模型中的kobject引用计数管理机制。在device_add()函数执行过程中,存在以下关键调用链:
1. get_device_parent()被调用以获取设备父对象;
2. 在get_device_parent()内部,class_dir_create_and_add()创建类目录并调用kobject_add(),该操作会执行kobject_get()增加引用计数;
3. 之后dev->kobj.parent被设置为获取到的kobj;
4. 紧接着再次调用kobject_add(),如果该调用失败(例如因为重复的文件名),kobject_add()内部会将dev->kobj.parent设置为NULL;
5. 后续调用get_glue_dir(dev)时,由于dev->kobj.parent为NULL,返回值为NULL;
6. 在错误处理路径中调用cleanup_glue_dir(),但由于glue_dir为NULL,不会执行kobject_put()操作;
7. 结果是第2步中通过kobject_get()增加的引用计数永远不会被释放,造成资源泄漏。
利用方式方面,攻击者需要本地低权限访问系统,通过尝试加载存在命名冲突的内核模块来触发该漏洞。例如,当系统中已经存在mac80211_hwsim设备时,再次尝试加载mac80211_hwsim.ko模块会触发kobject_add()失败,进而导致资源泄漏。攻击向量为本地攻击(AV:L),需要低权限(PR:L),无需用户交互(UI:N),对机密性影响低(C:L),对完整性无影响(I:N),但对可用性影响高(A:H),可能导致系统服务异常或模块加载失败。