From 94128b2e2e19d3fe398e7c53f5f8d72767c6b1d9 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Sun, 26 Aug 2018 22:18:26 +0200 Subject: [PATCH] Correction and references --- filedir.tex | 75 ++++++++++++++++++++++++++++++----------------------- procadv.tex | 10 +++---- 2 files changed, 47 insertions(+), 38 deletions(-) diff --git a/filedir.tex b/filedir.tex index 4eda60b..776ff47 100644 --- a/filedir.tex +++ b/filedir.tex @@ -2660,13 +2660,12 @@ resta la stessa quando viene creato un processo figlio (vedi sez.~\ref{sec:proc_fork}), la directory di lavoro della shell diventa anche la directory di lavoro di qualunque comando da essa lanciato. -Dato che è il kernel che tiene traccia per ciascun processo -dell'\textit{inode} della directory di lavoro, per ottenerne il -\textit{pathname} occorre usare una apposita funzione, -\funcd{getcwd},\footnote{con Linux \func{getcwd} è una \textit{system call} - dalla versione 2.1.9, in precedenza il valore doveva essere ottenuto tramite - il filesystem \texttt{/proc} da \procfile{/proc/self/cwd}.} il cui prototipo -è: +Dato che è il kernel che tiene traccia dell'\textit{inode} della directory di +lavoro di ciascun processo, per ottenerne il \textit{pathname} occorre usare +una apposita funzione, \funcd{getcwd},\footnote{con Linux \func{getcwd} è una + \textit{system call} dalla versione 2.1.9, in precedenza il valore doveva + essere ottenuto tramite il filesystem \texttt{/proc} da + \procfile{/proc/self/cwd}.} il cui prototipo è: \begin{funcproto}{ \fhead{unistd.h} @@ -2685,7 +2684,8 @@ dell'\textit{inode} della directory di lavoro, per ottenerne il \item[\errcode{ERANGE}] l'argomento \param{size} è più piccolo della lunghezza del \textit{pathname}. \end{errlist} - ed inoltre \errcode{EFAULT} nel suo significato generico.} + ed inoltre \errcode{EFAULT} ed \errcode{ENOMEM} nel loro significato + generico.} \end{funcproto} La funzione restituisce il \textit{pathname} completo della directory di @@ -2696,13 +2696,19 @@ buffer deve essere sufficientemente largo da poter contenere il esso ecceda le dimensioni specificate con \param{size} la funzione restituisce un errore. -Si può anche specificare un puntatore nullo come -\param{buffer},\footnote{questa è un'estensione allo standard POSIX.1, - supportata da Linux e dalla \acr{glibc}.} nel qual caso la stringa sarà -allocata automaticamente per una dimensione pari a \param{size} qualora questa -sia diversa da zero, o della lunghezza esatta del \textit{pathname} -altrimenti. In questo caso ci si deve ricordare di disallocare la stringa con -\func{free} una volta cessato il suo utilizzo. +A partire dal kernel Linux 2.6.36 il nome può avere come prefisso la stringa +\texttt{(unreachable)} se la directory di lavoro resta fuori dalla directory +radice del processo dopo un \func{chroot} (torneremo su questi argomenti in +sez.~\ref{sec:file_chroot}); pertanto è sempre opportuno controllare il primo +carattere della stringa restituita dalla funzione per evitare di interpreare +mare un \textit{pathname} irraggiungibile. + +Come estensione allo standard POSIX.1, supportata da Linux e dalla +\acr{glibc}, si può anche specificare un puntatore nullo come \param{buffer} +nel qual caso la stringa sarà allocata automaticamente per una dimensione pari +a \param{size} qualora questa sia diversa da zero, o della lunghezza esatta +del \textit{pathname} altrimenti. In questo caso ci si deve ricordare di +disallocare la stringa con \func{free} una volta cessato il suo utilizzo. Un uso comune di \func{getcwd} è quello di salvarsi la directory di lavoro all'avvio del programma per poi potervi tornare in un tempo successivo, un @@ -2721,15 +2727,15 @@ detto che il buffer sia sufficiente a contenere il nome del file, e questa è la ragione principale per cui questa funzione è deprecata, e non la tratteremo. Una seconda funzione usata per ottenere la directory di lavoro è -\funcm{get\_current\_dir\_name},\footnote{la funzione è una estensione GNU e - presente solo nella \acr{glibc}.} che non prende nessun argomento ed è -sostanzialmente equivalente ad una \code{getcwd(NULL, 0)}, con la differenza -che se disponibile essa ritorna il valore della variabile di ambiente -\envvar{PWD}, che essendo costruita dalla shell può contenere un -\textit{pathname} comprendente anche dei collegamenti simbolici. Usando -\func{getcwd} infatti, essendo il \textit{pathname} ricavato risalendo -all'indietro l'albero della directory, si perderebbe traccia di ogni passaggio -attraverso eventuali collegamenti simbolici. +\funcm{get\_current\_dir\_name} (la funzione è una estensione GNU e presente +solo nella \acr{glibc}) che non prende nessun argomento ed è sostanzialmente +equivalente ad una \code{getcwd(NULL, 0)}, con la differenza che se +disponibile essa ritorna il valore della variabile di ambiente \envvar{PWD}, +che essendo costruita dalla shell può contenere un \textit{pathname} +comprendente anche dei collegamenti simbolici. Usando \func{getcwd} infatti, +essendo il \textit{pathname} ricavato risalendo all'indietro l'albero della +directory, si perderebbe traccia di ogni passaggio attraverso eventuali +collegamenti simbolici. Per cambiare la directory di lavoro si può usare la funzione di sistema \funcd{chdir}, equivalente del comando di shell \cmd{cd}, il cui nome sta @@ -2745,11 +2751,11 @@ appunto per \textit{change directory}, il suo prototipo è: \begin{errlist} \item[\errcode{EACCES}] manca il permesso di ricerca su uno dei componenti di \param{pathname}. + \item[\errcode{ENAMETOOLONG}] il nome indicato in \param{path} è troppo lungo. \item[\errcode{ENOTDIR}] non si è specificata una directory. \end{errlist} - ed inoltre \errval{EFAULT}, \errval{EIO}, \errval{ELOOP}, - \errval{ENAMETOOLONG}, \errval{ENOENT} e \errval{ENOMEM} nel loro - significato generico.} + ed inoltre \errval{EFAULT}, \errval{EIO}, \errval{ELOOP}, \errval{ENOENT} e + \errval{ENOMEM} nel loro significato generico.} \end{funcproto} La funzione cambia la directory di lavoro in \param{pathname} ed @@ -2789,8 +2795,8 @@ ha il permesso di attraversamento alla directory specificata da \param{fd}. Finora abbiamo parlato esclusivamente di file, directory e collegamenti simbolici, ma in sez.~\ref{sec:file_file_types} abbiamo visto che il sistema prevede anche degli altri tipi di file, che in genere vanno sotto il nome -generico di \textsl{file speciali}, come i file di dispositivo, le \textit{fifo} ed i -socket. +generico di \textsl{file speciali}, come i file di dispositivo, le +\textit{fifo} ed i socket. La manipolazione delle caratteristiche di questi file speciali, il cambiamento di nome o la loro cancellazione può essere effettuata con le stesse funzioni @@ -2855,9 +2861,9 @@ dispositivo usando questa funzione (il processo deve avere la capacità la specifica \func{mkfifo}.} l'uso per la creazione di un file ordinario, di una \textit{fifo} o di un socket è consentito anche agli utenti normali. -I nuovi \textit{inode} creati con \func{mknod} apparterranno al proprietario e -al gruppo del processo (usando \ids{UID} e \ids{GID} del gruppo effettivo) che -li ha creati a meno non sia presente il bit \acr{sgid} per la directory o sia +Gli \textit{inode} creati con \func{mknod} apparterranno al proprietario e al +gruppo del processo (usando \ids{UID} e \ids{GID} del gruppo effettivo) che li +ha creati a meno non sia presente il bit \acr{sgid} per la directory o sia stata attivata la semantica BSD per il filesystem (si veda sez.~\ref{sec:file_ownership_management}) in cui si va a creare l'\textit{inode}, nel qual caso per il gruppo verrà usato il \ids{GID} del @@ -2983,7 +2989,10 @@ attaccante allora potrà sfruttarla con quello che viene chiamato ``\textit{symlink attack}'' dove nell'intervallo fra la generazione di un nome e l'accesso allo stesso, viene creato un collegamento simbolico con quel nome verso un file diverso, ottenendo, se il programma sotto attacco ne ha la -capacità, un accesso privilegiato. +capacità, un accesso privilegiato.\footnote{dal kernel 3.6 sono state + introdotte delle contromisure, illustrate in + sez.~\ref{sec:procadv_security_misc}, che rendono impraticabili questo tipo + di attacchi ma questa non è una buona scusa per ignorare il problema.} \itindend{symlink~attack} diff --git a/procadv.tex b/procadv.tex index 0b9dd0a..b9e18d2 100644 --- a/procadv.tex +++ b/procadv.tex @@ -2137,11 +2137,11 @@ alcune opzioni di controllo attivabili via \func{sysctl} o il filesystem Questa funzionalità consente di rendere impraticabili alcuni attacchi in cui si approfitta di una differenza di tempo fra il controllo e l'uso di un - file, utilizzando quella che viene usualmente chiamata una - \itindex{symlink~race} \textit{symlink race}.\footnote{si tratta di un - sottoinsieme di quella classe di attacchi chiamata genericamente - \textit{TOCTTOU}, acronimo appunto di \textit{Time of check to time of - use}.} + file, ed in particolare quella classe di attacchi viene usualmente chiamati + \textit{symlink attack},\footnote{si tratta di un sottoinsieme di quella + classe di attacchi chiamata genericamente \textit{TOCTTOU}, acronimo + appunto di \textit{Time of check to time of use}.} di cui abbiamo parlato + in sez.~\ref{sec:file_temp_file}. Un possibile esempio di questo tipo di attacco è quello contro un programma che viene eseguito per conto di un utente privilegiato (ad esempio un -- 2.30.2