Trattati i protected symlinks
[gapil.git] / procadv.tex
index 7c88a71d883bd1038953039c64d47cdf17c3d9f6..2859e8b0f6529864d8c424edae9e385e6e23874a 100644 (file)
@@ -14,7 +14,7 @@ I/O ecc.
 \section{Funzioni di gestione e controllo}
 \label{sec:proc_manage_control}
 
 \section{Funzioni di gestione e controllo}
 \label{sec:proc_manage_control}
 
-In questa sezione prenderemo in esame alcune specifice \textit{system call}
+In questa sezione prenderemo in esame alcune specifiche \textit{system call}
 dedicate al controllo processi sia per quanto riguarda l'impostazione di
 caratteristiche specialistiche, che per quanto riguarda l'analisi ed il
 controllo della loro esecuzione.
 dedicate al controllo processi sia per quanto riguarda l'impostazione di
 caratteristiche specialistiche, che per quanto riguarda l'analisi ed il
 controllo della loro esecuzione.
@@ -25,7 +25,7 @@ controllo della loro esecuzione.
 Benché la gestione ordinaria dei processi possa essere effettuata attraverso
 le funzioni che abbiamo già esaminato nei capitoli \ref{cha:process_interface}
 e \ref{cha:process_handling}, esistono una serie di proprietà e
 Benché la gestione ordinaria dei processi possa essere effettuata attraverso
 le funzioni che abbiamo già esaminato nei capitoli \ref{cha:process_interface}
 e \ref{cha:process_handling}, esistono una serie di proprietà e
