CVE-2023-53577CVE-2023-53577是Linux内核BPF(Berkeley Packet Filter)cpumap子系统中存在的一个高危竞争条件漏洞。该漏洞源于cpu_map_update_elem操作中,per-cpu kthread的启动与停止之间存在时序竞争问题。当使用stress模式运行xdp_redirect_cpu并配合RT线程时,内核会触发WARNING警告。具体表现为:kthread_stop()在cpu_map_kthread_stop()中过早停止了kthread线程,而kthread()函数尚未调用cpu_map_kthread_run(),但XDP程序已经将部分frames或skbs排入ptr_ring队列中。当__cpu_map_ring_cleanup()检查ptr_ring时,发现队列未被清空,从而触发警告并可能导致内存泄漏或资源管理异常。该漏洞与commit 436901649731修复的内存泄漏问题根因相同。CVSS评分为7.8,属于高危级别,攻击者需要本地低权限访问即可利用,对系统的机密性、完整性和可用性均产生高影响。
该漏洞的技术原理涉及Linux内核BPF cpumap的kthread生命周期管理。cpumap是BPF/XDP(eXpress Data Path)框架中的一个关键组件,用于在不同CPU核心之间重定向数据包。
漏洞根本原因:在__cpu_map_entry_alloc()函数返回之前,系统未能确保per-cpu kthread已经成功启动并运行。当kthread_stop()被调用时,如果kthread尚未执行cpu_map_kthread_run(),则ptr_ring中已排队的frames或skbs将无法被正常处理。__cpu_map_ring_cleanup()检测到ptr_ring非空时,会触发内核WARNING警告(kernel/bpf/cpumap.c:135),并可能引发put_cpu_map_entry中的引用计数异常。
调用链分析:触发路径为cpu_map_kthread_stop() -> put_cpu_map_entry(),通过process_one_work -> worker_thread -> kthread的工作队列机制执行。
利用方式:攻击者需要本地低权限访问系统,通过创建并操作BPF cpumap映射,触发xdp_redirect_cpu操作。在stress模式下,结合RT线程的调度干扰,可以放大竞争窗口,强制触发kthread过早停止的场景。成功后可能导致内核警告、系统不稳定或拒绝服务。
修复方案:在__cpu_map_entry_alloc()返回前确保per-cpu kthread已正常运行,消除kthread_stop()的错误处理路径(因为修复后kthread_stop()始终返回0)。