Guida I permessi su Unix: SUID

22 Febbraio 2022
475
42
353
350
Ultima modifica:
SUID, EID & ID
Il bit SUID (Set User ID) permette di eseguire un file con l'ID dell'owner, viene impostato tramite chmod con l'attributo s:
Bash:
chmod u+s <file>
Un esempio e' il file /bin/chsh, facciamo ls per capire meglio:
Bash:
-rwsr-xr-x 1 root root 35056 Jul  3 18:48 /bin/chsh
Esso permette di cambiare la shell dell'utente corrente modificando il file /etc/passwd, il proprietario di entrambi i file e' root, questo vuol dire che l'utente normale non puo' usare /bin/chsh e nemmeno modificare manualmente il file /etc/passwd, in nostro soccorso arriva il bit SUID, grazie a questo il programma chsh verra' eseguito con i priviliegi di root qualunque sia l'utente che lo esegue, riuscendo cosi' a modificare il file /etc/passwd.

L'ID utente e' un numero che identifica l'utente all'interno del sistema, memset ha ID 1000 e root ha ID 0, quando avvio un programma con memset questo girera' con ID 1000 (di conseguenza con i permessi di memset), ma nel momento che avvio un software in cui e' abilitato il SUID questa regola cambia, viene impostato L'EID (Effective UID), che appartiene all'owner e il Real UID, che appartiene all'utente che avvia il programma.
Quindi /bin/chsh viene eseguito con EID 0 e RUID 1000, per capire meglio guardiamo questo programma in C:
C:
#include <stdio.h>

int main () {
 
    printf("ID: %d\n", getuid()); // Stampa l'ID corrente.
    printf("EID: %d\n", geteuid()); // Stampa l'EID corrente.
 
    return 0;
}
Compiliamolo con gcc e runniamolo, l'output mostrera' in entrambi i campi 1000:
Bash:
void suid $ ll suid
-rwxr-xr-x 1 memset memset 20480 Sep 26 19:21 suid
void suid $ ./suid
ID: 1000
EID: 1000
void suid $ sudo chown root:root suid
void suid $ sudo chmod u+s suid
void suid $ ./suid
ID: 1000
EID: 0
void suid $
Con i permessi standard l'ID e l'EID combaciano, ma attivando il SUID e cambiando l'owner a root:root no, L'ID e' rimasto 1000, ma l'EID (quello che importa a noi ora) e' diventato 0, il processo girera' sotto l'EID, quindi con privilegi di root, ovvero l'owner.
Fate attenzione perche' gli script interpretati (quelli con lo shabang #!) sono esonerati dal SUID per questioni di sicurezza (per approfondire qui), vediamo come si comporta lo stesso programma in Python:
Bash:
void suid $ ll suid.py
-rwxr-xr-x 1 memset memset 86 Sep 26 19:10 suid.py
void suid $ ./suid.py
ID: 1000
EID: 1000
void suid $ sudo chown root:root suid.py
void suid $ sudo chmod u+s suid.py
void suid $ ll suid.py
-rwsxr-xr-x 1 root root 86 Sep 26 19:10 suid.py
void suid $ ./suid.py
ID: 1000
EID: 1000
void suid $ cat suid.py
#! /bin/python3

import os

print(f"ID: {os.getuid()}")
print(f"EID: {os.geteuid()}")
Non cambia niente, l'EID resta uguale all'ID e viceversa.

Torniamo a parlare di chsh e proviamo a levare il bit in questione:
Bash:
void ~ $ cat /etc/passwd | grep memset
memset:x:1000:1000::/home/memset:/bin/bash
void ~ $ ls -l /bin/chsh
-rwsr-xr-x 1 root root 35056 Jul  3 18:48 /bin/chsh
void ~ $ chsh
Changing shell for memset.
Password:
New shell [/bin/bash]: /bin/sh
Shell changed.
void ~ $ cat /etc/passwd | grep memset
memset:x:1000:1000::/home/memset:/bin/sh
void ~ $ sudo chmod u-s /bin/chsh
void ~ $ ls -l /bin/chsh
-rwxr-xr-x 1 root root 35056 Jul  3 18:48 /bin/chsh
void ~ $ chsh
Changing shell for memset.
Password:
New shell [/bin/sh]: /bin/bash
chsh: setpwnam failed
Shell *NOT* changed.  Try again later.: Permission denied
void ~ $ cat /etc/passwd | grep memset
memset:x:1000:1000::/home/memset:/bin/sh
Cattiamo il file /etc/passwd greppando la stringa inerente all'utente memset, la shell predefinita' e' bash, con ls -l controlliamo i permessi, il SUID e' attivato quindi procediamo a cambiare shell mettendo sh, cattiamo nuovamente il file passwd per far vedere che la stringa e' cambiata, ora e' presente :/home/memset:/bin/sh invece di :/home/memset:/bin/bash, togliamo il bit SUID con sudo chmod u-s /bin/chsh e ls per una "conferma", infine ridiamo chsh, abbiamo un errore coi permessi! in quanto lo stiamo facendo girare con l'ID di memset, che non possiede i permessi per modificare in /etc.

Conclusione
Spero che con questi piccoli esempi il concetto di bit SUID si sia capito, in caso di dubbi o altro lasciate un commento.
Un sistema Unix senza i permessi sarebbe come un mondo senza leggi, chiunque potrebbe fare quello che vuole.
Tuttavia il bit SUID se non viene usato correttamente puo' causare problemi come privilege escalation (che vedremo prossimamente), non ne abusiamo e stiamo attenti ad utilizzarlo. Grazie dell'attenzione.

Preso spunto: The Art Of Exploitation