CVE-2023-53636CVE-2023-53636是Linux内核中Microchip时钟驱动(clk: microchip)的一个高危Use-After-Free(UAF)漏洞。该漏洞位于辅助设备(auxiliary device)的释放回调函数中,源于辅助设备未按照正确的顺序进行拆除操作。当auxiliary_device_add()函数调用失败时,释放回调函数会被调用两次,从而导致Use-After-Free漏洞的发生。此漏洞与之前已修复的commit 1c11289b34ab(peci: cpu: Fix use-after-free in adev_release())存在相似的问题,表明该驱动在实现时借鉴了存在缺陷的代码模式。该漏洞CVSS评分为7.8,属于高危级别,攻击者需要本地低权限访问即可利用,无需用户交互,成功利用后可对系统的机密性、完整性和可用性造成高影响。漏洞影响多个Linux内核稳定版本,官方已通过将auxiliary_device_uninit()移动到unregister回调函数中来进行修复,从而避免双重释放问题的发生。此漏洞属于Linux内核本地权限提升类漏洞,攻击者可通过精心构造的本地操作触发UAF,进而可能导致内核代码执行、权限提升或系统崩溃等严重后果。
该漏洞的根本原因在于Linux内核Microchip时钟驱动中辅助设备(auxiliary device)的生命周期管理不当。具体技术原理如下:
1. 在Linux内核中,辅助设备(auxiliary device)是一种用于扩展主设备功能的机制,通过auxiliary_device_add()注册,通过auxiliary_device_uninit()注销。
2. 正常情况下,当auxiliary_device_add()成功时,设备会被添加到系统中;当失败时,会调用release回调进行清理。
3. 然而在存在缺陷的实现中,如果auxiliary_device_add()调用失败,release回调会被调用两次:第一次是在add失败时的清理过程中,第二次是在后续的注销流程中。
4. 第一次release回调执行后,相关内存已被释放,但指针并未置空;第二次release回调再次访问已释放的内存,导致Use-After-Free。
5. 攻击者可通过触发auxiliary_device_add()失败的路径(例如通过资源耗尽、竞态条件等方式),利用双重释放的UAF漏洞。
6. 利用方式:本地低权限用户通过构造特定的系统调用或ioctl操作,触发Microchip时钟驱动的辅助设备注册失败路径,进而触发UAF。攻击者可利用内核堆利用技术(如堆喷射、SLAB/SLUB对象操控)实现内核代码执行,最终获得root权限。
7. 修复方案:将auxiliary_device_uninit()从add失败处理路径移动到unregister回调中,确保release回调只被调用一次。