
PoC para CVE-2026-23416 (linux kernel 6.17 – linux kernel 7 rc5) - vulnerabilidade descoberta por Antonius
mm/mseal: atualizar final do VMA corretamente ao mesclar
Vulnerabilidade descoberta por Antonius / Blue Dragon Security
| Campo | Detalhe |
|---|
| CVE ID | CVE-2026-23416 |
| Subsistema | mm/mseal — mm/vma.c |
| Afetado | Linux kernel 6.17 até 7.0-rc5 |
| Corrigido em | Linux 7.0-rc6, backports estáveis 6.18.21, 6.19.11 |
| Acesso necessário | Usuário não privilegiado (UID 1000, sem capacidades) |
| Syscalls usadas | memfd_create, mmap, mseal |
| Reprodutibilidade | 100% determinística, < 1 segundo |
| Reservado | 2026-01-13 |
| Publicado | 2026-04-02 |
O bug reside em mseal_apply() dentro de mm/mseal.c. Ao iterar sobre VMAs para aplicar a syscall mseal(2), a função rastreia a posição usando curr_start e curr_end:
/* Simplified pre-fix logic */
curr_end = vma->vm_end;
/* ... process VMA ... */
curr_start = curr_end; /* advance to next VMA */
O problema: vma_modify_flags() — chamada durante a iteração — pode mesclar VMAs, alterando vma->vm_end no local. Isso faz com que o valor de curr_end capturado antes da mesclagem fique obsoleto. Na próxima iteração, curr_start é definido como o agora obsoleto curr_end, produzindo um endereço inicial incorreto.
Em kernels de depuração (CONFIG_DEBUG_VM), esse estado inconsistente do vmg dispara:
VM_WARN_ON_VMG(middle &&
((middle != prev && vmg->start != middle->vm_start) ||
vmg->end > middle->vm_end))
em mm/vma.c:830, produzindo um WARNING do kernel.
Em kernels de produção (WARN compilado como no-op), o curr_start obsoleto prossegue silenciosamente — significando que VM_SEALED pode ser aplicado a um intervalo de endereços incorreto sem nenhum erro visível, minando a garantia de segurança que mseal(2) foi projetado para fornecer.
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 fires at line 830
/* BEFORE fix — mm/mseal.c mseal_apply() */
curr_end = vma->vm_end; // captured here
/* ... vma_modify_flags() may merge VMAs, changing vma->vm_end ... */
curr_start = curr_end; // stale! merge is not reflected
A correção define curr_end = vma->vm_end incondicionalmente em cada iteração após qualquer mesclagem potencial, e adicionalmente fixa curr_start/curr_end como valores const derivados do intervalo de entrada e dos limites do VMA:
/* AFTER fix */
curr_end = vma->vm_end; // unconditional, always fresh
O PoC constrói o seguinte layout antes da segunda chamada mseal():
[0x21da6000 - 0x21de5fff] VMA-A (fd2, MAP_SHARED|MAP_FIXED) ← VM_SEALED after step 1
[0x21de6000 - 0x21e82fff] VMA-B (fd2, MAP_SHARED|MAP_FIXED) ← NOT sealed
[0x21e83000 - 0x21e84fff] VMA-C (leftover)
A segunda mseal(m2, 0x70000) tem como alvo [0x21da6000 – 0x21e15fff], abrangendo VMA-A (selado) até VMA-B (não selado). Dentro de mseal_apply(), o curr_end obsoleto de VMA-A é usado como curr_start ao processar VMA-B, criando o estado vmg inconsistente.
memfd_create + mmap + mseal, nenhum CAP_* necessário.mseal(2) é uma primitiva de segurança — ela protege a imutabilidade do VMA. Um erro lógico em sua aplicação significa que VM_SEALED pode ser silenciosamente mal aplicado ao abranger VMAs com estados de selamento mistos.Arquivo: 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
Verifique dmesg por:
WARNING: CPU: X PID: Y at mm/vma.c:830 vma_merge_existing_range+0x...
CONFIG_DEBUG_VM=y para observar o VM_WARN_ON_VMG (em kernels de produção o bug ainda está presente, mas silencioso)Três commits de correção upstream (aplicados no 7.0-rc6 e backports estáveis):
| Commit | Tree |
|---|---|
40b3f4700e55 | stable |
83737e34b83a | stable |
2697dd8ae721 | stable |
Versões do kernel corrigidas: 7.0-rc6, 6.18.21, 6.19.11
| Data | Evento |
|---|---|
| 2026-01-13 | ID CVE reservado |
| 2026-04-02 | CVE publicado, commits de correção mesclados |
Antonius (@w1sdom)
Blue Dragon Security — Tangerang, Indonésia
GitHub: bluedragonsecurity
Este PoC é liberado para fins educacionais e de pesquisa.