5465 Total CVEs
26 Years
GitHub
README.md
Rendering markdown...
POC / desc.md MD
**[UPDATE — CVE-2026-23416 now officially published 2026-04-02]**

---

**Status:** CVE reserved 2026-01-13, officially published 2026-04-02 by Linux kernel CNA.

The CVE is now live:
- https://www.cve.org/CVERecord?id=CVE-2026-23416
- https://nvd.nist.gov/vuln/detail/CVE-2026-23416

PoC + README published:
- https://github.com/bluedragonsecurity/CVE-2026-23416-POC

Medium writeup:
- https://medium.com/@w1sdom/cve-2026-23416-poc-affecting-linux-kernel-6-17-linux-kernel-7-0-rc-5-457afc9ad9e3

---

**Upstream fix description (from commit message):**

The official fix title is `mm/mseal: update VMA end correctly on merge`. The upstream commit clarifies the root cause at the loop level: `mseal_apply()` stores `curr_end = vma->vm_end`, then on the next iteration sets `curr_start = curr_end` to advance. But `vma_modify_flags()` can merge VMAs mid-loop, making `curr_end` stale — so `curr_start` on the next iteration ends up incorrect. This is the same inconsistency that surfaces as the `vmg->start != middle->vm_start` assertion failure described in the original post, just described from the loop variable perspective rather than the vmg state perspective.

Fix: set `curr_end = vma->vm_end` unconditionally on each iteration, and clamp `curr_[start/end]` as `const` values. Applied in 7.0-rc6.

Fix commits (three stable backports):
- `40b3f4700e5535fbe74738cebb9379a40ec66bed`
- `83737e34b83a23b2a9bcf586b058b2c2a54c7c6b`
- `2697dd8ae721db4f6a53d4f4cbd438212a80f8dc`

Fixed in: **7.0-rc6**, **6.18.21**, **6.19.11**

---

**Confirmed dmesg output on Linux 7.0.0-rc5 (actual kernel, not QEMU mock):**

```
[237.650564]  vma_modify_flags+0x24c/0x3c0
[237.650599]  ? __pfx_vma_modify_flags+0x10/0x10
[237.650662]  do_mseal+0x489/0x860
[237.650738]  ? __pfx_do_mseal+0x10/0x10
[237.650874]  __x64_sys_mseal+0x73/0xb0
[237.650907]  do_syscall_64+0x111/0x690
[237.650933]  entry_SYSCALL_64_after_hwframe+0x77/0x7f
...
[237.651014]  RDX: 0000000000000000  RSI: 0000000000070000  RDI: 0000000021da6000
...
Linux robohax-standardpc 7.0.0-rc5 #1 SMP PREEMPT_DYNAMIC Wed Mar 25 05:31:07 EDT 2026 x86_64
```

`RDI=0x21da6000` is the mseal start (m2), `RSI=0x70000` is the length — exactly matching PoC step 2. Stack trace confirms the full call path: `mseal(2)` → `do_mseal()` → `vma_modify_flags()`.