Vulnerabilità bit SUID

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.