
Exploit de corrupción de caché de página act_pedit CVE-2026-46331, con corrección Alpine PIE
net/sched act_pedit corrupción de caché de página parcial-COW (culpable 899ee91156e5, presente v5.18 .. corregido v7.1-rc7). packet_edit_meme.c lo convierte en root local sin privilegios: un hijo userns CAP_NET_ADMIN sobrescribe los metadatos ELF almacenados en caché de un binario setuid-root con shellcode setgid(0)+setuid(0)+execve("/bin/sh").
make
./packet_edit_meme
./packet_edit_meme --ubuntu # AppArmor-gated Ubuntu: aa-exec bypass first
| Distribución | Kernel | Bandera | Resultado |
|---|---|---|---|
| RHEL 10.0 | 6.12.0 | (ninguna) | ROOT |
| Debian 13 trixie | 6.12.90+deb13.1 | (ninguna) | ROOT |
| Ubuntu 24.04.4 | 6.17.0-22 | --ubuntu | ROOT |
| Alpine edge | 7.0.10-0-stable | (ninguna) | ROOT |
Alpine Linux (musl) compila ejecutables PIE donde el segmento PT_LOAD ejecutable comienza en un desplazamiento de archivo ≥ 0x1000 — más allá del límite de 511 bytes del desplazamiento del encabezado TCP de pedit. El encabezado ELF y los encabezados de programa ocupan el primer PT_LOAD de solo lectura (desplazamiento de archivo 0). Este exploit adaptado:
Hace la página 0 ejecutable añadiendo PF_X al campo p_flags del primer PT_LOAD en el desplazamiento de archivo 0xB4 (phdr[2] + 4).
Divide el shellcode para evitar corromper encabezados de programa LOAD críticos:
e_entry → 0x28 (un campo e_shoff que el kernel no verifica en tiempo de ejecución).0x28: un jmp 0x1C8 de 5 bytes.0x1C8, sobrescribiendo encabezados de programa PT_NOTE que el kernel ignora durante la ejecución.Auto-descubre el objetivo en tiempo de ejecución mediante find / -xdev -type f -perm -4000 -user root en lugar de rutas codificadas. Se usa el primer binario ELF setuid-root legible globalmente encontrado — el /bin/su de Alpine (-> , ) se omite automáticamente porque no se puede abrir.
Ubuntu niega userns no privilegiados no confinados mediante dos 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 se re-ejecuta mediante aa-exec -p {trinity,chrome,flatpak} (perfiles que contienen una regla userns,).
| Ubuntu | userns | unconfined | aa-exec bypass |
|---|---|---|---|
| 24.04.4 | 1 | 0 | FUNCIONA |
| 26.04 | 1 | 1 | CERRADO |
Un 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