CVE-2026-23294CVE-2026-23294是Linux内核BPF子系统中的一个高危漏洞,主要影响PREEMPT_RT(实时)内核配置。该漏洞由于devmap组件中xdp_dev_bulk_queue的并发访问竞态条件导致。在PREEMPT_RT环境下,local_bh_disable()无法阻止内核抢占,使得同一CPU上的多个任务可以并发修改per-CPU队列。这可能导致双重释放、释放后使用、队列数据损坏及列表操作错误,进而引发内核崩溃或潜在的权限提升风险。
该漏洞的技术核心在于Linux内核在PREEMPT_RT模式下对BPF devmap处理的逻辑缺陷。在标准内核中,local_bh_disable()足以保证同一CPU上的软上下文不被抢占,从而保证bq_enqueue()和__dev_flush()对per-CPU变量bq的原子访问。然而在PREEMPT_RT配置下,local_bh_disable()仅调用migrate_disable(),并未禁止内核抢占,导致CFS调度器可以在bq_xmit_all()执行期间切换任务。具体攻击场景中,任务A在执行__dev_flush -> bq_xmit_all时,读取了bq->count并准备遍历传输。此时任务A被抢占,任务B在同一CPU上运行并进入bq_enqueue -> bq_xmit_all,它读取相同的count值,传输并释放了帧,随后将bq->count置零。当任务A恢复执行时,它继续操作已经释放的指针,导致释放后使用(UAF)或双重释放。此外,并发修改bq->count和bq->q[]也会导致数据损坏,以及在dev_rx/xdp_prog销毁期间的竞态导致帧被孤立。补丁通过引入local_lock_t锁机制,在bq_enqueue()和__dev_flush()中加锁,强制在PREEMPT_RT上对bq的访问进行串行化,从而修复该漏洞。