CVE-2023-53613CVE-2023-53613是Linux内核device-dax子系统中发现的一个高危释放后使用(Use-After-Free)漏洞。该漏洞位于dax_mapping_release()函数中,当用户通过modprobe -r dax_hmem等命令移除device-dax区域提供者时,由于dax_mapping对象在释放过程中调用了ida_free()操作一个已经被释放的ida对象,导致了释放后使用问题。
该漏洞在启用CONFIG_DEBUG_KOBJECT_RELEASE配置选项进行测试时被触发,会在lockdep检查中产生警告信息。漏洞的根本原因在于设备通常仅在注册时持有对父对象的引用,但如果子对象需要父对象来完成其释放操作,子对象需要在自身的release回调函数中持有对父对象的引用。
此漏洞的CVSS评分为7.8,属于高危级别。虽然攻击需要本地权限和低权限要求,但由于其可能导致内核崩溃、权限提升等严重后果,对系统安全构成重大威胁。该漏洞影响多个Linux内核稳定版本,需要及时更新修复。
该漏洞的技术原理涉及Linux内核的设备模型和DAX(Direct Access)文件系统子系统。具体分析如下:
1. **对象引用机制缺陷**:在Linux内核的设备模型中,设备通常只在注册时持有对父设备(dev_dax实例)的引用。当device-dax的mapping对象(dax_mapping)需要被释放时,会调用dax_mapping_release()函数。
2. **释放时序问题**:在dax_mapping_release()函数中,会调用ida_free()来释放与mapping关联的ida对象。然而,由于mapping对象没有在自身的release回调中保持对父dev_dax实例的引用,父对象可能已经被释放,导致ida_free()操作在一个已经释放的内存区域上。
3. **触发条件**:当用户执行modprobe -r dax_hmem等命令移除device-dax区域提供者时,会触发mapping对象的释放流程。如果此时父dev_dax实例已经被释放,就会发生use-after-free。
4. **崩溃路径**:调用链为device_release -> kobject_delayed_cleanup -> dax_mapping_release -> ida_free,在ida_free中尝试获取自旋锁时触发lockdep警告。
5. **修复方案**:修复方案是让dax_mapping对象持有对父dev_dax实例的引用,直到dax_mapping_release()执行完毕,确保父对象在子对象释放期间仍然有效。