Appunti dalla conferenza
[gapil.git] / procadv.tex
index 98d403122e43dbf09d50c15aeb257fee4481283c..4989cee79ffa7a7dcedfa3beeb8abf2a01c06c9f 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
@@ -213,8 +213,8 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC.
   ``\textit{tracer process}''. Questa è una funzionalità fornita da
   \textit{``Yama''}, uno specifico \textit{Linux Security Modules}, e serve a
   consentire al processo indicato, quando le restrizioni introdotte da questo
   ``\textit{tracer process}''. Questa è una funzionalità fornita da
   \textit{``Yama''}, uno specifico \textit{Linux Security Modules}, e serve a
   consentire al processo indicato, quando le restrizioni introdotte da questo
-  modulo sono attive, di usare \func{ptrace}\unavref{ (vedi
-    sez.\ref{sec:process_ptrace})} sul processo chiamante, anche se quello
+  modulo sono attive, di usare \func{ptrace} (vedi
+  sez.~\ref{sec:process_ptrace}) sul processo chiamante, anche se quello
   indicato non ne è un progenitore. Il valore \constd{PR\_SET\_PTRACER\_ANY}
   consente a tutti i processi l'uso di \func{ptrace}. L'uso si \textit{Yama}
   attiene alla gestione della sicurezza dei processi, e consente di introdurre
   indicato non ne è un progenitore. Il valore \constd{PR\_SET\_PTRACER\_ANY}
   consente a tutti i processi l'uso di \func{ptrace}. L'uso si \textit{Yama}
   attiene alla gestione della sicurezza dei processi, e consente di introdurre
@@ -223,44 +223,29 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC.
   scopo di queste dispense, per i dettagli si consulti la documentazione su
   \textit{Yama} nei sorgenti del kernel. Introdotta a partire dal kernel 3.4.
 
   scopo di queste dispense, per i dettagli si consulti la documentazione su
   \textit{Yama} nei sorgenti del kernel. Introdotta a partire dal kernel 3.4.
 
-\itindbeg{secure~computing~mode}
-\item[\constd{PR\_SET\_SECCOMP}] Imposta il cosiddetto \textit{secure computing
-    mode} per il processo corrente. Prevede come unica possibilità
-  che \param{arg2} sia impostato ad 1. Una volta abilitato il \textit{secure
-    computing mode} il processo potrà utilizzare soltanto un insieme
-  estremamente limitato di \textit{system call}: \func{read}, \func{write},
-  \func{\_exit} e \funcm{sigreturn}. Ogni altra \textit{system call} porterà
-  all'emissione di un \signal{SIGKILL} (vedi sez.~\ref{sec:sig_termination}).
-  Il \textit{secure computing mode} è stato ideato per fornire un supporto per
-  l'esecuzione di codice esterno non fidato e non verificabile a scopo di
-  calcolo;\footnote{lo scopo è quello di poter vendere la capacità di calcolo
-    della proprio macchina ad un qualche servizio di calcolo distribuito senza
-    comprometterne la sicurezza eseguendo codice non sotto il proprio
-    controllo.} in genere i dati vengono letti o scritti grazie ad un socket o
-  una \textit{pipe}, e per evitare problemi di sicurezza non sono possibili
-  altre operazioni se non quelle citate.  Introdotta a partire dal kernel
-  2.6.23, disponibile solo se si è abilitato il supporto nel kernel con
-  \texttt{CONFIG\_SECCOMP}.
-
-% TODO a partire dal kernel 3.5 è stato introdotto la possibilità di usare un
-% terzo argomento se il secondo è SECCOMP_MODE_FILTER, vedi
-% Documentation/prctl/seccomp_filter.txt 
-% vedi anche http://lwn.net/Articles/600250/
-
-% TODO documentare PR_SET_SECCOMP introdotto a partire dal kernel 3.5. Vedi:
-% * Documentation/prctl/seccomp_filter.txt
-% * http://lwn.net/Articles/475043/
-
-% TODO a partire dal kernel 3.17 è stata introdotta la nuova syscall seccomp,
-% vedi http://lwn.net/Articles/600250/ e http://lwn.net/Articles/603321/
+\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 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
+  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}.
 
 \item[\constd{PR\_GET\_SECCOMP}] Ottiene come valore di ritorno della funzione
 
 \item[\constd{PR\_GET\_SECCOMP}] Ottiene come valore di ritorno della funzione