-caratteristiche specifiche dei proecessi per la cui gestione è stata
+caratteristiche specifiche dei processi per la cui gestione è stata
 predisposta una apposita \textit{system call} che fornisce una interfaccia
 generica per tutte le operazioni specialistiche. La funzione di sistema è
 \funcd{prctl} ed il suo prototipo è:\footnote{la funzione non è standardizzata
 predisposta una apposita \textit{system call} che fornisce una interfaccia
 generica per tutte le operazioni specialistiche. La funzione di sistema è
 \funcd{prctl} ed il suo prototipo è:\footnote{la funzione non è standardizzata
@@ -225,11 +225,11 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC.
 
 \item[\constd{PR\_SET\_SECCOMP}] Attiva il \textit{secure computing mode} per
   il processo corrente. Introdotta a partire dal kernel 2.6.23 la funzionalità
 
 \item[\constd{PR\_SET\_SECCOMP}] Attiva il \textit{secure computing mode} per
   il processo corrente. Introdotta a partire dal kernel 2.6.23 la funzionalità
-  è stata ulteriorimente estesa con il kernel 3.5, salvo poi diventare un
+  è stata ulteriormente estesa con il kernel 3.5, salvo poi diventare un
   sottoinsieme della \textit{system call} \func{seccomp} a partire dal kernel
   3.17. Prevede che si indichi per \param{arg2} il valore
   \const{SECCOMP\_MODE\_STRICT} (unico possibile fino al kernel 2.6.23) per
   sottoinsieme della \textit{system call} \func{seccomp} a partire dal kernel
   3.17. Prevede che si indichi per \param{arg2} il valore
   \const{SECCOMP\_MODE\_STRICT} (unico possibile fino al kernel 2.6.23) per
-  selezionare il cosidetto \textit{strict mode} o, dal kernel 3.5,
+  selezionare il cosiddetto \textit{strict mode} o, dal kernel 3.5,
   \const{SECCOMP\_MODE\_FILTER} per usare il \textit{filter mode}. Tratteremo
   questa opzione nei dettagli più avanti, in sez.~\ref{sec:procadv_seccomp},
   quando affronteremo l'argomento del \textit{Secure Computing}.
   \const{SECCOMP\_MODE\_FILTER} per usare il \textit{filter mode}. Tratteremo
   questa opzione nei dettagli più avanti, in sez.~\ref{sec:procadv_seccomp},
   quando affronteremo l'argomento del \textit{Secure Computing}.
@@ -414,7 +414,7 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC.
 In questa sezione tratteremo le funzionalità avanzate relative alla creazione
 dei processi e del loro ambiente, sia per quanto riguarda l'utilizzo delle
 stesse per la creazione dei \textit{thread} che per la gestione dei
 In questa sezione tratteremo le funzionalità avanzate relative alla creazione
 dei processi e del loro ambiente, sia per quanto riguarda l'utilizzo delle
 stesse per la creazione dei \textit{thread} che per la gestione dei
-\textit{namespace} che sono alla base dei cosidetti \textit{container}.
+\textit{namespace} che sono alla base dei cosiddetti \textit{container}.
 
 
 \subsection{La \textit{system call} \func{clone}}
 
 
 \subsection{La \textit{system call} \func{clone}}
@@ -705,7 +705,7 @@ gestione della sicurezza ed il controllo degli accessi all'interno dei
 processi, a partire dalle \textit{capabilities} e dalle funzionalità di
 \textit{Secure Computing}. Esamineremo inoltre tutte le altre funzionalità
 relative alla sicurezza come gestione delle chiavi crittografiche e varie
 processi, a partire dalle \textit{capabilities} e dalle funzionalità di
 \textit{Secure Computing}. Esamineremo inoltre tutte le altre funzionalità
 relative alla sicurezza come gestione delle chiavi crittografiche e varie
-estensioni e funzionalita disponibili su questo argomento.
+estensioni e funzionalità disponibili su questo argomento.
 
 
 
 
 
 
@@ -1319,7 +1319,7 @@ sez.~\ref{sec:sock_ioctl_netdevice}) ed impostare la tabella di instradamento.
 Una terza \textit{capability} con vasto campo di applicazione è
 \const{CAP\_SYS\_ADMIN}, che copre una serie di operazioni amministrative,
 come impostare le quote disco (vedi sez.\ref{sec:disk_quota}), attivare e
 Una terza \textit{capability} con vasto campo di applicazione è
 \const{CAP\_SYS\_ADMIN}, che copre una serie di operazioni amministrative,
 come impostare le quote disco (vedi sez.\ref{sec:disk_quota}), attivare e
-disattivare la swap, montare, rimontare e smontare filesystem (vedi
+disattivare la \textit{swap}, montare, rimontare e smontare filesystem (vedi
 sez.~\ref{sec:filesystem_mounting}), effettuare operazioni di controllo su
 qualunque oggetto dell'IPC di SysV (vedi sez.~\ref{sec:ipc_sysv}), operare
 sugli attributi estesi dei file di classe \texttt{security} o \texttt{trusted}
 sez.~\ref{sec:filesystem_mounting}), effettuare operazioni di controllo su
 qualunque oggetto dell'IPC di SysV (vedi sez.~\ref{sec:ipc_sysv}), operare
 sugli attributi estesi dei file di classe \texttt{security} o \texttt{trusted}
@@ -2019,7 +2019,7 @@ comprometterne la sicurezza eseguendo codice non sotto il proprio controllo.
 
 Nella prima versione del meccanismo, introdotto con il kernel 2.6.23 e
 disponibile solo avendo è abilitato il supporto nel kernel con
 
 Nella prima versione del meccanismo, introdotto con il kernel 2.6.23 e
 disponibile solo avendo è abilitato il supporto nel kernel con
-\texttt{CONFIG\_SECCOMP}, questo veniva attovato con \func{prctl} indicando
+\texttt{CONFIG\_SECCOMP}, questo veniva attivato con \func{prctl} indicando
 l'opzione \const{PR\_SET\_SECCOMP}, che all'epoca supportava soltanto l'uso
 del valore \const{SECCOMP\_MODE\_STRICT} per \param{arg2}.
 
 l'opzione \const{PR\_SET\_SECCOMP}, che all'epoca supportava soltanto l'uso
 del valore \const{SECCOMP\_MODE\_STRICT} per \param{arg2}.
 
@@ -2053,7 +2053,7 @@ operazioni se non quelle citate.
 \subsection{Altre funzionalità di sicurezza.}
 \label{sec:procadv_security_misc}
 
 \subsection{Altre funzionalità di sicurezza.}
 \label{sec:procadv_security_misc}
 
-Oltre alle funzionalità specifiche esaminite nelle sezioni precedenti, il
+Oltre alle funzionalità specifiche esaminate nelle sezioni precedenti, il
 kernel supporta una varietà di ulteriori impostazioni di sicurezza,
 accessibili nelle maniere più varie, che abbiamo raccolto in questa sezione.
 
 kernel supporta una varietà di ulteriori impostazioni di sicurezza,
 accessibili nelle maniere più varie, che abbiamo raccolto in questa sezione.
 
@@ -2061,23 +2061,25 @@ Una serie di modalità di sicurezza sono attivabili a richiesta attraverso
 alcune opzioni di controllo attivabili via \func{sysctl} o il filesystem
 \texttt{/proc}, un elenco delle stesse e dei loro effetti è il seguente:
 
 alcune opzioni di controllo attivabili via \func{sysctl} o il filesystem
 \texttt{/proc}, un elenco delle stesse e dei loro effetti è il seguente:
 
-\begin{basedescript}{\desclabelwidth{2.2cm}\desclabelstyle{\nextlinelabel}}
+\begin{basedescript}{\desclabelwidth{1cm}\desclabelstyle{\nextlinelabel}}
 \item[\sysctlrelfiled{fs}{protected\_hardlinks}] Un valore nullo, il default,
   mantiene il comportamento standard che non pone restrizioni alla creazione
   di \textit{hard link}. Se il valore viene posto ad 1 vengono invece attivate
 \item[\sysctlrelfiled{fs}{protected\_hardlinks}] Un valore nullo, il default,
   mantiene il comportamento standard che non pone restrizioni alla creazione
   di \textit{hard link}. Se il valore viene posto ad 1 vengono invece attivate
-  una serie di restrizioni, che se non soddisfatte causano il fallimento di
-  \func{link} con un errore di \errval{EPERM}. Perché questo non avvenga
-  almeno una delle seguenti condizioni deve essere soddisfatta:
+  una serie di restrizioni protettive, denominate
+  \itindex{protected~hardlinks} \textit{protected hardlinks}, che se non
+  soddisfatte causano il fallimento di \func{link} con un errore di
+  \errval{EPERM}. Perché questo non avvenga almeno una delle seguenti
+  condizioni deve essere soddisfatta:
   \begin{itemize*}
   \begin{itemize*}
-  \item il processo chiamante deve avere i privilegi amministrativi (la
-    \textit{capability}) \const{CAP\_FOWNER}); in caso di utilizzo
+  \item il chiamante deve avere privilegi amministrativi (la
+    \textit{capability} \const{CAP\_FOWNER}). In caso di utilizzo
     dell'\textit{user namespace} oltre a possedere \const{CAP\_FOWNER} è
     necessario che l'\ids{UID} del proprietario del file sia mappato nel
     \textit{namespace}.
   \item il \textit{filesystem} \ids{UID} del chiamante (normalmente
     equivalente all'\ids{UID} effettivo) deve corrispondere a quello del
     proprietario del file a cui si vuole effettuare il collegamento.
     dell'\textit{user namespace} oltre a possedere \const{CAP\_FOWNER} è
     necessario che l'\ids{UID} del proprietario del file sia mappato nel
     \textit{namespace}.
   \item il \textit{filesystem} \ids{UID} del chiamante (normalmente
     equivalente all'\ids{UID} effettivo) deve corrispondere a quello del
     proprietario del file a cui si vuole effettuare il collegamento.
-  \item sono soddistatte tutte le seguenti condizioni:
+  \item devono essere soddisfatte tutte le seguenti condizioni:
     \begin{itemize*}
     \item il file è un file ordinario
     \item il file non ha il \acr{suid} bit attivo
     \begin{itemize*}
     \item il file è un file ordinario
     \item il file non ha il \acr{suid} bit attivo
@@ -2086,6 +2088,70 @@ alcune opzioni di controllo attivabili via \func{sysctl} o il filesystem
     \item il chiamante ha i permessi di lettura e scrittura sul file
     \end{itemize*}
   \end{itemize*}
     \item il chiamante ha i permessi di lettura e scrittura sul file
     \end{itemize*}
   \end{itemize*}
+
+  In sostanza in questo caso un utente potrà creare un collegamento diretto ad
+  un altro file solo se ne è il proprietario o se questo è un file ordinario
+  senza permessi speciali ed a cui ha accesso in lettura e scrittura.
+
+  Questa funzionalità fornisce una protezione generica che non inficia l'uso
+  ordinario di \func{link}, ma rende impraticabili una serie di possibili
+  abusi della stessa; oltre ad impedire l'uso di un \textit{hard link} come
+  variante in un attacco di \textit{symlink race} (eludendo i
+  \textit{protected symlinks} di cui al punto successivo), evita anche che si
+  possa lasciare un riferimento ad un eventuale programma \acr{suid}
+  vulnerabile, creando un collegamento diretto allo stesso.
+
+
+\item[\sysctlrelfiled{fs}{protected\_symlinks}] Un valore nullo, il default,
+  mantiene il comportamento standard che non pone restrizioni nel seguire i
+  link simbolici. Se il valore viene posto ad 1 vengono attivate delle
+  restrizioni protettive, denominate \itindex{protected~symlinks}
+  \textit{protected symlinks}. Quando vengono attivate una qualunque funzione
+  che esegua la risoluzione di un \textit{pathname} contenente un link
+  simbolico non conforme alle restrizioni fallirà con un errore di
+  \errval{EACCESS}. Per evitare l'errore deve essere soddisfatta una delle
+  seguenti condizioni:
+  \begin{itemize*}
+  \item il link non è in una directory con permessi analoghi a \file{/tmp}
+    (scrivibile a tutti e con lo \textit{sticky bit} attivo);
+  \item il link è in una directory con permessi analoghi a \file{/tmp} ma è
+    soddisfatta una delle condizioni seguenti: 
+    \begin{itemize*}
+    \item il link simbolico appartiene al chiamante: il controllo viene fatto
+      usando il \textit{filesystem} \ids{UID} (che normalmente corrisponde
+      all'\ids{UID} effettivo).
+    \item il link simbolico ha lo stesso proprietario della directory.
+    \end{itemize*}
+  \end{itemize*}
+
+  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}.} 
+
+  Un possibile esempio di questo tipo di attacco è quello contro un programma
+  che viene eseguito per conto di un utente privilegiato (ad esempio un
+  programma con il \acr{suid} o lo \acr{sgid} bit attivi) che prima controlla
+  l'esistenza di un file e se non esiste lo crea. Se questa procedura, che è
+  tipica della creazione di file temporanei sotto \file{/tmp}, non viene
+  eseguita in maniera corretta,\footnote{ad esempio con le modalità che
+    abbiamo trattato in sez.~\ref{sec:file_temp_file}, che per quanto note da
+    tempo continuano ad essere ignorate.} un attaccante ha una finestra di
+  tempo in cui può creare prima del programma un \textit{link simbolico} ad un
+  file di sua scelta, compresi file di dispositivo o file a cui non avrebbe
+  accesso, facendolo poi utilizzare al programma.
+
+  Attivando la funzionalità si rende impossibile seguire un link simbolico in
+  una directory temporanea come \texttt{/tmp}, a meno che questo non sia di
+  proprietà del chiamante, o che questo non appartenga al proprietario della
+  directory. Questo impedisce che i link simbolici creati da un attaccante
+  possano essere seguiti da un programma privilegiato (perché apparterranno
+  all'attaccante) mentre quelli creati dall'amministratore (che i genere è il
+  proprietario di \texttt{/tmp}) saranno seguiti comunque.
+
 \end{basedescript}
 
 
 \end{basedescript}
 
 
@@ -2165,3 +2231,40 @@ Da fare
 %%% mode: latex
 %%% TeX-master: "gapil"
 %%% End:
 %%% mode: latex
 %%% TeX-master: "gapil"
 %%% End:
+
+%  LocalWords:  system call namespace prctl IRIX kernel sys int option long
+%  LocalWords:  unsigned arg errno EACCESS EBADF EBUSY EFAULT EINVAL ENXIO PR
+%  LocalWords:  EOPNOTSUPP EPERM CAPBSET READ capability sez tab capabilities
+%  LocalWords:  bounding CAP SETPCAP DUMPABLE dump suid sgid UID DISABLE GET
+%  LocalWords:  ENDIAN endianness BIG big endian LITTLE little PPC PowerPC ia
+%  LocalWords:  FPEMU NOPRINT SIGFPE FPEXC point exception FP EXC SW ENABLE
+%  LocalWords:  OVF overflow UND underflow RES INV DISABLED NONRECOV ASYNC AO
+%  LocalWords:  KEEPCAPS pag exec SECURE KEEP CAPS securebits LOCKED NAME NUL
+%  LocalWords:  char PDEATHSIG SIGCHLD fork PTRACER PID tracer process ptrace
+%  LocalWords:  Security Modules ANY Yama SECCOMP secure computing seccomp vm
+%  LocalWords:  STRICT strict FILTER filter SIGKILL TIMING STATISTICAL TSC fn
+%  LocalWords:  TIMESTAMP timestamp Stamp Counter SIGSEGV UNALIGN SIGBUS MCE
+%  LocalWords:  KILL siginfo MCEERR memory failure early kill CLEAR child cap
+%  LocalWords:  reaper SUBREAPER init value result thread like flags stack FS
+%  LocalWords:  race condition malloc NULL copy write glibc vsyscall sched RT
+%  LocalWords:  void pid ptid struct desc tls ctid EAGAIN ENOMEM exit Posix
+%  LocalWords:  Library PARENT SETTID SETTLS TID CLEARTID futex FILES table
+%  LocalWords:  descriptor umask dell'I scheduler SIGHAND STOPPED SYSVSEM IPC
+%  LocalWords:  UNTRACED VFORK vfork mount filesystem LSM Mandatory Access fs
+%  LocalWords:  Control DAC MAC SELinux Smack Tomoyo AppArmor Discrectionary
+%  LocalWords:  permitted inheritable effective fig security ADMIN forced new
+%  LocalWords:  allowed dall' bound MODULE nell' all' capset sendmail SETGID
+%  LocalWords:  setuid orig IMMUTABLE MKNOD OVERRIDE SEARCH CHOWN FSETID LOCK
+%  LocalWords:  FOWNER saved FIXUP NOROOT AUDIT BLOCK SUSPEND SETFCAP group
+%  LocalWords:  socket domain locking mlock mlockall shmctl mmap OWNER LEASE
+%  LocalWords:  lease immutable append only mknod BIND SERVICE BROADCAST RAW
+%  LocalWords:  broadcast multicast PACKET CHROOT chroot NICE PACCT RAWIO TTY
+%  LocalWords:  accounting ioperm iopl RESOURCE CONFIG hangup vhangup SYSLOG
+%  LocalWords:  WAKE ALARM CLOCK BOOTTIME REALTIME sticky NOATIME fcntl swap
+%  LocalWords:  multicasting dell'IPC SysV trusted IOPRIO CLASS IDLE lookup
+%  LocalWords:  scheduling dcookie NEWNS unshare nice NUMA ioctl journaling
+%  LocalWords:  ext capget header hdrp datap const ESRCH SOURCE undef version
+%  LocalWords:  libcap lcap obj to text dup clear DIFFERS get ncap caps ssize
+%  LocalWords:  argument length all setpcap from string name proc cat capgetp
+%  LocalWords:  capsetp getcap read sigreturn sysctl protected hardlinks tmp
+%  LocalWords:  dell' symlink symlinks pathname TOCTTOU of