Abbiamo ricevuto una segnalazione di bug (formulata come problema di sicurezza) per un programma, in cui si affermava che quando il programma crea file su disco, non verifica per prima cosa se esiste un collegamento simbolico sul percorso del file da creare. Per questo motivo, un utente malintenzionato può creare un collegamento simbolico, che il programma (quando viene eseguito da un altro utente) può provare a sovrascrivere, sovrascrivendo in tal modo un file a cui l'utente malintenzionato potrebbe altrimenti non avere accesso in scrittura.
Per illustrare, ecco un esempio con gcc, che è anche "vulnerabile" a questo problema:
- Eve invia ad Alice un file .tar.gz contenente un programma C. All'interno dell'archivio è
evil.c
ea.out
, che è un collegamento simbolico a/home/alice/.xinitrc
. - Sotto qualche pretesa, Eva chiede ad Alice di compilare il programma (e non fare nient'altro).
- Eve esegue
gcc evil.c
, che di per sé dovrebbe essere sicuro (escludendo buffer overflow ecc. nel compilatore). -
gcc
(tecnicamente il linker) proverà a scrivere il binario risultante ina.out
, quindi sovrascrivendo.xinitrc
di Alice. - La prossima volta che Alice avvia il suo server X, viene eseguito il codice di Eve.
Nel nostro caso, la situazione è molto simile a gcc - il programma crea file solo nella directory corrente (a meno che non sia detto altrimenti), con nomi prevedibili, e di per sé non esegue alcun codice dal suo input.
È qualcosa di cui i programmi come i compilatori devono preoccuparsi?