CVE-2026-97941
mm/slab:在 __slab_try_return_freelist() 中获取 n->list_lock 以避免竞态
- 已发布
- 2026年9月25日
- 已更新
- 2026年10月19日
- 分配 CNA
- Linux
- 观察到的证据
- 2026年11月4日
初级CVSS
nvd · CVSS 3.1
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H低 · 未来 30 天
- 百分位
- 6.8%
- 型号日期
- 2026年11月4日
EPSS 是统计估计,而不是确定性或影响衡量标准。将其与 CVSS、KEV 状态、暴露程度和您的环境相结合。
总结
在 Linux 内核中,以下漏洞已被修复:mm/slab:在 __slab_try_return_freelist() 中获取 n->list_lock 以避免竞态。提交 ba7425312607(“mm, slab: add an optimistic __slab_try_return_freelist()”)错误地假设只要 slab->freelist 为 NULL 且 cmpxchg 成功,就没有人向该 slab 释放过对象。然而,正如 Hyunwoo Kim 所报告的那样 [1],其他 CPU 可能已经向该 slab 释放了一个对象,将该 slab 插入到 partial 列表中,然后从该 slab 分配了一个对象,并且正在 n->list_lock 的保护下从列表中移除该 slab 的过程中。由于 __refill_objects_node() 在 n->list_lock 之外将 slab 放回 pc.slabs,它可能会在该 slab 正被并发地从 n->partial 中移除时将其插入到该列表中。这导致了链表损坏 [1]:list_add corruption. next->prev should be prev (ffff888100000248), but was dead000000000122. (next=ffffea000416e410). kernel BUG at lib/list_debug.c:29! Oops: invalid opcode: 0000 [#1] SMP NOPTI CPU: 1 UID: 65534 PID: 144 Comm: poc Not tainted 7.2.0-16172-gcf72cbb39da8-dirty #1 PREEMPT(lazy) RIP: 0010:__list_add_valid_or_report+0x80/0xd0 ... Call Trace: alloc_from_new_slab+0x183/0x300 ___slab_alloc+0x31c/0x890 __kmalloc_noprof+0x3d4/0x800 lsm_blob_alloc+0x2d/0x50 security_msg_msg_alloc+0x26/0x90 load_msg+0x1aa/0x210 do_msgsnd+0x91/0x800 do_syscall_64+0x109/0x5d0 entry_SYSCALL_64_after_hwframe+0x77/0x7f ... Kernel panic - not syncing: Fatal exception 这是一个典型的 ABA 问题:cmpxchg 成功,但自 __refill_objects_node() 从该 slab 取走 freelist 以来,状态已经发生了变化。正如 Vlastimil Babka 所提到的那样 [2],由于 get_partial_node_bulk() 中对 slab->counters 的竞态读取,返回多个 slab 的情况应该很少见。因此,与其引入额外的复杂性,不如在最坏情况下两次获取和释放 n->list_lock。将 slab 直接返回到 partial 列表,并在 cmpxchg 和 add_partial() 期间持有 n->list_lock。这与提交 ba7425312607 的初始版本类似 [3]。由于链表操作由 n->list_lock 串行化,这足以避免该竞态。在此过程中,既然该条件已不太可能发生,就恢复 unlikely() 提示。
来源
CVE-2026-97941 官方 PoC 的 ARM64 Android 移植版,该漏洞为 SLAB 子系统内核漏洞,针对 7.0/7.2 内核移植了竞态时序和堆布局。
负责任的使用
仅在您拥有或有权测试的系统上使用漏洞信息。 Kitploit 链接到公共研究元数据,并且不存储漏洞代码或恶意负载。