CVE-2023-53587CVE-2023-53587是Linux内核ring-buffer(环形缓冲区)子系统中存在的一个高危释放后使用(Use-After-Free)漏洞。该漏洞位于内核的ring-buffer销毁逻辑中,当ring-buffer在销毁前未能正确同步IRQ work(中断请求工作队列)时,可能导致在缓冲区内存被释放后,IRQ work仍然尝试访问已释放的内存区域,从而触发KASAN(Kernel Address Sanitizer)报告的slab-use-after-free错误,或在没有KASAN的情况下直接导致系统崩溃。
该漏洞在ARCH=um(User Mode Linux)配合time-travel(时间穿越)调试模式下被实际复现。在真实硬件系统中,由于时间窗口极小,该问题可能难以触发,但在特定时序条件下(如高负载、内核抢占等场景)仍然存在被利用的风险。攻击者可以通过精心构造的时序条件,在ring-buffer销毁过程中触发对已释放内存的访问,导致内核崩溃或权限提升。
根据CVSS 3.1评分标准,该漏洞评分为7.8分(高危),攻击向量为本地(AV:L),攻击复杂度低(AC:L),所需权限为低权限(PR:L),无需用户交互(UI:N),对机密性、完整性和可用性均产生高影响(C:H/I:H/A:H)。该漏洞影响了多个Linux内核稳定版本,需要尽快应用安全补丁进行修复。
该漏洞的根本原因在于ring-buffer销毁流程中缺少对IRQ work的同步操作。在Linux内核6.3.0-rc1之前的版本中,ring-buffer模块使用单一的全局IRQ work结构,因此不存在竞争条件问题。但在引入多个per-CPU ring-buffer的IRQ work之后,每个buffer拥有独立的IRQ work实例。
当ring-buffer被销毁时,如果在此之前有数据被写入buffer,相应的IRQ work可能尚未执行。ring-buffer的销毁操作会释放其占用的slab内存(kmalloc-1k,1024字节),但IRQ work回调函数仍然持有对该内存的引用。当IRQ work随后在中断上下文中执行时,会访问已经被释放的内存区域,触发use-after-free错误。
从KASAN报告中可以看到,buggy address位于kmalloc-1k缓存中已释放的1024字节区域内,距离起始地址偏移584字节。调用链为:irq_work_run_list -> irq_work_tick -> update_process_times -> tick_sched_handle -> tick_sched_timer -> __hrtimer_run_queues -> hrtimer_interrupt。
修复方案是在ring-buffer销毁函数中添加irq_work_sync()调用,确保IRQ work在buffer内存被释放之前完成执行,从而避免竞争条件。