-  lo stato corrente del \textit{secure computing mode}, al momento attuale la
-  funzione è totalmente inutile in quanto l'unico valore ottenibile è 0, dato
-  che la chiamata di questa funzione in \textit{secure computing mode}
-  comporterebbe l'emissione di \signal{SIGKILL}, è stata comunque definita per
-  eventuali estensioni future. Introdotta a partire dal kernel 2.6.23.
-\itindend{secure~computing~mode}
+  lo stato corrente del \textit{secure computing mode}. Fino al kernel 3.5,
+  quando era possibile solo lo \textit{strict mode}, la funzione era
+  totalmente inutile in quanto l'unico valore ottenibile era 0 in assenza di
+  \textit{secure computing}, dato che la chiamata di questa funzione in
+  \textit{strict mode} avrebbe comportato l'emissione di \signal{SIGKILL} per
+  il chiamante. La funzione però, a partire dal kernel 2.6.23, era stata
+  comunque definita per eventuali estensioni future, ed infatti con
+  l'introduzione del \textit{filter mode} con il kernel 3.5, se essa viene
+  inclusa nelle funzioni consentite restituisce il valore 2 quando il
+  \textit{secure computing mode} è attivo (se non inclusa si avrà di nuovo un
+  \signal{SIGKILL}).
 
 \item[\constd{PR\_SET\_SECUREBITS}] Imposta i \textit{securebits} per il
   processo chiamante al valore indicato da \param{arg2}; per i dettagli sul
 
 \item[\constd{PR\_SET\_SECUREBITS}] Imposta i \textit{securebits} per il
   processo chiamante al valore indicato da \param{arg2}; per i dettagli sul
@@ -296,8 +281,8 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC.
   generazione di un segnale di \signal{SIGSEGV} (vedi
   sez.~\ref{sec:sig_prog_error}). La lettura viene automaticamente
   disabilitata se si attiva il \textit{secure computing mode} (vedi
   generazione di un segnale di \signal{SIGSEGV} (vedi
   sez.~\ref{sec:sig_prog_error}). La lettura viene automaticamente
   disabilitata se si attiva il \textit{secure computing mode} (vedi
-  \const{PR\_SET\_SECCOMP}).  Introdotta a partire dal kernel
-  2.6.26, solo su x86.
+  \const{PR\_SET\_SECCOMP} e sez.~\ref{sec:procadv_seccomp}).  Introdotta a
+  partire dal kernel 2.6.26, solo su x86.
 
 \item[\constd{PR\_GET\_TSC}] Ottiene il valore del flag che controlla la
   lettura del contattore dei \textit{timestamp}, salvato all'indirizzo
 
 \item[\constd{PR\_GET\_TSC}] Ottiene il valore del flag che controlla la
   lettura del contattore dei \textit{timestamp}, salvato all'indirizzo
@@ -409,8 +394,8 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC.
 \end{basedescript}
 
 
 \end{basedescript}
 
 
-%\subsection{La funzione \func{ptrace}}
-%\label{sec:process_ptrace}
+\subsection{La funzione \func{ptrace}}
+\label{sec:process_ptrace}
 
 %Da fare
 
 
 %Da fare
 
@@ -422,6 +407,12 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC.
 % TODO: trattare PTRACE_O_SUSPEND_SECCOMP, aggiunta con il kernel 4.3, vedi
 % http://lwn.net/Articles/656675/ 
 
 % TODO: trattare PTRACE_O_SUSPEND_SECCOMP, aggiunta con il kernel 4.3, vedi
 % http://lwn.net/Articles/656675/ 
 
+\subsection{La funzione \func{kcmp}}
+\label{sec:process_kcmp}
+
+%Da fare
+% vedi man kcmp e man 2 open
+
 
 \section{La gestione avanzata della creazione dei processi}
 \label{sec:process_adv_creation}
 
 \section{La gestione avanzata della creazione dei processi}
 \label{sec:process_adv_creation}
@@ -429,7 +420,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}}
@@ -606,10 +597,10 @@ elenco, che illustra quelle attualmente disponibili:\footnote{si fa
   informazioni, che saranno così indipendenti per i due processi, come avviene
   nel comportamento ordinario di un sistema unix-like.
 
   informazioni, che saranno così indipendenti per i due processi, come avviene
   nel comportamento ordinario di un sistema unix-like.
 
-\item[\constd{CLONE\_IO}] se questo flag viene impostato il nuovo il nuovo
-  processo condividerà con il padre il contesto dell'I/O, altrimenti, come
-  come avviene nel comportamento ordinario con una \func{fork} otterrà un suo
-  contesto dell'I/O. 
+\item[\constd{CLONE\_IO}] se questo flag viene impostato il nuovo processo
+  condividerà con il padre il contesto dell'I/O, altrimenti, come avviene nel
+  comportamento ordinario con una \func{fork} otterrà un suo contesto
+  dell'I/O.
 
   Il contesto dell'I/O viene usato dagli \textit{scheduler} di I/O (visti in
   sez.~\ref{sec:io_priority}) e se questo è lo stesso per diversi processi
 
   Il contesto dell'I/O viene usato dagli \textit{scheduler} di I/O (visti in
   sez.~\ref{sec:io_priority}) e se questo è lo stesso per diversi processi
