+
+\itindbeg{capabilities}
+
+Come accennato in sez.~\ref{sec:proc_access_id} l'architettura classica della
+gestione dei privilegi in un sistema unix-like ha il sostanziale problema di
+fornire all'amministratore dei poteri troppo ampi, questo comporta che anche
+quando di siamo predisposte delle protezioni per in essere in grado di
+difendersi dagli effetti di una eventuale compromissione del sistema (come
+montare un filesystem in sola lettura per impedirne modifiche), una volta che
+questa sia stata effettuata e si siano ottenuti i privilegi di amministratore,
+queste potranno essere comunque rimosse (nel caso dell'esempio si potrà sempre
+rimontare il sistema in lettura-scrittura).
+
+Il problema consiste nel fatto che nell'architettura tradizionale di un
+sistema unix-like i controlli di accesso sono basati su un solo livello di
+separazione: per i processi normali essi sono posti in atto, mentre per i
+processi con i privilegi di amministratore essi non vengono neppure eseguiti.
+Dato che i privilegi sono sempre gli stessi, non esiste modo per evitare che
+un processo con diritti di amministratore non possa eseguire certe operazioni.
+Per ovviare a tutto ciò, a partire dai kernel della serie 2.2, è stato
+introdotto un meccanismo, detto \textit{capabilities}, che consentisse di
+suddividere i vari privilegi tradizionalmente associati all'amministratore in
+un insieme di \textsl{capacità} distinte.
+
+Queste capacità possano essere abilitate e disabilitate in maniera
+indipendente per ciascun processo, permettendo una granularità molto più fine
+nella distribuzione dei privilegi. Il meccanismo completo delle
+\textit{capabilities} prevederebbe anche la possibilità di associare le stesse
+\textit{capabilities} anche ai singoli file
+eseguibili,\footnote{l'implementazione di Linux si rifà ad una bozza per
+ quello che dovrebbe divenire lo standard POSIX.1e, che prevede questa
+ funzionalità.} in modo da poter stabilire quali capacità possono essere
+utilizzate quando viene messo in esecuzione uno specifico programma;
+attualmente\footnote{vale a dire almeno fino al kernel 2.6.13, e non è
+ disponibile al momento neanche nessuna realizzazione sperimentale.} questa
+funzionalità non è implementata.
+
+Per gestire questo nuovo meccanismo ciascun processo porta con sé tre distinti
+insiemi di \textit{capabilities}, che vengono denominati rispettivamente
+\textit{effective}, \textit{permitted} ed \textit{inherited}. Questi insiemi
+vengono mantenuti in forma di tre diverse maschere binarie,\footnote{il kernel
+ li mantiene, come i vari identificatori di sez.~\ref{sec:proc_setuid},
+ all'interno della \struct{task\_struct} di ciascun processo (vedi
+ fig.~\ref{fig:proc_task_struct}), nei tre campi \texttt{cap\_effective},
+ \texttt{cap\_inheritable}, \texttt{cap\_permitted} del tipo
+ \texttt{kernel\_cap\_t} (definito come intero a 32 bit), il che comporta un
+ massimo di 32 \textit{capabilities} distinte.} in cui ciascun bit
+corrisponde ad una capacità diversa; se ne è riportato l'elenco,\footnote{si
+ tenga presente che l'elenco delle \textit{capabilities} presentato questa
+ tabella, ripreso dalla relativa pagina di manuale (accessibile con
+ \texttt{man capabilities}), è quello aggiornato al kernel 2.6.6.} con una
+breve descrizione, ed il nome delle costanti che identificano i singoli bit,
+in tab.~\ref{tab:proc_capabilities}.
+
+
+\begin{table}[!hbt]
+ \centering
+ \footnotesize
+ \begin{tabular}{|l|p{12cm}|}
+ \hline
+ \textbf{Capacità}&\textbf{Descrizione}\\
+ \hline
+ \hline
+ \const{CAP\_CHOWN} & la capacità di cambiare proprietario e gruppo
+ proprietario di un file (vedi
+ sez.~\ref{sec:file_chown}).\\
+ \const{CAP\_DAC\_OVERRIDE}& la capacità di evitare il controllo dei
+ permessi di lettura, scrittura ed esecuzione dei
+ file, (vedi sez.~\ref{sec:file_access_control})
+ caratteristici del modello classico del
+ controllo di accesso chiamato
+ \itindex{Discrectionary~Access~Control~(DAC)}
+ \textit{Discrectionary Access Control} (da cui
+ il nome DAC).\\
+ \const{CAP\_DAC\_READ\_SEARCH}& la capacità di evitare il controllo dei
+ permessi di lettura, scrittura ed esecuzione per
+ le directory (vedi
+ sez.~\ref{sec:file_access_control}).\\
+ \const{CAP\_FOWNER} & la capacità di evitare il controllo che
+ l'user-ID effettivo del processo (o meglio il
+ \textit{filesystem user-ID}, vedi
+ sez.~\ref{sec:proc_setuid}) coincida con
+ quello del proprietario di un file per tutte
+ le operazioni privilegiate non coperte dalle
+ precedenti \const{CAP\_DAC\_OVERRIDE} e
+ \const{CAP\_DAC\_READ\_SEARCH}. Queste
+ comprendono i cambiamenti dei permessi e dei
+ tempi del file (vedi sez.~\ref{sec:file_chmod} e
+ sez.~\ref{sec:file_utime}), le impostazioni degli
+ attributi estesi (con il comando \cmd{chattr}) e
+ delle ACL, poter ignorare lo
+ \itindex{sticky~bit} \textit{sticky bit} nella
+ cancellazione dei file (vedi
+ sez.~\ref{sec:file_sticky}), la possibilità di
+ impostare il flag di \const{O\_NOATIME} con
+ \func{open} e \func{fcntl} (vedi
+ sez.~\ref{sec:file_open} e
+ sez.~\ref{sec:file_fcntl}).\\
+ \const{CAP\_FSETID} & la capacità di evitare la cancellazione
+ automatica dei bit \itindex{suid~bit} \acr{suid}
+ e \itindex{sgid~bit} \acr{sgid} quando un file
+ per i quali sono impostati viene modificato da
+ un processo senza questa capacità e la capacità
+ di impostare il bit \acr{sgid} su un file anche
+ quando questo è relativo ad un gruppo cui non si
+ appartiene (vedi sez.~\ref{sec:file_chmod}).\\
+ \const{CAP\_IPC\_LOCK} & la capacità di effettuare il \textit{memory
+ locking} \itindex{memory~locking} con le
+ funzioni \func{mlock}, \func{mlockall},
+ \func{shmctl}, \func{mmap} (vedi
+ sez.~\ref{sec:proc_mem_lock} e
+ sez.~\ref{sec:file_memory_map}). \\
+ \const{CAP\_IPC\_OWNER} & la capacità di evitare il controllo dei permessi
+ per le operazioni sugli oggetti di
+ intercomunicazione fra processi (vedi
+ sez.~\ref{sec:ipc_sysv}).\\
+ \const{CAP\_KILL} & la capacità di mandare segnali a qualunque
+ processo (vedi sez.~\ref{sec:sig_kill_raise}).\\
+ \const{CAP\_LEASE} & la capacità di creare dei \textit{file lease}
+ \index{file!lease} su di un file (vedi
+ sez.~\ref{sec:file_asyncronous_lease})
+ indipendentemente dalla proprietà dello
+ stesso.\footnotemark\\
+ \const{CAP\_LINUX\_IMMUTABLE}& la capacità di impostare gli attributi
+ \textit{immutable} e \textit{append only} per i
+ file su un filesystem che supporta questi
+ attributi estesi.\\
+ \const{CAP\_MKNOD} & la capacità di creare file di dispositivo con la
+ funzione \func{mknod} (vedi
+ sez.~\ref{sec:file_mknod}).\footnotemark\\
+ \const{CAP\_NET\_ADMIN} & la capacità di eseguire alcune operazioni
+ privilegiate sulla rete (impostare le opzioni
+ privilegiate dei socket, abilitare il
+ multicasting, impostare interfacce di rete e
+ tabella di instradamento).\\
+ \const{CAP\_NET\_BIND\_SERVICE}& la capacità di porre in ascolto server
+ su porte riservate (vedi
+ sez.~\ref{sec:TCP_func_bind}).\\
+ \const{CAP\_NET\_BROADCAST}& la capacità di consentire l'uso di socket in
+ broadcast e multicast.\\
+ \const{CAP\_NET\_RAW} & la capacità di usare socket \texttt{RAW} e
+ \texttt{PACKET} (quelli che permettono di creare
+ pacchetti nei protocolli di basso livello).\\
+ \const{CAP\_SETGID} & la capacità di manipolare i group ID dei
+ processi, sia il principale che i supplementari,
+ (vedi sez.~\ref{sec:proc_setgroups} che quelli
+ trasmessi tramite i \index{socket} socket
+ \textit{unix domain} (vedi
+ sez.~\ref{sec:unix_socket}).\\
+ \const{CAP\_SETPCAP} & la capacità di impostare o rimuovere una capacità
+ (limitatamente a quelle che il processo
+ chiamante ha nel suo insieme di capacità
+ permesse) da qualunque processo.\\
+ \const{CAP\_SETUID} & la capacità di manipolare gli user ID del
+ processo (e trasmettere un valore arbitrario
+ tramite i socket unix domain).\\
+ \const{CAP\_SYS\_ADMIN} & la capacità di eseguire una serie di compiti
+ amministrativi (come impostare le quote,
+ attivare e disattivare la swap, montare,
+ rimontare e smontare filesystem, ecc.). \\
+ \const{CAP\_SYS\_BOOT} & la capacità di fare eseguire un reboot del
+ sistema.\\
+ \const{CAP\_SYS\_CHROOT}& la capacità di eseguire la funzione
+ \func{chroot} (vedi
+ sez.~\ref{sec:file_chroot}).\\
+ \const{CAP\_SYS\_MODULE}& la capacità di caricare e rimuovere moduli del
+ kernel. \\
+ \const{CAP\_SYS\_NICE} & la capacità di modificare le priorità dei
+ processi (vedi sez.~\ref{sec:proc_priority}). \\
+ \const{CAP\_SYS\_PACCT} & la capacità di usare le funzioni di
+ \textit{accounting} dei processi (vedi
+ sez.~\ref{sec:sys_bsd_accounting}).\\
+ \const{CAP\_SYS\_RAWIO} & la capacità di eseguire operazioni sulle porte
+ di I/O con \func{ioperm} e \func{iopl} (vedi
+ sez.~\ref{sec:file_io_port}).\\
+ \const{CAP\_SYS\_RESOURCE}& la capacità di superare le limitazioni sulle
+ risorse, aumentare le quote disco, usare lo
+ spazio disco riservato all'amministratore.\\
+ \const{CAP\_SYS\_TIME} & la capacità di modificare il tempo di sistema
+ (vedi sez.~\ref{sec:sys_time}).\\
+ \const{CAP\_SYS\_TTY\_CONFIG}& la capacità di simulare un \textit{hangup}
+ della console, con la funzione
+ \func{vhangup}.\\
+ \const{CAP\_SYS\_PTRACE}& consente di tracciare qualunque processo con
+ \func{ptrace} (vedi
+ sez.~\ref{sec:xxx_ptrace}).\\
+% TODO documentatare ptrace
+ \hline
+ \end{tabular}
+ \caption{Le costanti che identificano le \textit{capabilities} presenti nel
+ kernel.}
+\label{tab:proc_capabilities}
+\end{table}
+
+\footnotetext{questa capacità è presente soltato a partire dai kernel della
+ serie 2.4.x.}
+
+\footnotetext{questa capacità è presente soltato a partire dai kernel della
+ serie 2.4.x.}
+
+
+L'utilizzo di tre distinti insiemi serve a fornire una interfaccia flessibile
+per l'uso delle \textit{capabilities}, con scopi analoghi a quelli per cui
+sono mantenuti i diversi insiemi di identificatori di
+sez.~\ref{sec:proc_setuid}; il loro significato è il seguente:
+\begin{basedescript}{\desclabelwidth{2.0cm}\desclabelstyle{\nextlinelabel}}
+\item[\textit{effective}] l'insieme delle \textit{capabilities}
+ ``\textsl{effettive}'', cioè quelle che vengono effettivamente usate dal
+ kernel per eseguire il controllo di accesso per le operazioni compiute dal
+ processo.
+\item[\textit{permitted}] l'insieme delle \textit{capabilities}
+ ``\textsl{permesse}'', cioè l'insieme di quelle che un processo \textsl{può}
+ impostare come \textsl{effettive} se ha la capacità \const{CAP\_SETPCAP}. Se
+ un processo cancella una capacità da questo insieme non potrà più
+ riassumerla (almeno che non esegua un programma che è \acr{suid} di root).
+\item[\textit{inherited}] l'insieme delle \textit{capabilities}
+ \textsl{ereditate}, cioè quelle che vengono trasmesse ad un nuovo programma
+ eseguito attraverso una chiamata ad \func{exec} (con l'eccezione del caso
+ che questo sia \acr{suid} di root).
+\end{basedescript}
+
+
+Oltre a questi tre insiemi relativi al singolo processo il kernel mantiene un
+valore generale per tutto il sistema, chiamato
+\index{capabilities~bounding~set} \textit{capabilities bounding set}. Questo
+è un parametro di sistema, accessibile attraverso il contenuto del file
+\file{/proc/sys/kernel/cap-bound}, che consente di impostare un limite
+generale alle capacità che possono essere accordate ai vari processi.
+
+Il meccanismo prevede infatti che nell'esecuzione di una \func{exec} venga
+utilizzato il valore mantenuto nell'insieme \textit{inherited} per
+inizializzare tutti gli insiemi
+
+
+
+vengano
+impostati come valori per le \textit{capabilities} (per tutti e tre gli
+insiemi) del nuovo programma quelle
+
+
+
+
+
+
+
+
+
+
+
+
+\itindend{capabilities}