In questo articolo affronterò una vulnerabilità che affligge i sistemi Linux, in particolare i file con il bit SUID settato.
Il bit SUID è uno speciale permesso che consente ad un eseguibile di operare con i permessi di root anche se viene eseguito da un utente con permessi inferiori. Il caso tipico di eseguibile con bit SUID è passwd, che può essere eseguito da tutti gli utenti e consente di modificare il file /etc/passwd e di cambiare la propria password.
Per spiegare la vulnerabilità mi servirò di una challenge sul sito Root-Me, all’indirizzo:
https://www.root-me.org/en/Challenges/App-Script/ELF32-System-1
La sfida consiste nel riuscire a leggere la password contenuta nel file al seguente percorso:
/challenge/app-script/ch11/.passwd
nella directory home è presente l’eseguibile ch11 che è il risultato del seguente codice:
#include <stdlib.h> #include <stdio.h> /* gcc -m32 -o ch11 ch11.c */ int main(void) { system("ls /challenge/app-script/ch11/.passwd"); return 0; }
Se lo eseguiamo così com’è ci restituirà il seguente risultato:
perchè esegue il comando ls (con i permessi di root).
Se noi però sostituiamo l’eseguibile ls con cat potremo vedere il file .passwd!
Vediamo innanzitutto se abbiamo i permessi di scrittura nella directory tmp:
Come si vede siamo riusciti a copiare l’eseguibile cat nella cartella tmp rinominandolo in ls, in modo che quando eseguiremo ch11 invece di eseguire ls manderemo in esecuzione cat!
L’unico problema è che di default Linux cerca gli eseguibili prima nelle directory /bin e /usr/bin, perciò solo se non trova ls in quelle directory le cerca altrove.
Restando così le cose il nostro eseguibile nella directory /tmp non verrà mai eseguito, a meno che non sfruttiamo una vulnerabilità relativa alla variabile d’ambiente $PATH, tramite la quale è possibile invertire l’ordine con il quale Linux cerca gli eseguibili nelle directory.
Possiamo perciò stabilire che l’eseguibile venga cercato per prima nella directory /tmp con il seguente comando:
export PATH=/tmp:$PATH
In questo modo quando lanceremo ch11, il sistema eseguirà la nostra copia di cat che abbiamo rinominato ls, cercandolo per prima nella directory /tmp:
Come si può vedere siamo riusciti a leggere il file .passwd anche senza avere i permessi per farlo!
Ci sono molti altri modi per sfruttare la falla ma questo è il più semplice.
La vulnerabilità del bit SUID è molto pericolosa e può portare alla totale compromissione del sistema perchè permette all’attaccante di eseguire codice o svolgere operazioni con i permessi di root.