
Exploit de corruption de cache de page CVE-2026-46331 act_pedit, avec correctif Alpine PIE
net/sched act_pedit corruption partielle du cache de pages par COW (coupable 899ee91156e5,
présent de v5.18 à v7.1-rc7). packet_edit_meme.c en fait un root local non privilégié :
un enfant userns avec CAP_NET_ADMIN écrase les métadonnées ELF mises en cache d'un binaire
setuid-root avec du shellcode setgid(0)+setuid(0)+execve("/bin/sh").
make
./packet_edit_meme
./packet_edit_meme --ubuntu # Ubuntu avec AppArmor : contournement d'abord aa-exec
| Distribution | Noyau | Drapeau | Résultat |
|---|---|---|---|
| RHEL 10.0 | 6.12.0 | (aucun) | ROOT |
| Debian 13 trixie | 6.12.90+deb13.1 | (aucun) | ROOT |
| Ubuntu 24.04.4 | 6.17.0-22 | --ubuntu | ROOT |
| Alpine edge | 7.0.10-0-stable | (aucun) | ROOT |
Alpine Linux (musl) compile des exécutables PIE où le segment PT_LOAD exécutable
commence à un décalage de fichier ≥ 0x1000 — au-delà de la limite de décalage
d'en-tête TCP pedit de 511 octets. L'en-tête ELF et les en-têtes de programme
occupent le premier PT_LOAD en lecture seule (décalage de fichier 0). Cette
adaptation de l'exploit :
Rend la page 0 exécutable en ajoutant PF_X au champ p_flags du premier
PT_LOAD au décalage de fichier 0xB4 (phdr[2] + 4).
Divise le shellcode pour éviter de corrompre les en-têtes de programme LOAD critiques :
e_entry → 0x28 (un champ e_shoff que le noyau ne vérifie pas lors
de l'exécution).0x28 : un jmp 0x1C8 de 5 octets.0x1C8, écrasant les en-têtes de
programme PT_NOTE que le noyau ignore pendant l'exécution.Découvre automatiquement la cible à l'exécution via
find / -xdev -type f -perm -4000 -user root au lieu de coder en dur les
chemins. Le premier binaire ELF setuid-root lisible par tous trouvé est
utilisé — /bin/su d'Alpine (-> , ) est ignoré
automatiquement car il ne peut pas être ouvert.
Ubuntu refuse les userns non privilégiés non confinés via deux sysctls :
kernel.apparmor_restrict_unprivileged_userns # refuse la création d'userns non confinés
kernel.apparmor_restrict_unprivileged_unconfined # force le change_profile non confiné vers STACK,
# donc un profil permissif aa-exec ne peut pas
# se défaire de la restriction userns
--ubuntu se réexécute via aa-exec -p {trinity,chrome,flatpak} (profils qui
portent une règle userns,).
| Ubuntu | userns | non confiné | contournement aa-exec |
|---|---|---|---|
| 24.04.4 | 1 | 0 | FONCTIONNE |
| 26.04 | 1 | 1 | FERMÉ |
Un compilateur croisé statique x86_64-linux-gnu :
# Debian / Ubuntu
apt install gcc-x86-64-linux-gnu
# Alpine
apk add gcc musl-dev
/bin/bbsuid---s--x--x