@@ -716,9 +707,11 @@ degli altri gruppi, che costituisce poi quello che viene chiamato un
 \label{sec:process_security}
 
 Tratteremo in questa sezione le funzionalità più avanzate relative alla
 \label{sec:process_security}
 
 Tratteremo in questa sezione le funzionalità più avanzate relative alla
-gestione della sicurezza, a partire dalle \textit{capabilities} e dalle
-funzionalità di \textit{Secure Computing}, fino alle funzionalità relative
-alla gestione delle chiavi crittografiche.
+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
+estensioni e funzionalità disponibili su questo argomento.
 
 
 
 
 
 
@@ -748,7 +741,7 @@ definitivamente alcuni privilegi da un certo momento in poi.
 
 Per risolvere questo problema sono possibili varie soluzioni ed ad esempio dai
 kernel 2.5 è stata introdotta la struttura dei
 
 Per risolvere questo problema sono possibili varie soluzioni ed ad esempio dai
 kernel 2.5 è stata introdotta la struttura dei
-\itindex{Linux~Security~Modules} \textit{Linux Security Modules} che han
+\itindex{Linux~Security~Modules~(LSM)} \textit{Linux Security Modules} che han
 permesso di aggiungere varie forme di \itindex{Mandatory~Access~Control~(DAC)}
 \textit{Mandatory Access Control} (MAC), in cui si potessero parcellizzare e
 controllare nei minimi dettagli tutti i privilegi e le modalità in cui questi
 permesso di aggiungere varie forme di \itindex{Mandatory~Access~Control~(DAC)}
 \textit{Mandatory Access Control} (MAC), in cui si potessero parcellizzare e
 controllare nei minimi dettagli tutti i privilegi e le modalità in cui questi
@@ -999,7 +992,7 @@ riesce così a riottenere il comportamento classico di un sistema unix-like.
 Una seconda circostanza è quella relativa a cosa succede alle
 \textit{capabilities} di un processo nelle possibili transizioni da \ids{UID}
 nullo a \ids{UID} non nullo o viceversa (corrispondenti rispettivamente a
 Una seconda circostanza è quella relativa a cosa succede alle
 \textit{capabilities} di un processo nelle possibili transizioni da \ids{UID}
 nullo a \ids{UID} non nullo o viceversa (corrispondenti rispettivamente a
-cedere o riottenere i privilegi di amministratore) che si possono effettuare
+cedere o riottenere i privilegi di amministratore) che si possono effettuare
 con le varie funzioni viste in sez.~\ref{sec:proc_setuid}. In questo caso la
 casistica è di nuovo alquanto complessa, considerata anche la presenza dei
 diversi gruppi di identificatori illustrati in tab.~\ref{tab:proc_uid_gid}, si
 con le varie funzioni viste in sez.~\ref{sec:proc_setuid}. In questo caso la
 casistica è di nuovo alquanto complessa, considerata anche la presenza dei
 diversi gruppi di identificatori illustrati in tab.~\ref{tab:proc_uid_gid}, si
@@ -1129,15 +1122,14 @@ operazioni si rimanda alla rilettura di sez.~\ref{sec:process_prctl}.
 % http://lwn.net/Articles/211883/
 
 
 % http://lwn.net/Articles/211883/
 
 
-Un elenco delle delle \textit{capabilities} disponibili su Linux, con una
-breve descrizione ed il nome delle costanti che le identificano, è riportato
-in tab.~\ref{tab:proc_capabilities};\footnote{l'elenco presentato questa
-  tabella, ripreso dalla pagina di manuale (accessibile con \texttt{man
-    capabilities}) e dalle definizioni in
-  \texttt{include/linux/capabilities.h}, è aggiornato al kernel 3.2.} la
-tabella è divisa in due parti, la prima riporta le \textit{capabilities}
-previste anche nella bozza dello standard POSIX1.e, la seconda quelle
-specifiche di Linux.  Come si può notare dalla tabella alcune
+Un elenco delle \textit{capabilities} disponibili su Linux, con una breve
+descrizione ed il nome delle costanti che le identificano, è riportato in
+tab.~\ref{tab:proc_capabilities};\footnote{l'elenco presentato questa tabella,
+  ripreso dalla pagina di manuale (accessibile con \texttt{man capabilities})
+  e dalle definizioni in \texttt{include/linux/capabilities.h}, è aggiornato
+  al kernel 3.2.} la tabella è divisa in due parti, la prima riporta le
+\textit{capabilities} previste anche nella bozza dello standard POSIX1.e, la
+seconda quelle specifiche di Linux.  Come si può notare dalla tabella alcune
 \textit{capabilities} attengono a singole funzionalità e sono molto
 specializzate, mentre altre hanno un campo di applicazione molto vasto, che è
 opportuno dettagliare maggiormente.
 \textit{capabilities} attengono a singole funzionalità e sono molto
 specializzate, mentre altre hanno un campo di applicazione molto vasto, che è
 opportuno dettagliare maggiormente.
