mm/mseal: 合并时正确更新 VMA 结束地址
漏洞发现者:Antonius / Blue Dragon Security
| 字段 | 详情 |
|---|---|
| CVE ID | CVE-2026-23416 |
| 子系统 | mm/mseal — mm/vma.c |
| 影响范围 | Linux 内核 6.17 至 7.0-rc5 |
| 修复版本 | Linux 7.0-rc6,稳定版回溯 6.18.21、6.19.11 |
| 所需权限 | 非特权用户(UID 1000,无 capabilities) |
| 使用的系统调用 | memfd_create、mmap、mseal |
| 可复现性 | 100% 确定性,< 1 秒 |
| 保留时间 | 2026-01-13 |
| 发布时间 | 2026-04-02 |
该漏洞存在于 mm/mseal.c 的 mseal_apply() 函数中。在遍历 VMA 以应用 mseal(2) 系统调用时,该函数使用 curr_start 和 curr_end 来跟踪位置:
/* 修复前的简化逻辑 */
curr_end = vma->vm_end;
/* ... 处理 VMA ... */
curr_start = curr_end; /* 前进到下一个 VMA */
问题在于:迭代过程中调用的 vma_modify_flags() 可以合并 VMA,从而原地修改 vma->vm_end。这使得合并前捕获的 curr_end 值过时。在下一次迭代中,curr_start 被设置为已经过时的 curr_end,导致起始地址错误。
在调试内核(CONFIG_DEBUG_VM)中,这种不一致的 vmg 状态会触发:
VM_WARN_ON_VMG(middle &&
((middle != prev && vmg->start != middle->vm_start) ||
vmg->end > middle->vm_end))
位于 mm/vma.c:830,产生内核 WARNING。
在生产内核(WARN 被编译为空操作)中,过时的 curr_start 会静默继续运行——这意味着 VM_SEALED 可能被错误地应用于不正确的地址范围,而没有任何可见的错误,破坏了 mseal(2) 本来设计要提供的安全保证。
mseal(2)
└─ do_mseal() [mm/mseal.c]
└─ mseal_apply()
└─ vma_modify_flags() [mm/vma.c]
└─ vma_modify()
└─ vma_merge_existing_range()
└─ VM_WARN_ON_VMG 在 830 行触发
/* 修复前 — mm/mseal.c mseal_apply() */
curr_end = vma->vm_end; // 此处捕获
/* ... vma_modify_flags() 可能合并 VMA,改变 vma->vm_end ... */
curr_start = curr_end; // 过时!合并未被反映
修复方案是:每次迭代中,在任何可能的合并之后无条件地将 curr_end 设置为 vma->vm_end,并额外将 curr_start/curr_end 作为从输入范围和 VMA 边界派生的常量值进行限制:
/* 修复后 */
curr_end = vma->vm_end; // 无条件,始终最新
PoC 在第二次 mseal() 调用前构建了以下布局:
[0x21da6000 - 0x21de5fff] VMA-A (fd2, MAP_SHARED|MAP_FIXED) ← 步骤 1 后已被 VM_SEALED
[0x21de6000 - 0x21e82fff] VMA-B (fd2, MAP_SHARED|MAP_FIXED) ← 未 seal
[0x21e83000 - 0x21e84fff] VMA-C (剩余)
第二次 mseal(m2, 0x70000) 的目标范围是 [0x21da6000 – 0x21e15fff],横跨 VMA-A(已 seal)和 VMA-B(未 seal)。在 mseal_apply() 内部,过时的 curr_end(来自 VMA-A)被用作处理 VMA-B 时的 curr_start,从而产生不一致的 vmg 状态。
memfd_create + mmap + mseal,无需 CAP_*。mseal(2) 是一种安全原语——它保护 VMA 的不可变性。在其应用过程中的逻辑错误意味着当横跨混合 seal 状态的 VMA 时,VM_SEALED 可能被静默错误应用。gcc -o poc cve-2026-23416-poc.c
./poc
CONFIG_DEBUG_VM 的调试内核)============================================
CVE-2026-23416-POC
发现者:Antonius / Blue Dragon Security
https://bluedragonsec.com
https://github.com/bluedragonsecurity
============================================
[iter 0]
[iter 1]
...
[+] WARNING 总共触发了 N 次
检查 dmesg 输出:
WARNING: CPU: X PID: Y at mm/vma.c:830 vma_merge_existing_range+0x...
CONFIG_DEBUG_VM=y 才能观察到 VM_WARN_ON_VMG(在生产内核上,该漏洞仍然存在,但静默)三个上游修复提交(已应用于 7.0-rc6 和稳定版回溯):
| 提交 | 树 |
|---|---|
40b3f4700e55 | stable |
已修复的内核版本: 7.0-rc6, 6.18.21, 6.19.11
| 日期 | 事件 |
|---|---|
| 2026-01-13 | CVE ID 保留 |
| 2026-04-02 | CVE 发布,修复提交合并 |
Antonius (@w1sdom)
Blue Dragon Security — 印度尼西亚,坦格朗
GitHub: bluedragonsecurity
此 PoC 仅供教育和研究用途发布。
83737e34b83a| stable |
2697dd8ae721 | stable |