
Exploit di corruzione page-cache act_pedit CVE-2026-46331, con fix Alpine PIE
Corruzione della page-cache per COW parziale in act_pedit di net/sched (commit responsabile 899ee91156e5,
presente dalla v5.18 .. corretta nella v7.1-rc7). packet_edit_meme.c la trasforma in
root locale non privilegiata: un processo figlio con CAP_NET_ADMIN in un userns sovrascrive i metadati
ELF in cache di 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
| Distribuzione | Kernel | Flag | Risultato |
|---|---|---|---|
| RHEL 10.0 | 6.12.0 | (none) | ROOT |
| Debian 13 trixie | 6.12.90+deb13.1 | (none) | ROOT |
| Ubuntu 24.04.4 | 6.17.0-22 | --ubuntu | ROOT |
| Alpine edge | 7.0.10-0-stable | (none) | ROOT |
Alpine Linux (musl) compila eseguibili PIE in cui il segmento PT_LOAD eseguibile
inizia a offset di file ≥ 0x1000 — oltre il limite di 511 byte dell'offset di intestazione TCP
di pedit. L'intestazione ELF e le intestazioni di programma occupano il primo PT_LOAD
read-only (offset file 0). Questo exploit adattato:
Rende eseguibile la pagina 0 aggiungendo PF_X al campo p_flags del primo PT_LOAD
all'offset di file 0xB4 (phdr[2] + 4).
Divide lo shellcode per evitare di corrompere i program header LOAD critici:
e_entry → 0x28 (un campo e_shoff che il kernel non controlla al momento dell'exec).0x28: un jmp 0x1C8 di 5 byte.0x1C8, sovrascrivendo i program header PT_NOTE
che il kernel ignora durante l'exec.Auto-scopre il target a runtime tramite find / -xdev -type f -perm -4000 -user root
invece di percorsi hardcodati. Viene usato il primo binario ELF setuid-root leggibile da tutti
trovato — /bin/su di Alpine (-> /bin/bbsuid, ) viene saltato automaticamente
perché non può essere aperto.
Ubuntu nega la creazione di userns non privilegiati per processi unconfined tramite due sysctl:
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 riesegue tramite aa-exec -p {trinity,chrome,flatpak} (profili che
includono una regola userns,).
| Ubuntu | userns | unconfined | bypass aa-exec |
|---|---|---|---|
| 24.04.4 | 1 | 0 | FUNZIONA |
| 26.04 | 1 | 1 | CHIUSO |
Un cross-compilatore statico x86_64-linux-gnu:
# Debian / Ubuntu
apt install gcc-x86-64-linux-gnu
# Alpine
apk add gcc musl-dev
---s--x--x