@@ -1333,7 +1325,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}
@@ -2020,10 +2012,175 @@ funzione.
 
 
 
 
 
 
+\subsection{La gestione del \textit{Secure Computing}.}
+\label{sec:procadv_seccomp}
+
+\itindbeg{secure~computing~mode}
+
+Il \textit{secure computing mode} è un meccanismo ideato per fornire un
+supporto per l'esecuzione di codice esterno non fidato e non verificabile a
+scopo di calcolo. L'idea era quella di disporre di una modalità di esecuzione
+dei programmi che permettesse di vendere la capacità di calcolo della propria
+macchina ad un qualche servizio di calcolo distribuito, senza comprometterne
+la sicurezza eseguendo codice non sotto il proprio controllo.
+
+La prima versione del meccanismo è stata introdotta con il kernel
+2.6.23,\footnote{e disponibile solo avendo abilitato il supporto nel kernel
+  con l'opzione di configurazione \texttt{CONFIG\_SECCOMP}.} è molto semplice,
+il \textit{secure computing mode} viene attivato con \func{prctl} usando
+l'opzione \const{PR\_SET\_SECCOMP}, ed indicando \const{SECCOMP\_MODE\_STRICT}
+come valore per \param{arg2} (all'epoca unico valore possibile).  Una volta
+abilitato in questa modalità (in seguito denominata \textit{strict mode}) il
+processo o il \textit{thread} chiamante potrà utilizzare soltanto un insieme
+estremamente limitato di \textit{system call}: \func{read}, \func{write},
+\func{\_exit} e \funcm{sigreturn}; l'esecuzione di qualsiasi altra
+\textit{system call} comporta l'emissione di un \signal{SIGKILL} e conseguente
+terminazione immediata del processo.
+
+Si tenga presente che in questo caso, con versioni recenti della \acr{glibc}
+(il comportamento è stato introdotto con la 2.3), diventa impossibile usare
+anche \func{\_exit} in \textit{strict mode}, in quanto questa funzione viene
+intercettata ed al suo posto viene chiamata \func{exit\_group} (vedi
+sez.~\ref{sec:pthread_management}) che non è consentita e comporta un
+\signal{SIGKILL}.
+
+Si tenga presente che, non essendo \func{execve} fra le funzioni permesse, per
+poter eseguire un programma terzo essendo in \textit{strict mode} questo dovrà
+essere fornito in una forma di codice interpretabile fornito attraverso un
+socket o una \textit{pipe}, creati prima di lanciare il processo che eseguirà
+il codice non fidato. 
+
+
+
+% TODO a partire dal kernel 3.5 è stato introdotto la possibilità di usare un
+% terzo argomento se il secondo è SECCOMP_MODE_FILTER, vedi
+% Documentation/prctl/seccomp_filter.txt 
+% vedi anche http://lwn.net/Articles/600250/
+
+% TODO documentare PR_SET_SECCOMP introdotto a partire dal kernel 3.5. Vedi:
+% * Documentation/prctl/seccomp_filter.txt
+% * http://lwn.net/Articles/475043/
+
+% TODO a partire dal kernel 3.17 è stata introdotta la nuova syscall seccomp,
+% vedi http://lwn.net/Articles/600250/ e http://lwn.net/Articles/603321/
+
+
+\itindend{secure~computing~mode}
+
+\subsection{Altre funzionalità di sicurezza.}
+\label{sec:procadv_security_misc}
+
+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.
+
+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:
+
+\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
+  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*}
+  \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.
+  \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
+    \item il file non ha lo \acr{sgid} bit attivo ed il permesso di esecuzione
+      per il gruppo
+    \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, 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
+  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}
+
+
+% TODO: trattare pure protected_regular e protected_fifos introdotti con il
+% 4.19 (vedi https://lwn.net/Articles/763106/)
+
 
 
 % TODO: trattare keyctl (man 2 keyctl)
 
 
 
 % TODO: trattare keyctl (man 2 keyctl)
 
+
+
 % TODO trattare le funzioni di protezione della memoria pkey_alloc, pkey_free,
 % pkey_mprotect, introdotte con il kernel 4.8, vedi
 % http://lwn.net/Articles/689395/ e Documentation/x86/protection-keys.txt 
 % TODO trattare le funzioni di protezione della memoria pkey_alloc, pkey_free,
 % pkey_mprotect, introdotte con il kernel 4.8, vedi
 % http://lwn.net/Articles/689395/ e Documentation/x86/protection-keys.txt 
@@ -2095,3 +2252,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