
PoC для CVE-2026-23416 (ядро Linux 6.17 – ядро Linux 7 rc5) - уязвимость, обнаруженная Antonius
mm/mseal: обновление конца VMA при слиянии исправлено
Уязвимость обнаружена Antonius / Blue Dragon Security
| Поле | Детали |
|---|---|
| CVE ID | CVE-2026-23416 |
| Подсистема | mm/mseal — mm/vma.c |
| Затрагивает | Linux kernel 6.17 – 7.0-rc5 |
| Исправлено в | Linux 7.0-rc6, стабильные бэкпорты 6.18.21, 6.19.11 |
| Требуемый доступ | Непривилегированный пользователь (UID 1000, без привилегий) |
| Используемые системные вызовы | memfd_create, mmap, mseal |
| Воспроизводимость | 100% детерминировано, < 1 секунды |
| Зарезервирован | 2026-01-13 |
| Опубликован | 2026-04-02 |
Ошибка находится в mseal_apply() внутри mm/mseal.c. При переборе 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, порождая kernel WARNING.
В рабочих ядрах (WARN скомпилирован в no-op) устаревший 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 как const значения, полученные из входного диапазона и границ VMA:
/* ПОСЛЕ исправления */
curr_end = vma->vm_end; // безусловно, всегда свежее
PoC создаёт следующую структуру перед вторым вызовом mseal():
[0x21da6000 - 0x21de5fff] VMA-A (fd2, MAP_SHARED|MAP_FIXED) ← VM_SEALED после шага 1
[0x21de6000 - 0x21e82fff] VMA-B (fd2, MAP_SHARED|MAP_FIXED) ← НЕ запечатана
[0x21e83000 - 0x21e84fff] VMA-C (остаток)
Второй вызов mseal(m2, 0x70000) нацелен на диапазон [0x21da6000 – 0x21e15fff], охватывающий VMA-A (запечатанную) и VMA-B (не запечатанную). Внутри mseal_apply() устаревший curr_end от VMA-A используется как curr_start при обработке VMA-B, создавая несогласованное состояние vmg.
memfd_create + mmap + mseal, никаких CAP_* не нужно.mseal(2) — это примитив безопасности — он защищает неизменность VMA. Логическая ошибка в его применении означает, что VM_SEALED может быть незаметно применён неправильно при охвате VMA со смешанным состоянием запечатывания.Файл: cve-2026-23416-poc.c
gcc -o poc cve-2026-23416-poc.c
./poc
CONFIG_DEBUG_VM)============================================
CVE-2026-23416-POC
Discovered by : Antonius / Blue Dragon Security
https://bluedragonsec.com
https://github.com/bluedragonsecurity
============================================
[iter 0]
[iter 1]
...
[+] WARNING triggered N times total
Проверьте 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 |
83737e34b83a | stable |
2697dd8ae721 | 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 опубликован в образовательных и исследовательских целях.