Tecniche: SymLink Attack

20 marzo 2006

Introduzione

Mettiamoci nei panni di un attaccante che volesse introdursi in un sistema informatico di tipo UNIX. La scelta tra i vari tipi di attacco è vasta, ma una possibilità interessante sarebbe potere modificare, in maniera conveniente, un file importante di configurazione, ad esempio /ETC/PASSWD. Ovviamente non è pensabile che lo possa fare direttamente, in quanto i files di configurazione di qualche rilievo sono protetti da scrittura, a volte anche da lettura, nei confronti degli utenti diversi da “root”. Per cui sarà costretto a sfruttare qualche bug di un’applicazione che opera con i privilegi di “root”. Anche in questo caso le possibilità sono molte, tra le queste c’è il tipo di attacco che andiamo ad analizzare, il SymLink Attack.

La causa

I sistemi UNIX hanno un tipo di file molto particolare i “symlink“, ovvero “symbolic link”, ovvero “collegamenti simbolici”. Per creare un “symlink” si usa:

$ ln -s /path/file_linkato /path/file_symlink

Tramite un symlink è possibile creare degli alias per qualunque files o directory presente sul sistema, in maniera molto più elastica che non usando un normale “hardlink“.

Questi ultimi sono semplicemente delle associazioni tra una etichetta (il nome del file o del link) e il numero identificativo “inode” del file su uno specifico filesystem, per cui soffrono di molte limitazioni, tra le quali, l’impossibilità di linkare directory, l’impossibilità di utilizzarli su filesystem diversi dai classici UNIX e l’impossibilità di linkare un file che stia su un’altra partizione o disco.

I symlink superano tutti questi problemi trattandosi di veri e propri files che contengono un riferimento al file di destinazione.

Alcune “system call” (ovvero chiamate di sistema - cioè funzioni utilizzate dal sistema operativo per svolgere le funzioni necessarie) agiscono direttamente sul file di link, ma la maggior parte agiscono sul file linkato di destinazione.

Tra le system call che operano sul file destinazione, anche se chiamate in riferimento al file di link, c’è “open”, che è utilizzata per la lettura e scrittura su file.

Quindi, riassumendo: se abbiamo un programma “PRINT” che vuole scrivere sul file “FILE_LINK”, che è un symlink al file “FILE_LINKATO”, succederà che “PRINT” scriverà su “FILE_LINKATO”.

Il problema

Se il file “FILE_LINKATO” appartiene a root e non ha permessi di scrittura per gli user, ad esempio:

-rw-r-r-  1 root   root    5650  3 mar  2004 file_linkato

potrà essere modificato solo dal primo, e quindi tramite un programma azionato da lui o che abbia il bit “SETUID” attivo. A parte ciò è comunque necessario che il programma punti, per le sue operazioni di scrittura, al file bersaglio. Sembrerebbe quindi una strada impercorribile per l’attaccante. Non è così!

Il problema nasce dal fatto che se il programma “PRINT”, azionato da root o con il bit setuid attivo, punta, per la scrittura, all’innocuo file “FILE_INNOCUO”:

-rw-r-r-  1 root   root    5650  3 mar  2004 file_innocuo

e l’attaccante riesce a sostituire quest’ultimo con un symlink che punta al suo vero bersaglio:

lrwxrwxrwx  1 user   user    16    3 mar  2004 file_innocuo -> /etc/passwd

otterrà lo scopo di sovrascrivere il file delle password! E ciò anche se il symlink appartiene ad un utente qualunque.

In condizioni normali però non è possibile per un utente sostituire un file che non gli appartiene, ma il discorso cambia se “FILE_INNOCUO non esiste già e deve essere creato dal programma di esempio “PRINT”. In tal caso se lo stesso, al momento di scrivere, trova il symlink, come detto sopra, il gioco è fatto. Ovviamente, per creare il symlink, presupposto necessario, è che deve essere consentita la scrittura nella directory in cui deve stare.

Se vuoi aggiornamenti su Tecniche: SymLink Attack inserisci la tua e-mail nel box qui sotto:
 
X
Se vuoi aggiornamenti su Tecniche: SymLink Attack

inserisci la tua e-mail nel box qui sotto:

Ho letto e acconsento l'informativa sulla privacy

Acconsento al trattamento di cui al punto 3 dell'informativa sulla privacy