Revisione mount (e riorganizzazione della trattazione dei mount flag)
[gapil.git] / procadv.tex
1 \chapter{La gestione avanzata dei processi}
2 \label{cha:proc_advanced}
3
4 In questo capitolo affronteremo le tematiche relative alla gestione avanzata
5 dei processi, trattando le \textit{system call} dedicate alle funzionalità più
6 specifiche ed avanzate, il cui uso è in genere piuttosto ridotto.  Inizieremo
7 con le funzioni che attengono agli aspetti di controllo, passando alle
8 gestione delle modalità di creazione ed alle funzionalità attinenti i
9 \textit{namespace} e le funzionalità avanzate relative alla gestione della
10 sicurezza. Infine affronteremo le funzioni di gestione per una serie di
11 funzionalità specialistiche come la gestione della virgola mobile, le porte di
12 I/O ecc.
13
14 \section{Funzioni di gestione e controllo}
15 \label{sec:proc_manage_control}
16
17 In questa sezione prenderemo in esame alcune specifice \textit{system call}
18 dedicate al controllo processi sia per quanto riguarda l'impostazione di
19 caratteristiche specialistiche, che per quanto riguarda l'analisi ed il
20 controllo della loro esecuzione.
21
22 \subsection{La funzione \func{prctl}}
23 \label{sec:process_prctl}
24
25 Benché la gestione ordinaria dei processi possa essere effettuata attraverso
26 le funzioni che abbiamo già esaminato nei capitoli \ref{cha:process_interface}
27 e \ref{cha:process_handling}, esistono una serie di proprietà e
28 caratteristiche specifiche dei proecessi per la cui gestione è stata
29 predisposta una apposita \textit{system call} che fornisce una interfaccia
30 generica per tutte le operazioni specialistiche. La funzione di sistema è
31 \funcd{prctl} ed il suo prototipo è:\footnote{la funzione non è standardizzata
32   ed è specifica di Linux, anche se ne esiste una analoga in IRIX; è stata
33   introdotta con il kernel 2.1.57.}
34
35 \begin{funcproto}{ 
36 \fhead{sys/prctl.h}
37 \fdecl{int prctl(int option, unsigned long arg2, unsigned long arg3, unsigned
38   long arg4, \\
39 \phantom{int prctl(}unsigned long arg5)}
40 \fdesc{Esegue una operazione speciale sul processo corrente.} 
41 }
42
43 {La funzione ritorna $0$ o un valore positivo dipendente dall'operazione in
44   caso di successo e $-1$ per un errore, nel qual caso \var{errno} assumerà
45   valori diversi a seconda del tipo di operazione richiesta, sono possibili:
46   \errval{EACCESS}, \errval{EBADF}, \errval{EBUSY}, \errval{EFAULT},
47   \errval{EINVAL}, \errval{ENXIO}, \errval{EOPNOTSUPP} o \errval{EPERM}.}
48 \end{funcproto}
49
50 La funzione ritorna in caso di successo un valore nullo o positivo, e $-1$ in
51 caso di errore. Il significato degli argomenti della funzione successivi al
52 primo, il valore di ritorno in caso di successo, il tipo di errore restituito
53 in \var{errno} dipendono dall'operazione eseguita, indicata tramite il primo
54 argomento, \param{option}. Questo è un valore intero che identifica
55 l'operazione, e deve essere specificato con l'uso di una delle costanti
56 predefinite del seguente elenco.\footnote{l'elenco potrebbe non risultare
57   aggiornato, in quanto nuove operazioni vengono aggiunte nello sviluppo del
58   kernel.} Tratteremo esplicitamente per ciascuna di esse il significato del
59 il valore di ritorno in caso di successo, ma solo quando non corrisponde
60 all'ordinario valore nullo (dato per implicito).
61
62 %TODO: trattare PR_CAP_AMBIENT, dal 4.3
63 %TODO: trattare PR_CAP_FP_*, dal 4.0, solo per MIPS
64 %TODO: trattare PR_MPX_*_MANAGEMENT, dal 3.19
65 %TODO: trattare PR_*NO_NEW_PRIVS, dal 3.5
66
67 \begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
68 \item[\constd{PR\_CAPBSET\_READ}] Controlla la disponibilità di una delle
69   \textit{capability} (vedi sez.~\ref{sec:proc_capabilities}). La funzione
70   ritorna 1 se la capacità specificata nell'argomento \param{arg2} (con una
71   delle costanti di tab.~\ref{tab:proc_capabilities}) è presente nel
72   \textit{capabilities bounding set} del processo e zero altrimenti,
73   se \param{arg2} non è un valore valido si avrà un errore di \errval{EINVAL}.
74   Introdotta a partire dal kernel 2.6.25.
75
76 \item[\constd{PR\_CAPBSET\_DROP}] Rimuove permanentemente una delle
77   \textit{capabilities} (vedi sez.~\ref{sec:proc_capabilities}) dal processo e
78   da tutti i suoi discendenti. La funzione cancella la capacità specificata
79   nell'argomento \param{arg2} con una delle costanti di
80   tab.~\ref{tab:proc_capabilities} dal \textit{capabilities bounding set} del
81   processo. L'operazione richiede i privilegi di amministratore (la capacità
82   \const{CAP\_SETPCAP}), altrimenti la chiamata fallirà con un errore di
83   \errcode{EPERM}; se il valore di \param{arg2} non è valido o se il supporto
84   per le \textit{file capabilities} non è stato compilato nel kernel la
85   chiamata fallirà con un errore di \errval{EINVAL}. Introdotta a partire dal
86   kernel 2.6.25.
87
88 \item[\constd{PR\_SET\_DUMPABLE}] Imposta il flag che determina se la
89   terminazione di un processo a causa di un segnale per il quale è prevista la
90   generazione di un file di \textit{core dump} (vedi
91   sez.~\ref{sec:sig_standard}) lo genera effettivamente. In genere questo flag
92   viene attivato automaticamente, ma per evitare problemi di sicurezza (la
93   generazione di un file da parte di processi privilegiati può essere usata
94   per sovrascriverne altri) viene cancellato quando si mette in esecuzione un
95   programma con i bit \acr{suid} e \acr{sgid} attivi (vedi
96   sez.~\ref{sec:file_special_perm}) o con l'uso delle funzioni per la modifica
97   degli \ids{UID} dei processi (vedi sez.~\ref{sec:proc_setuid}).
98
99   L'operazione è stata introdotta a partire dal kernel 2.3.20, fino al kernel
100   2.6.12 e per i kernel successivi al 2.6.17 era possibile usare solo un
101   valore 0 (espresso anche come \constd{SUID\_DUMP\_DISABLE}) di \param{arg2}
102   per disattivare il flag ed un valore 1 (espresso anche come
103   \constd{SUID\_DUMP\_USER}) per attivarlo. Nei kernel dal 2.6.13 al 2.6.17 è
104   stato supportato anche il valore 2, che causava la generazione di un
105   \textit{core dump} leggibile solo dall'amministratore, ma questa
106   funzionalità è stata rimossa per motivi di sicurezza, in quanto consentiva
107   ad un utente normale di creare un file di \textit{core dump} appartenente
108   all'amministratore in directory dove l'utente avrebbe avuto permessi di
109   accesso. Specificando un valore diverso da 0 o 1 si ottiene un errore di
110   \errval{EINVAL}.
111
112 \item[\constd{PR\_GET\_DUMPABLE}] Ottiene come valore di ritorno della funzione
113   lo stato corrente del flag che controlla la effettiva generazione dei
114   \textit{core dump}. Introdotta a partire dal kernel 2.3.20.
115
116 \item[\constd{PR\_SET\_ENDIAN}] Imposta la \textit{endianness} del processo
117   chiamante secondo il valore fornito in \param{arg2}. I valori possibili sono
118   sono: \constd{PR\_ENDIAN\_BIG} (\textit{big endian}),
119   \constd{PR\_ENDIAN\_LITTLE} (\textit{little endian}), e
120   \constd{PR\_ENDIAN\_PPC\_LITTLE} (lo pseudo \textit{little endian} del
121   PowerPC). Introdotta a partire dal kernel 2.6.18, solo per architettura
122   PowerPC.
123
124 \item[\constd{PR\_GET\_ENDIAN}] Ottiene il valore della \textit{endianness} del
125   processo chiamante, salvato sulla variabile puntata da \param{arg2} che deve
126   essere passata come di tipo ``\ctyp{int *}''. Introdotta a partire dal
127   kernel 2.6.18, solo su PowerPC.
128
129 \item[\constd{PR\_SET\_FPEMU}] Imposta i bit di controllo per l'emulazione
130   della virgola mobile su architettura ia64, secondo il valore
131   di \param{arg2}, si deve passare \constd{PR\_FPEMU\_NOPRINT} per emulare in
132   maniera trasparente l'accesso alle operazioni in virgola mobile, o
133   \constd{PR\_FPEMU\_SIGFPE} per non emularle ed inviare il segnale
134   \signal{SIGFPE} (vedi sez.~\ref{sec:sig_prog_error}). Introdotta a partire
135   dal kernel 2.4.18, solo su architettura ia64.
136
137 \item[\constd{PR\_GET\_FPEMU}] Ottiene il valore dei flag di controllo
138   dell'emulazione della virgola mobile, salvato all'indirizzo puntato
139   da \param{arg2}, che deve essere di tipo ``\ctyp{int *}''. Introdotta a
140   partire dal kernel 2.4.18, solo su architettura ia64.
141
142 \item[\constd{PR\_SET\_FPEXC}] Imposta la modalità delle eccezioni in virgola
143   mobile (\textit{floating-point exception mode}) al valore di \param{arg2}.
144   I valori possibili sono: 
145   \begin{itemize*}
146   \item \constd{PR\_FP\_EXC\_SW\_ENABLE} per usare FPEXC per le eccezioni,
147   \item \constd{PR\_FP\_EXC\_DIV} per la divisione per zero in virgola mobile,
148   \item \constd{PR\_FP\_EXC\_OVF} per gli overflow,
149   \item \constd{PR\_FP\_EXC\_UND} per gli underflow,
150   \item \constd{PR\_FP\_EXC\_RES} per risultati non esatti,
151   \item \constd{PR\_FP\_EXC\_INV} per operazioni invalide,
152   \item \constd{PR\_FP\_EXC\_DISABLED} per disabilitare le eccezioni,
153   \item \constd{PR\_FP\_EXC\_NONRECOV} per usare la modalità di eccezione
154     asincrona non recuperabile,
155   \item \constd{PR\_FP\_EXC\_ASYNC} per usare la modalità di eccezione
156     asincrona recuperabile,
157   \item \constd{PR\_FP\_EXC\_PRECISE} per la modalità precisa di
158     eccezione.\footnote{trattasi di gestione specialistica della gestione
159       delle eccezioni dei calcoli in virgola mobile che, i cui dettagli al
160       momento vanno al di là dello scopo di questo testo.}
161   \end{itemize*}
162 Introdotta a partire dal kernel 2.4.21, solo su PowerPC.
163
164 \item[\constd{PR\_GET\_FPEXC}] Ottiene il valore della modalità delle eccezioni
165   delle operazioni in virgola mobile, salvata all'indirizzo
166   puntato \param{arg2}, che deve essere di tipo ``\ctyp{int *}''.  Introdotta
167   a partire dal kernel 2.4.21, solo su PowerPC.
168
169 \item[\constd{PR\_SET\_KEEPCAPS}] Consente di controllare quali
170   \textit{capabilities} vengono cancellate quando si esegue un cambiamento di
171   \ids{UID} del processo (per i dettagli si veda
172   sez.~\ref{sec:proc_capabilities}, in particolare quanto illustrato a
173   pag.~\pageref{sec:capability-uid-transition}). Un valore nullo (il default)
174   per \param{arg2} comporta che vengano cancellate, il valore 1 che vengano
175   mantenute, questo valore viene sempre cancellato attraverso una \func{exec}.
176   L'uso di questo flag è stato sostituito, a partire dal kernel 2.6.26, dal
177   flag \const{SECURE\_KEEP\_CAPS} dei \textit{securebits} (vedi
178   sez.~\ref{sec:proc_capabilities} e l'uso di \const{PR\_SET\_SECUREBITS} più
179   avanti) e si è impostato con essi \const{SECURE\_KEEP\_CAPS\_LOCKED} si
180   otterrà un errore di \errval{EPERM}.  Introdotta a partire dal kernel
181   2.2.18.
182
183 \item[\constd{PR\_GET\_KEEPCAPS}] Ottiene come valore di ritorno della funzione
184   il valore del flag di controllo delle \textit{capabilities} impostato con
185   \const{PR\_SET\_KEEPCAPS}. Introdotta a partire dal kernel 2.2.18.
186
187 \item[\constd{PR\_SET\_NAME}] Imposta il nome del processo chiamante alla
188   stringa puntata da \param{arg2}, che deve essere di tipo ``\ctyp{char *}''. Il
189   nome può essere lungo al massimo 16 caratteri, e la stringa deve essere
190   terminata da NUL se più corta.  Introdotta a partire dal kernel 2.6.9.
191
192 \item[\constd{PR\_GET\_NAME}] Ottiene il nome del processo chiamante nella
193   stringa puntata da \param{arg2}, che deve essere di tipo ``\ctyp{char *}'';
194   si devono allocare per questo almeno 16 byte, e il nome sarà terminato da
195   NUL se più corto. Introdotta a partire dal kernel 2.6.9.
196
197 \item[\constd{PR\_SET\_PDEATHSIG}] Consente di richiedere l'emissione di un
198   segnale, che sarà ricevuto dal processo chiamante, in occorrenza della
199   terminazione del proprio processo padre; in sostanza consente di invertire
200   il ruolo di \signal{SIGCHLD}. Il valore di \param{arg2} deve indicare il
201   numero del segnale, o 0 per disabilitare l'emissione. Il valore viene
202   automaticamente cancellato per un processo figlio creato con \func{fork}.
203   Introdotta a partire dal kernel 2.1.57.
204
205 \item[\constd{PR\_GET\_PDEATHSIG}] Ottiene il valore dell'eventuale segnale
206   emesso alla terminazione del padre, salvato all'indirizzo
207   puntato \param{arg2}, che deve essere di tipo ``\ctyp{int *}''. Introdotta a
208   partire dal kernel 2.3.15.
209
210 \item[\constd{PR\_SET\_PTRACER}] Imposta un \ids{PID} per il ``\textit{tracer
211     process}'' usando \param{arg2}. Una impostazione successiva sovrascrive la
212   precedente, ed un valore nullo cancella la disponibilità di un
213   ``\textit{tracer process}''. Questa è una funzionalità fornita da
214   \textit{``Yama''}, uno specifico \textit{Linux Security Modules}, e serve a
215   consentire al processo indicato, quando le restrizioni introdotte da questo
216   modulo sono attive, di usare \func{ptrace}\unavref{ (vedi
217     sez.\ref{sec:process_ptrace})} sul processo chiamante, anche se quello
218   indicato non ne è un progenitore. Il valore \constd{PR\_SET\_PTRACER\_ANY}
219   consente a tutti i processi l'uso di \func{ptrace}. L'uso si \textit{Yama}
220   attiene alla gestione della sicurezza dei processi, e consente di introdurre
221   una restrizione all'uso di \func{ptrace}, che è spesso sorgente di
222   compromissioni. Si tratta di un uso specialistico che va al di là dello
223   scopo di queste dispense, per i dettagli si consulti la documentazione su
224   \textit{Yama} nei sorgenti del kernel. Introdotta a partire dal kernel 3.4.
225
226 \itindbeg{secure~computing~mode}
227 \item[\constd{PR\_SET\_SECCOMP}] Imposta il cosiddetto \textit{secure computing
228     mode} per il processo corrente. Prevede come unica possibilità
229   che \param{arg2} sia impostato ad 1. Una volta abilitato il \textit{secure
230     computing mode} il processo potrà utilizzare soltanto un insieme
231   estremamente limitato di \textit{system call}: \func{read}, \func{write},
232   \func{\_exit} e \funcm{sigreturn}. Ogni altra \textit{system call} porterà
233   all'emissione di un \signal{SIGKILL} (vedi sez.~\ref{sec:sig_termination}).
234   Il \textit{secure computing mode} è stato ideato per fornire un supporto per
235   l'esecuzione di codice esterno non fidato e non verificabile a scopo di
236   calcolo;\footnote{lo scopo è quello di poter vendere la capacità di calcolo
237     della proprio macchina ad un qualche servizio di calcolo distribuito senza
238     comprometterne la sicurezza eseguendo codice non sotto il proprio
239     controllo.} in genere i dati vengono letti o scritti grazie ad un socket o
240   una \textit{pipe}, e per evitare problemi di sicurezza non sono possibili
241   altre operazioni se non quelle citate.  Introdotta a partire dal kernel
242   2.6.23, disponibile solo se si è abilitato il supporto nel kernel con
243   \texttt{CONFIG\_SECCOMP}.
244
245 % TODO a partire dal kernel 3.5 è stato introdotto la possibilità di usare un
246 % terzo argomento se il secondo è SECCOMP_MODE_FILTER, vedi
247 % Documentation/prctl/seccomp_filter.txt 
248 % vedi anche http://lwn.net/Articles/600250/
249
250 % TODO documentare PR_SET_SECCOMP introdotto a partire dal kernel 3.5. Vedi:
251 % * Documentation/prctl/seccomp_filter.txt
252 % * http://lwn.net/Articles/475043/
253
254 % TODO a partire dal kernel 3.17 è stata introdotta la nuova syscall seccomp,
255 % vedi http://lwn.net/Articles/600250/ e http://lwn.net/Articles/603321/
256
257 \item[\constd{PR\_GET\_SECCOMP}] Ottiene come valore di ritorno della funzione
258   lo stato corrente del \textit{secure computing mode}, al momento attuale la
259   funzione è totalmente inutile in quanto l'unico valore ottenibile è 0, dato
260   che la chiamata di questa funzione in \textit{secure computing mode}
261   comporterebbe l'emissione di \signal{SIGKILL}, è stata comunque definita per
262   eventuali estensioni future. Introdotta a partire dal kernel 2.6.23.
263 \itindend{secure~computing~mode}
264
265 \item[\constd{PR\_SET\_SECUREBITS}] Imposta i \textit{securebits} per il
266   processo chiamante al valore indicato da \param{arg2}; per i dettagli sul
267   significato dei \textit{securebits} si veda
268   sez.~\ref{sec:proc_capabilities}, ed in particolare i valori di
269   tab.~\ref{tab:securebits_values} e la relativa trattazione. L'operazione
270   richiede i privilegi di amministratore (la capacità \const{CAP\_SETPCAP}),
271   altrimenti la chiamata fallirà con un errore di \errval{EPERM}. Introdotta a
272   partire dal kernel 2.6.26.
273
274 \item[\constd{PR\_GET\_SECUREBITS}] Ottiene come valore di ritorno della
275   funzione l'impostazione corrente per i \textit{securebits}. Introdotta a
276   partire dal kernel 2.6.26.
277
278 \item[\constd{PR\_SET\_TIMING}] Imposta il metodo di temporizzazione del
279   processo da indicare con il valore di \param{arg2}, attualmente i valori
280   possibili sono due, con \constd{PR\_TIMING\_STATISTICAL} si usa il metodo
281   statistico tradizionale, con \constd{PR\_TIMING\_TIMESTAMP} il più accurato
282   basato su dei \textit{timestamp}, quest'ultimo però non è ancora
283   implementato ed il suo uso comporta la restituzione di un errore di
284   \errval{EINVAL}. Introdotta a partire dal kernel 2.6.0-test4.
285
286 \item[\constd{PR\_GET\_TIMING}] Ottiene come valore di ritorno della funzione
287   il metodo di temporizzazione del processo attualmente in uso (uno dei due
288   valori citati per \const{PR\_SET\_TIMING}). Introdotta a partire dal kernel
289   2.6.0-test4.
290
291 \item[\constd{PR\_SET\_TSC}] Imposta il flag che indica se il processo
292   chiamante può leggere il registro di processore contenente il contatore dei
293   \textit{timestamp} (TSC, o \textit{Time Stamp Counter}) da indicare con il
294   valore di \param{arg2}. Si deve specificare \constd{PR\_TSC\_ENABLE} per
295   abilitare la lettura o \constd{PR\_TSC\_SIGSEGV} per disabilitarla con la
296   generazione di un segnale di \signal{SIGSEGV} (vedi
297   sez.~\ref{sec:sig_prog_error}). La lettura viene automaticamente
298   disabilitata se si attiva il \textit{secure computing mode} (vedi
299   \const{PR\_SET\_SECCOMP}).  Introdotta a partire dal kernel
300   2.6.26, solo su x86.
301
302 \item[\constd{PR\_GET\_TSC}] Ottiene il valore del flag che controlla la
303   lettura del contattore dei \textit{timestamp}, salvato all'indirizzo
304   puntato \param{arg2}, che deve essere di tipo ``\ctyp{int *}''. Introdotta a
305   partire dal kernel 2.6.26, solo su x86.
306 % articoli sul TSC e relativi problemi: http://lwn.net/Articles/209101/,
307 % http://blog.cr0.org/2009/05/time-stamp-counter-disabling-oddities.html,
308 % http://en.wikipedia.org/wiki/Time_Stamp_Counter 
309
310 \item[\constd{PR\_SET\_UNALIGN}] Imposta la modalità di controllo per l'accesso
311   a indirizzi di memoria non allineati, che in varie architetture risultano
312   illegali, da indicare con il valore di \param{arg2}. Si deve specificare il
313   valore \constd{PR\_UNALIGN\_NOPRINT} per ignorare gli accessi non allineati,
314   ed il valore \constd{PR\_UNALIGN\_SIGBUS} per generare un segnale di
315   \signal{SIGBUS} (vedi sez.~\ref{sec:sig_prog_error}) in caso di accesso non
316   allineato.  Introdotta con diverse versioni su diverse architetture.
317
318 \item[\const{PR\_GET\_UNALIGN}] Ottiene il valore della modalità di controllo
319   per l'accesso a indirizzi di memoria non allineati, salvato all'indirizzo
320   puntato \param{arg2}, che deve essere di tipo \code{(int *)}. Introdotta con
321   diverse versioni su diverse architetture.
322 \item[\const{PR\_MCE\_KILL}] Imposta la politica di gestione degli errori
323   dovuti a corruzione della memoria per problemi hardware. Questo tipo di
324   errori vengono riportati dall'hardware di controllo della RAM e vengono
325   gestiti dal kernel,\footnote{la funzionalità è disponibile solo sulle
326     piattaforme più avanzate che hanno il supporto hardware per questo tipo di
327     controlli.} ma devono essere opportunamente riportati ai processi che
328   usano quella parte di RAM che presenta errori; nel caso specifico questo
329   avviene attraverso l'emissione di un segnale di \signal{SIGBUS} (vedi
330   sez.~\ref{sec:sig_prog_error}).\footnote{in particolare viene anche
331     impostato il valore di \var{si\_code} in \struct{siginfo\_t} a
332     \const{BUS\_MCEERR\_AO}; per il significato di tutto questo si faccia
333     riferimento alla trattazione di sez.~\ref{sec:sig_sigaction}.}
334
335   Il comportamento di default prevede che per tutti i processi si applichi la
336   politica generale di sistema definita nel file
337   \sysctlfiled{vm/memory\_failure\_early\_kill}, ma specificando
338   per \param{arg2} il valore \constd{PR\_MCE\_KILL\_SET} è possibile impostare
339   con il contenuto di \param{arg3} una politica specifica del processo
340   chiamante. Si può tornare alla politica di default del sistema utilizzando
341   invece per \param{arg2} il valore \constd{PR\_MCE\_KILL\_CLEAR}. In tutti i
342   casi, per compatibilità con eventuali estensioni future, tutti i valori
343   degli argomenti non utilizzati devono essere esplicitamente posti a zero,
344   pena il fallimento della chiamata con un errore di \errval{EINVAL}.
345   
346   In caso di impostazione di una politica specifica del processo con
347   \const{PR\_MCE\_KILL\_SET} i valori di \param{arg3} possono essere soltanto
348   due, che corrispondono anche al valore che si trova nell'impostazione
349   generale di sistema di \texttt{memory\_failure\_early\_kill}, con
350   \constd{PR\_MCE\_KILL\_EARLY} si richiede l'emissione immediata di
351   \signal{SIGBUS} non appena viene rilevato un errore, mentre con
352   \constd{PR\_MCE\_KILL\_LATE} il segnale verrà inviato solo quando il processo
353   tenterà un accesso alla memoria corrotta. Questi due valori corrispondono
354   rispettivamente ai valori 1 e 0 di
355   \texttt{memory\_failure\_early\_kill}.\footnote{in sostanza nel primo caso
356     viene immediatamente inviato il segnale a tutti i processi che hanno la
357     memoria corrotta mappata all'interno del loro spazio degli indirizzi, nel
358     secondo caso prima la pagina di memoria viene tolta dallo spazio degli
359     indirizzi di ciascun processo, mentre il segnale viene inviato solo quei
360     processi che tentano di accedervi.} Si può usare per \param{arg3} anche un
361   terzo valore, \constd{PR\_MCE\_KILL\_DEFAULT}, che corrisponde a impostare
362   per il processo la politica di default.\footnote{si presume la politica di
363     default corrente, in modo da non essere influenzati da un eventuale
364     successivo cambiamento della stessa.} Introdotta a partire dal kernel
365   2.6.32.
366 \item[\constd{PR\_MCE\_KILL\_GET}] Ottiene come valore di ritorno della
367   funzione la politica di gestione degli errori dovuti a corruzione della
368   memoria. Tutti gli argomenti non utilizzati (al momento tutti) devono essere
369   nulli pena la ricezione di un errore di \errval{EINVAL}. Introdotta a
370   partire dal kernel 2.6.32.
371 \itindbeg{child~reaper}
372 \item[\constd{PR\_SET\_CHILD\_SUBREAPER}] Se \param{arg2} è diverso da zero
373   imposta l'attributo di \textit{child reaper} per il processo, se nullo lo
374   cancella. Lo stato di \textit{child reaper} è una funzionalità, introdotta
375   con il kernel 3.4, che consente di far svolgere al processo che ha questo
376   attributo il ruolo di ``\textsl{genitore adottivo}'' per tutti i processi
377   suoi ``\textsl{discendenti}'' che diventano orfani, in questo modo il
378   processo potrà ricevere gli stati di terminazione alla loro uscita,
379   sostituendo in questo ruolo \cmd{init} (si ricordi quanto illustrato in
380   sez.~\ref{sec:proc_termination}). Il meccanismo è stato introdotto ad uso
381   dei programmi di gestione dei servizi, per consentire loro di ricevere gli
382   stati di terminazione di tutti i processi che lanciano, anche se questi
383   eseguono una doppia \func{fork}; nel comportamento ordinario infatti questi
384   verrebbero adottati da \cmd{init} ed il programma che li ha lanciati non
385   sarebbe più in grado di riceverne lo stato di terminazione. Se un processo
386   con lo stato di \textit{child reaper} termina prima dei suoi discendenti,
387   svolgerà questo ruolo il più prossimo antenato ad avere lo stato di
388   \textit{child reaper}, 
389 \item[\constd{PR\_GET\_CHILD\_SUBREAPER}] Ottiene l'impostazione relativa allo
390   lo stato di \textit{child reaper} del processo chiamante, salvata come
391   \textit{value result} all'indirizzo puntato da \param{arg2} (da indicare
392   come di tipo \code{int *}). Il valore viene letto come valore logico, se
393   diverso da 0 lo stato di \textit{child reaper} è attivo altrimenti è
394   disattivo. Introdotta a partire dal kernel 3.4.
395 \itindend{child~reaper}
396
397
398 % TODO documentare PR_MPX_INIT e PR_MPX_RELEASE, vedi
399 % http://lwn.net/Articles/582712/ 
400
401 % TODO documentare PR_SET_MM_MAP aggiunta con il kernel 3.18, per impostare i
402 % parametri di base del layout dello spazio di indirizzi di un processo (area
403 % codice e dati, stack, brack pointer ecc. vedi
404 % http://git.kernel.org/linus/f606b77f1a9e362451aca8f81d8f36a3a112139e 
405
406 % TODO documentare ARCH_SET_CPUID e ARCH_GET_CPUID, introdotte con il kernel
407 % 4.12, vedi https://lwn.net/Articles/721182/
408 \label{sec:prctl_operation}
409 \end{basedescript}
410
411
412 %\subsection{La funzione \func{ptrace}}
413 %\label{sec:process_ptrace}
414
415 %Da fare
416
417 % TODO: trattare PTRACE_SEIZE, aggiunta con il kernel 3.1
418 % TODO: trattare PTRACE_O_EXITKILL, aggiunta con il kernel 3.8 (vedi
419 % http://lwn.net/Articles/529060/) 
420 % TODO: trattare PTRACE_GETSIGMASK e PTRACE_SETSIGMASK introdotte con il
421 % kernel 3.11
422 % TODO: trattare PTRACE_O_SUSPEND_SECCOMP, aggiunta con il kernel 4.3, vedi
423 % http://lwn.net/Articles/656675/ 
424
425
426 \section{La gestione avanzata della creazione dei processi}
427 \label{sec:process_adv_creation}
428
429 In questa sezione tratteremo le funzionalità avanzate relative alla creazione
430 dei processi e del loro ambiente, sia per quanto riguarda l'utilizzo delle
431 stesse per la creazione dei \textit{thread} che per la gestione dei
432 \textit{namespace} che sono alla base dei cosidetti \textit{container}.
433
434
435 \subsection{La \textit{system call} \func{clone}}
436 \label{sec:process_clone}
437
438 La funzione tradizionale con cui creare un nuovo processo in un sistema
439 Unix-like, come illustrato in sez.~\ref{sec:proc_fork}, è \func{fork}, ma con
440 l'introduzione del supporto del kernel per i \textit{thread}\unavref{ (vedi
441   cap.~\ref{cha:threads})}, si è avuta la necessità di una interfaccia che
442 consentisse un maggiore controllo sulla modalità con cui vengono creati nuovi
443 processi, che poi è stata utilizzata anche per fornire supporto per le
444 tecnologie di virtualizzazione dei processi (i cosiddetti \textit{container})
445 su cui torneremo in sez.~\ref{sec:process_namespaces}.
446
447 Per questo l'interfaccia per la creazione di un nuovo processo è stata
448 delegata ad una nuova \textit{system call}, \funcm{sys\_clone}, che consente
449 di reimplementare anche la tradizionale \func{fork}. In realtà in questo caso
450 più che di nuovi processi si può parlare della creazioni di nuovi
451 ``\textit{task}'' del kernel che possono assumere la veste sia di un processo
452 classico isolato dagli altri come quelli trattati finora, che di un
453 \textit{thread} in cui la memoria viene condivisa fra il processo chiamante ed
454 il nuovo processo creato, come quelli che vedremo in
455 sez.~\ref{sec:linux_thread}. Per evitare confusione fra \textit{thread} e
456 processi ordinari, abbiamo deciso di usare la nomenclatura \textit{task} per
457 indicare la unità di esecuzione generica messa a disposizione del kernel che
458 \texttt{sys\_clone} permette di creare.
459
460 La \textit{system call} richiede soltanto due argomenti: il
461 primo, \param{flags}, consente di controllare le modalità di creazione del
462 nuovo \textit{task}, il secondo, \param{child\_stack}, imposta l'indirizzo
463 dello \textit{stack} per il nuovo \textit{task}, e deve essere indicato quando
464 si intende creare un \textit{thread}. L'esecuzione del programma creato da
465 \func{sys\_clone} riprende, come per \func{fork}, da dopo l'esecuzione della
466 stessa.
467
468 La necessità di avere uno \textit{stack} alternativo c'è solo quando si
469 intende creare un \textit{thread}, in tal caso infatti il nuovo \textit{task}
470 vede esattamente la stessa memoria del \textit{task}
471 ``\textsl{padre}'',\footnote{in questo caso per padre si intende semplicemente
472   il \textit{task} che ha eseguito \func{sys\_clone} rispetto al \textit{task}
473   da essa creato, senza nessuna delle implicazioni che il concetto ha per i
474   processi.} e nella sua esecuzione alla prima chiamata di una funzione
475 andrebbe a scrivere sullo \textit{stack} usato anche dal padre (si ricordi
476 quanto visto in sez.~\ref{sec:proc_mem_layout} riguardo all'uso dello
477 \textit{stack}).
478
479 Per evitare di doversi garantire contro la evidente possibilità di
480 \textit{race condition} che questa situazione comporta (vedi
481 sez.~\ref{sec:proc_race_cond} per una spiegazione della problematica) è
482 necessario che il chiamante allochi preventivamente un'area di memoria.  In
483 genere lo si fa con una \func{malloc} che allochi un buffer che la funzione
484 imposterà come \textit{stack} del nuovo processo, avendo ovviamente cura di
485 non utilizzarlo direttamente nel processo chiamante.
486
487 In questo modo i due \textit{task} avranno degli \textit{stack} indipendenti e
488 non si dovranno affrontare problematiche di \textit{race condition}.  Si tenga
489 presente inoltre che in molte architetture di processore lo \textit{stack}
490 cresce verso il basso, pertanto in tal caso non si dovrà specificare
491 per \param{child\_stack} il puntatore restituito da \func{malloc}, ma un
492 puntatore alla fine del buffer da essa allocato.
493
494 Dato che tutto ciò è necessario solo per i \textit{thread} che condividono la
495 memoria, la \textit{system call}, a differenza della funzione di libreria che
496 vedremo a breve, consente anche di passare per \param{child\_stack} il valore
497 \val{NULL}, che non imposta un nuovo \textit{stack}. Se infatti si crea un
498 processo, questo ottiene un suo nuovo spazio degli indirizzi (è sottinteso
499 cioè che non si stia usando il flag \const{CLONE\_VM} che vedremo a breve) ed
500 in questo caso si applica la semantica del \textit{copy on write} illustrata
501 in sez.~\ref{sec:proc_fork}, per cui le pagine dello \textit{stack} verranno
502 automaticamente copiate come le altre e il nuovo processo avrà un suo
503 \textit{stack} totalmente indipendente da quello del padre.
504
505 Dato che l'uso principale della nuova \textit{system call} è quello relativo
506 alla creazione dei \textit{thread}, la \acr{glibc} definisce una funzione di
507 libreria con una sintassi diversa, orientata a questo scopo, e la
508 \textit{system call} resta accessibile solo se invocata esplicitamente come
509 visto in sez.~\ref{sec:proc_syscall}.\footnote{ed inoltre per questa
510   \textit{system call} non è disponibile la chiamata veloce con
511   \texttt{vsyscall}.} La funzione di libreria si chiama semplicemente
512 \funcd{clone} ed il suo prototipo è:
513
514 \begin{funcproto}{ 
515 \fhead{sched.h}
516 \fdecl{int clone(int (*fn)(void *), void *child\_stack, int flags, void *arg,
517   ...  \\
518 \phantom{int clone(}/* pid\_t *ptid, struct user\_desc *tls, pid\_t *ctid */ )}
519 \fdesc{Crea un nuovo processo o \textit{thread}.} 
520 }
521 {La funzione ritorna il \textit{Thread ID} assegnato al nuovo processo in caso
522   di successo e $-1$ per un errore, nel qual caso \var{errno} assumerà uno dei
523   valori: 
524 \begin{errlist}
525     \item[\errcode{EAGAIN}] sono già in esecuzione troppi processi.
526     \item[\errcode{EINVAL}] si è usata una combinazione non valida di flag o
527       un valore nullo per \param{child\_stack}.
528     \item[\errcode{ENOMEM}] non c'è memoria sufficiente per creare una nuova
529       \texttt{task\_struct} o per copiare le parti del contesto del chiamante
530       necessarie al nuovo \textit{task}.
531     \item[\errcode{EPERM}] non si hanno i privilegi di amministratore
532       richiesti dai flag indicati.
533 \end{errlist}}
534 \end{funcproto}
535
536 % NOTE: una pagina con la descrizione degli argomenti:
537 % * http://www.lindevdoc.org/wiki/Clone 
538
539 La funzione prende come primo argomento \param{fn} il puntatore alla funzione
540 che verrà messa in esecuzione nel nuovo processo, che può avere un unico
541 argomento di tipo puntatore a \ctyp{void}, il cui valore viene passato dal
542 terzo argomento \param{arg}. Per quanto il precedente prototipo possa
543 intimidire nella sua espressione, in realtà l'uso è molto semplice basterà
544 definire una qualunque funzione \param{fn} che restituisce un intero ed ha
545 come argomento un puntatore a \ctyp{void}, e \code{fn(arg)} sarà eseguita in
546 un nuovo processo.
547
548 Il nuovo processo resterà in esecuzione fintanto che la funzione \param{fn}
549 non ritorna, o esegue \func{exit} o viene terminata da un segnale. Il valore
550 di ritorno della funzione (o quello specificato con \func{exit}) verrà
551 utilizzato come stato di uscita della funzione. I tre
552 argomenti \param{ptid}, \param{tls} e \param{ctid} sono opzionali e sono
553 presenti solo a partire dal kernel 2.6 e sono stati aggiunti come supporto per
554 le funzioni di gestione dei \textit{thread} (la \textit{Native Thread Posix
555   Library}, vedi sez.~\ref{sec:linux_ntpl}) nella \acr{glibc}, essi vengono
556 utilizzati soltanto se si sono specificati rispettivamente i flag
557 \const{CLONE\_PARENT\_SETTID}, \const{CLONE\_SETTLS} e
558 \const{CLONE\_CHILD\_SETTID}. 
559
560 La funzione ritorna un l'identificatore del nuovo \textit{task}, denominato
561 \texttt{Thread ID} (da qui in avanti \ids{TID}) il cui significato è analogo
562 al \ids{PID} dei normali processi e che a questo corrisponde qualora si crei
563 un processo ordinario e non un \textit{thread}.
564
565 Il comportamento di \func{clone}, che si riflette sulle caratteristiche del
566 nuovo processo da essa creato, è controllato principalmente
567 dall'argomento \param{flags}, che deve essere specificato come maschera
568 binaria, ottenuta con un OR aritmetico di una delle costanti del seguente
569 elenco, che illustra quelle attualmente disponibili:\footnote{si fa
570   riferimento al momento della stesura di questa sezione, cioè con il kernel
571   3.2.}
572
573 \begin{basedescript}{\desclabelwidth{1.5 cm}\desclabelstyle{\nextlinelabel}}
574
575 \item[\constd{CLONE\_CHILD\_CLEARTID}] cancella il valore del \textit{thread
576     ID} posto all'indirizzo dato dall'argomento \param{ctid}, eseguendo un
577   riattivazione del \textit{futex} (vedi sez.~\ref{sec:xxx_futex}) a
578   quell'indirizzo. Questo flag viene utilizzato dalla librerie di gestione dei
579   \textit{thread} ed è presente dal kernel 2.5.49.
580
581 \item[\constd{CLONE\_CHILD\_SETTID}] scrive il \ids{TID} del \textit{thread}
582   figlio all'indirizzo dato dall'argomento \param{ctid}. Questo flag viene
583   utilizzato dalla librerie di gestione dei \textit{thread} ed è presente dal
584   kernel 2.5.49.
585
586 \item[\constd{CLONE\_FILES}] se impostato il nuovo processo condividerà con il
587   padre la \textit{file descriptor table} (vedi sez.~\ref{sec:file_fd}),
588   questo significa che ogni \textit{file descriptor} aperto da un processo
589   verrà visto anche dall'altro e che ogni chiusura o cambiamento dei
590   \textit{file descriptor flag} di un \textit{file descriptor} verrà per
591   entrambi.
592
593   Se non viene impostato il processo figlio eredita una copia della
594   \textit{file descriptor table} del padre e vale la semantica classica della
595   gestione dei \textit{file descriptor}, che costituisce il comportamento
596   ordinario di un sistema unix-like e che illustreremo in dettaglio in
597   sez.~\ref{sec:file_shared_access}.
598
599 \item[\constd{CLONE\_FS}] se questo flag viene impostato il nuovo processo
600   condividerà con il padre le informazioni relative all'albero dei file, ed in
601   particolare avrà la stessa radice (vedi sez.~\ref{sec:file_chroot}), la
602   stessa directory di lavoro (vedi sez.~\ref{sec:file_work_dir}) e la stessa
603   \textit{umask} (sez.~\ref{sec:file_perm_management}). Una modifica di una
604   qualunque di queste caratteristiche in un processo, avrà effetto anche
605   sull'altro. Se assente il nuovo processo riceverà una copia delle precedenti
606   informazioni, che saranno così indipendenti per i due processi, come avviene
607   nel comportamento ordinario di un sistema unix-like.
608
609 \item[\constd{CLONE\_IO}] se questo flag viene impostato il nuovo il nuovo
610   processo condividerà con il padre il contesto dell'I/O, altrimenti, come
611   come avviene nel comportamento ordinario con una \func{fork} otterrà un suo
612   contesto dell'I/O. 
613
614   Il contesto dell'I/O viene usato dagli \textit{scheduler} di I/O (visti in
615   sez.~\ref{sec:io_priority}) e se questo è lo stesso per diversi processi
616   questi vengono trattati come se fossero lo stesso, condividendo il tempo per
617   l'accesso al disco, e possono interscambiarsi nell'accesso a disco. L'uso di
618   questo flag consente, quando più \textit{thread} eseguono dell'I/O per conto
619   dello stesso processo (ad esempio con le funzioni di I/O asincrono di
620   sez.~\ref{sec:file_asyncronous_io}), migliori prestazioni.
621
622 %TODO : tutti i CLONE_NEW* attengono ai namespace, ed è meglio metterli nella
623 %relativa sezione da creare a parte
624
625 % \item[\constd{CLONE\_NEWIPC}] è uno dei flag ad uso dei \textit{container},
626 %   introdotto con il kernel 2.6.19. L'uso di questo flag crea per il nuovo
627 %   processo un nuovo \textit{namespace} per il sistema di IPC, sia per quello
628 %   di SysV (vedi sez.~\ref{sec:ipc_sysv}) che, dal kernel 2.6.30, per le code
629 %   di messaggi POSIX (vedi sez.~\ref{sec:ipc_posix_mq}); si applica cioè a
630 %   tutti quegli oggetti che non vegono identificati con un \textit{pathname}
631 %   sull'albero dei file.
632
633 %   L'uso di questo flag richiede privilegi di amministratore (più precisamente
634 %   la capacità \const{CAP\_SYS\_ADMIN}) e non può essere usato in combinazione
635 %   con \const{CLONE\_SYSVSEM}. 
636
637 % \item[\constd{CLONE\_NEWNET}]
638 % \item[\constd{CLONE\_NEWNS}]
639 % \item[\constd{CLONE\_NEWPID}]
640 % \item[\constd{CLONE\_NEWUTS}]
641
642
643 % TODO trattare CLONE_NEWCGROUP introdotto con il kernel 4.6, vedi
644 % http://lwn.net/Articles/680566/ 
645
646 \item[\constd{CLONE\_PARENT}]
647 \item[\constd{CLONE\_PARENT\_SETTID}]
648 \item[\constd{CLONE\_PID}]
649
650 \item[\constd{CLONE\_PTRACE}] se questo flag viene impostato ed il processo
651   chiamante viene tracciato (vedi sez.~\ref{sec:process_ptrace}) anche il
652   figlio viene tracciato. 
653
654 \item[\constd{CLONE\_SETTLS}]
655 \item[\constd{CLONE\_SIGHAND}]
656 \item[\constd{CLONE\_STOPPED}]
657 \item[\constd{CLONE\_SYSVSEM}]
658 \item[\constd{CLONE\_THREAD}]
659
660 \item[\constd{CLONE\_UNTRACED}] se questo flag viene impostato un processo non
661   può più forzare \const{CLONE\_PTRACE} su questo processo.
662
663 \item[\constd{CLONE\_VFORK}] se questo flag viene impostato il chiamante viene
664   fermato fintato che il figlio appena creato non rilascia la sua memoria
665   virtuale con una chiamata a \func{exec} o \func{exit}, viene quindi
666   replicato il comportamento di \func{vfork}.
667
668 \item[\constd{CLONE\_VM}] se questo flag viene impostato il nuovo processo
669   condividerà con il padre la stessa memoria virtuale, e le scritture in
670   memoria fatte da uno qualunque dei processi saranno visibili dall'altro,
671   così come ogni mappatura in memoria (vedi sez.~\ref{sec:file_memory_map}). 
672
673   Se non viene impostato il processo figlio otterrà una copia dello spazio
674   degli indirizzi e si otterrà il comportamento ordinario di un processo di un
675   sistema unix-like creato con la funzione \func{fork}.
676 \end{basedescript}
677
678
679
680 \subsection{La gestione dei \textit{namespace}}
681 \label{sec:process_namespaces}
682
683 \itindbeg{namespace}
684 Come accennato all'inizio di sez.~\ref{sec:process_clone} oltre al controllo
685 delle caratteristiche dei processi usate per la creazione dei \textit{thread},
686 l'uso di \func{clone} consente, ad uso delle nuove funzionalità di
687 virtualizzazione dei processi, di creare nuovi ``\textit{namespace}'' per una
688 serie di proprietà generali (come l'elenco dei \ids{PID}, l'albero dei file, i
689 \textit{mount point}, la rete, il sistema di IPC, ecc.).
690
691 L'uso dei ``\textit{namespace}'' consente creare gruppi di processi che vedono
692 le suddette proprietà in maniera indipendente fra loro. I processi di ciascun
693 gruppo vengono così eseguiti come in una sorta di spazio separato da quello
694 degli altri gruppi, che costituisce poi quello che viene chiamato un
695 \textit{container}.
696
697 \itindend{namespace}
698
699
700 \itindbeg{container}
701
702 \itindend{container}
703
704
705 %TODO sezione separata sui namespace 
706
707 %TODO trattare unshare, vedi anche http://lwn.net/Articles/532748/
708
709 %TODO: trattare la funzione setns e i namespace file descriptors (vedi
710 % http://lwn.net/Articles/407495/) introdotti con il kernel 3.0, altre
711 % informazioni su setns qui: http://lwn.net/Articles/532748/
712 % http://lwn.net/Articles/531498/
713
714
715 \section{La gestione avanzata della sicurezza}
716 \label{sec:process_security}
717
718 Tratteremo in questa sezione le funzionalità più avanzate relative alla
719 gestione della sicurezza, a partire dalle \textit{capabilities} e dalle
720 funzionalità di \textit{Secure Computing}, fino alle funzionalità relative
721 alla gestione delle chiavi crittografiche.
722
723
724
725 \subsection{La gestione delle \textit{capabilities}}
726 \label{sec:proc_capabilities}
727
728 \itindbeg{capabilities} 
729
730 Come accennato in sez.~\ref{sec:proc_access_id} l'architettura classica della
731 gestione dei privilegi in un sistema unix-like ha il sostanziale problema di
732 fornire all'amministratore dei poteri troppo ampi. Questo comporta che anche
733 quando si siano predisposte delle misure di protezione per in essere in grado
734 di difendersi dagli effetti di una eventuale compromissione del sistema (come
735 montare un filesystem in sola lettura per impedirne modifiche, o marcare un
736 file come immutabile) una volta che questa sia stata effettuata e si siano
737 ottenuti i privilegi di amministratore, queste misure potranno essere comunque
738 rimosse (nei casi elencati nella precedente nota si potrà sempre rimontare il
739 sistema in lettura-scrittura, o togliere l'attributo di immutabilità).
740
741 Il problema consiste nel fatto che nell'architettura tradizionale di un
742 sistema unix-like i controlli di accesso sono basati su un solo livello di
743 separazione: per i processi normali essi sono posti in atto, mentre per i
744 processi con i privilegi di amministratore essi non vengono neppure eseguiti.
745 Per questo motivo non era previsto alcun modo per evitare che un processo con
746 diritti di amministratore non potesse eseguire certe operazioni, o per cedere
747 definitivamente alcuni privilegi da un certo momento in poi. 
748
749 Per risolvere questo problema sono possibili varie soluzioni ed ad esempio dai
750 kernel 2.5 è stata introdotta la struttura dei
751 \itindex{Linux~Security~Modules} \textit{Linux Security Modules} che han
752 permesso di aggiungere varie forme di \itindex{Mandatory~Access~Control~(DAC)}
753 \textit{Mandatory Access Control} (MAC), in cui si potessero parcellizzare e
754 controllare nei minimi dettagli tutti i privilegi e le modalità in cui questi
755 possono essere usati dai programmi e trasferiti agli utenti, con la creazione
756 di varie estensioni (come \textit{SELinux}, \textit{Smack}, \textit{Tomoyo},
757 \textit{AppArmor}) che consentono di superare l'architettura tradizionale dei
758 permessi basati sul modello classico del controllo di accesso chiamato
759 \itindex{Discrectionary~Access~Control~(DAC)} \textit{Discrectionary Access
760   Control} (DAC).
761
762 Ma già in precedenza, a partire dai kernel della serie 2.2, era stato
763 introdotto un meccanismo, detto \textit{capabilities}, che consentisse di
764 suddividere i vari privilegi tradizionalmente associati all'amministratore in
765 un insieme di \textsl{capacità} distinte.  L'idea era che queste capacità
766 potessero essere abilitate e disabilitate in maniera indipendente per ciascun
767 processo con privilegi di amministratore, permettendo così una granularità
768 molto più fine nella distribuzione degli stessi che evitasse la situazione
769 originaria di ``\textsl{tutto o nulla}''.
770
771 \itindbeg{file~capabilities}
772
773 Il meccanismo completo delle \textit{capabilities} (l'implementazione si rifà
774 ad una bozza di quello che doveva diventare lo standard POSIX.1e, poi
775 abbandonato) prevede inoltre la possibilità di associare le stesse ai singoli
776 file eseguibili, in modo da poter stabilire quali capacità possono essere
777 utilizzate quando viene messo in esecuzione uno specifico programma; ma il
778 supporto per questa funzionalità, chiamata \textit{file capabilities}, è stato
779 introdotto soltanto a partire dal kernel 2.6.24. Fino ad allora doveva essere
780 il programma stesso ad eseguire una riduzione esplicita delle sue capacità,
781 cosa che ha reso l'uso di questa funzionalità poco diffuso, vista la presenza
782 di meccanismi alternativi per ottenere limitazioni delle capacità
783 dell'amministratore a livello di sistema operativo, come \textit{SELinux}.
784
785 Con questo supporto e con le ulteriori modifiche introdotte con il kernel
786 2.6.25 il meccanismo delle \textit{capabilities} è stato totalmente
787 rivoluzionato, rendendolo più aderente alle intenzioni originali dello
788 standard POSIX, rimuovendo il significato che fino ad allora aveva avuto la
789 capacità \const{CAP\_SETPCAP} e cambiando le modalità di funzionamento del
790 cosiddetto \textit{capabilities bounding set}. Ulteriori modifiche sono state
791 apportate con il kernel 2.6.26 per consentire la rimozione non ripristinabile
792 dei privilegi di amministratore. Questo fa sì che il significato ed il
793 comportamento del kernel finisca per dipendere dalla versione dello stesso e
794 dal fatto che le nuove \textit{file capabilities} siano abilitate o meno. Per
795 capire meglio la situazione e cosa è cambiato conviene allora spiegare con
796 maggiori dettagli come funziona il meccanismo delle \textit{capabilities}.
797
798 Il primo passo per frazionare i privilegi garantiti all'amministratore,
799 supportato fin dalla introduzione iniziale del kernel 2.2, è stato quello in
800 cui a ciascun processo sono stati associati tre distinti insiemi di
801 \textit{capabilities}, denominati rispettivamente \textit{permitted},
802 \textit{inheritable} ed \textit{effective}. Questi insiemi vengono mantenuti
803 in forma di tre diverse maschere binarie,\footnote{il kernel li mantiene, come
804   i vari identificatori di sez.~\ref{sec:proc_setuid}, all'interno della
805   \texttt{task\_struct} di ciascun processo (vedi
806   fig.~\ref{fig:proc_task_struct}), nei tre campi \texttt{cap\_effective},
807   \texttt{cap\_inheritable}, \texttt{cap\_permitted} del tipo
808   \texttt{kernel\_cap\_t}; questo era, fino al kernel 2.6.25 definito come
809   intero a 32 bit per un massimo di 32 \textit{capabilities} distinte,
810   attualmente è stato aggiornato ad un vettore in grado di mantenerne fino a
811   64.} in cui ciascun bit corrisponde ad una capacità diversa.
812
813 L'utilizzo di tre distinti insiemi serve a fornire una interfaccia flessibile
814 per l'uso delle \textit{capabilities}, con scopi analoghi a quelli per cui
815 sono mantenuti i diversi insiemi di identificatori di
816 sez.~\ref{sec:proc_setuid}; il loro significato, che è rimasto sostanzialmente
817 lo stesso anche dopo le modifiche seguite alla introduzione delle
818 \textit{file capabilities} è il seguente:
819 \begin{basedescript}{\desclabelwidth{2.1cm}\desclabelstyle{\nextlinelabel}}
820 \item[\textit{permitted}] l'insieme delle \textit{capabilities}
821   ``\textsl{permesse}'', cioè l'insieme di quelle capacità che un processo
822   \textsl{può} impostare come \textsl{effettive} o come
823   \textsl{ereditabili}. Se un processo cancella una capacità da questo insieme
824   non potrà più riassumerla.\footnote{questo nei casi ordinari, sono
825     previste però una serie di eccezioni, dipendenti anche dal tipo di
826     supporto, che vedremo meglio in seguito dato il notevole intreccio nella
827     casistica.}
828 \item[\textit{inheritable}] l'insieme delle \textit{capabilities}
829   ``\textsl{ereditabili}'', cioè di quelle che verranno trasmesse come insieme
830   delle \textsl{permesse} ad un nuovo programma eseguito attraverso una
831   chiamata ad \func{exec}.
832 \item[\textit{effective}] l'insieme delle \textit{capabilities}
833   ``\textsl{effettive}'', cioè di quelle che vengono effettivamente usate dal
834   kernel quando deve eseguire il controllo di accesso per le varie operazioni
835   compiute dal processo.
836 \label{sec:capabilities_set}
837 \end{basedescript}
838
839 Con l'introduzione delle \textit{file capabilities} sono stati introdotti
840 altri tre insiemi associabili a ciascun file.\footnote{la realizzazione viene
841   eseguita con l'uso di uno specifico attributo esteso,
842   \texttt{security.capability}, la cui modifica è riservata, (come illustrato
843   in sez.~\ref{sec:file_xattr}) ai processi dotato della capacità
844   \const{CAP\_SYS\_ADMIN}.} Le \textit{file capabilities} hanno effetto
845 soltanto quando il file che le porta viene eseguito come programma con una
846 \func{exec}, e forniscono un meccanismo che consente l'esecuzione dello stesso
847 con maggiori privilegi; in sostanza sono una sorta di estensione del
848 \acr{suid} bit limitato ai privilegi di amministratore. Anche questi tre
849 insiemi sono identificati con gli stessi nomi di quello dei processi, ma il
850 loro significato è diverso:
851 \begin{basedescript}{\desclabelwidth{2.1cm}\desclabelstyle{\nextlinelabel}}
852 \item[\textit{permitted}] (chiamato originariamente \textit{forced}) l'insieme
853   delle capacità che con l'esecuzione del programma verranno aggiunte alle
854   capacità \textsl{permesse} del processo.
855 \item[\textit{inheritable}] (chiamato originariamente \textit{allowed})
856   l'insieme delle capacità che con l'esecuzione del programma possono essere
857   ereditate dal processo originario (che cioè non vengono tolte
858   dall'\textit{inheritable set} del processo originale all'esecuzione di
859   \func{exec}).
860 \item[\textit{effective}] in questo caso non si tratta di un insieme ma di un
861   unico valore logico; se attivo all'esecuzione del programma tutte le
862   capacità che risulterebbero \textsl{permesse} verranno pure attivate,
863   inserendole automaticamente nelle \textsl{effettive}, se disattivato nessuna
864   capacità verrà attivata (cioè l'\textit{effective set} resterà vuoto).
865 \end{basedescript}
866
867 \itindbeg{capabilities~bounding~set}
868
869 Infine come accennato, esiste un ulteriore insieme, chiamato
870 \textit{capabilities bounding set}, il cui scopo è quello di costituire un
871 limite alle capacità che possono essere attivate per un programma. Il suo
872 funzionamento però è stato notevolmente modificato con l'introduzione delle
873 \textit{file capabilities} e si deve pertanto prendere in considerazione una
874 casistica assai complessa.
875
876 Per i kernel fino al 2.6.25, o se non si attiva il supporto per le
877 \textit{file capabilities}, il \textit{capabilities bounding set} è un
878 parametro generale di sistema, il cui valore viene riportato nel file
879 \sysctlfiled{kernel/cap-bound}. Il suo valore iniziale è definito in sede di
880 compilazione del kernel, e da sempre ha previsto come default la presenza di
881 tutte le \textit{capabilities} eccetto \const{CAP\_SETPCAP}. In questa
882 situazione solo il primo processo eseguito nel sistema (quello con
883 \textsl{pid} 1, di norma \texttt{/sbin/init}) ha la possibilità di
884 modificarlo; ogni processo eseguito successivamente, se dotato dei privilegi
885 di amministratore, è in grado soltanto di rimuovere una delle
886 \textit{capabilities} già presenti dell'insieme.\footnote{per essere precisi
887   occorre la capacità \const{CAP\_SYS\_MODULE}.}
888
889 In questo caso l'effetto complessivo del \textit{capabilities bounding set} è
890 che solo le capacità in esso presenti possono essere trasmesse ad un altro
891 programma attraverso una \func{exec}. Questo in sostanza significa che se un
892 qualunque programma elimina da esso una capacità, considerato che
893 \texttt{init} (almeno nelle versioni ordinarie) non supporta la reimpostazione
894 del \textit{bounding set}, questa non sarà più disponibile per nessun processo
895 a meno di un riavvio, eliminando così in forma definitiva quella capacità per
896 tutti, compreso l'amministratore.\footnote{la qual cosa, visto il default
897   usato per il \textit{capabilities bounding set}, significa anche che
898   \const{CAP\_SETPCAP} non è stata praticamente mai usata nella sua forma
899   originale.}
900
901 Con il kernel 2.6.25 e le \textit{file capabilities} il \textit{bounding set}
902 è diventato una proprietà di ciascun processo, che viene propagata invariata
903 sia attraverso una \func{fork} che una \func{exec}. In questo caso il file
904 \sysctlfile{kernel/cap-bound} non esiste e \texttt{init} non ha nessun
905 ruolo speciale, inoltre in questo caso all'avvio il valore iniziale prevede la
906 presenza di tutte le capacità (compresa \const{CAP\_SETPCAP}). 
907
908 Con questo nuovo meccanismo il \textit{bounding set} continua a ricoprire un
909 ruolo analogo al precedente nel passaggio attraverso una \func{exec}, come
910 limite alle capacità che possono essere aggiunte al processo in quanto
911 presenti nel \textit{permitted set} del programma messo in esecuzione, in
912 sostanza il nuovo programma eseguito potrà ricevere una capacità presente nel
913 suo \textit{permitted set} (quello del file) solo se questa è anche nel
914 \textit{bounding set} (del processo). In questo modo si possono rimuovere
915 definitivamente certe capacità da un processo, anche qualora questo dovesse
916 eseguire un programma privilegiato che prevede di riassegnarle.
917
918 Si tenga presente però che in questo caso il \textit{bounding set} blocca
919 esclusivamente le capacità indicate nel \textit{permitted set} del programma
920 che verrebbero attivate in caso di esecuzione, e non quelle eventualmente già
921 presenti nell'\textit{inheritable set} del processo (ad esempio perché
922 presenti prima di averle rimosse dal \textit{bounding set}). In questo caso
923 eseguendo un programma che abbia anche lui dette capacità nel suo
924 \textit{inheritable set} queste verrebbero assegnate.
925
926 In questa seconda versione inoltre il \textit{bounding set} costituisce anche
927 un limite per le capacità che possono essere aggiunte all'\textit{inheritable
928   set} del processo stesso con \func{capset}, sempre nel senso che queste
929 devono essere presenti nel \textit{bounding set} oltre che nel
930 \textit{permitted set} del processo. Questo limite vale anche per processi con
931 i privilegi di amministratore,\footnote{si tratta sempre di avere la
932   \textit{capability} \const{CAP\_SETPCAP}.} per i quali invece non vale la
933 condizione che le \textit{capabilities} da aggiungere nell'\textit{inheritable
934   set} debbano essere presenti nel proprio \textit{permitted set}.\footnote{lo
935   scopo anche in questo caso è ottenere una rimozione definitiva della
936   possibilità di passare una capacità rimossa dal \textit{bounding set}.}
937
938 Come si può notare per fare ricorso alle \textit{capabilities} occorre
939 comunque farsi carico di una notevole complessità di gestione, aggravata dalla
940 presenza di una radicale modifica del loro funzionamento con l'introduzione
941 delle \textit{file capabilities}. Considerato che il meccanismo originale era
942 incompleto e decisamente problematico nel caso di programmi che non ne
943 sapessero tener conto,\footnote{c'è stato un grosso problema di sicurezza con
944   \texttt{sendmail}, riuscendo a rimuovere \const{CAP\_SETGID}
945   dall'\textit{inheritable set} di un processo si ottenne di far fallire
946   \func{setuid} in maniera inaspettata per il programma (che aspettandosi
947   sempre il successo della funzione non ne controllava lo stato di uscita) con
948   la conseguenza di effettuare come amministratore operazioni che altrimenti
949   sarebbero state eseguite, senza poter apportare danni, da utente normale.}
950 ci soffermeremo solo sulla implementazione completa presente a partire dal
951 kernel 2.6.25, tralasciando ulteriori dettagli riguardo la versione
952 precedente.
953
954 Riassumendo le regole finora illustrate tutte le \textit{capabilities} vengono
955 ereditate senza modifiche attraverso una \func{fork} mentre, indicati con
956 \texttt{orig\_*} i valori degli insiemi del processo chiamante, con
957 \texttt{file\_*} quelli del file eseguito e con \texttt{bound\_set} il
958 \textit{capabilities bounding set}, dopo l'invocazione di \func{exec} il
959 processo otterrà dei nuovi insiemi di capacità \texttt{new\_*} secondo la
960 formula espressa dal seguente pseudo-codice C:
961
962 \includecodesnip{listati/cap-results.c}
963
964 % \begin{figure}[!htbp]
965 %   \footnotesize \centering
966 %   \begin{minipage}[c]{12cm}
967 %     \includecodesnip{listati/cap-results.c}
968 %   \end{minipage}
969 %   \caption{Espressione della modifica delle \textit{capabilities} attraverso
970 %     una \func{exec}.}
971 %   \label{fig:cap_across_exec}
972 % \end{figure}
973
974 \noindent e si noti come in particolare il \textit{capabilities bounding set}
975 non venga comunque modificato e resti lo stesso sia attraverso una \func{fork}
976 che attraverso una \func{exec}.
977
978
979 \itindend{capabilities~bounding~set}
980
981 A queste regole se ne aggiungono delle altre che servono a riprodurre il
982 comportamento tradizionale di un sistema unix-like in tutta una serie di
983 circostanze. La prima di queste è relativa a quello che avviene quando si
984 esegue un file senza \textit{capabilities}; se infatti si considerasse questo
985 equivalente al non averne assegnata alcuna, non essendo presenti capacità né
986 nel \textit{permitted set} né nell'\textit{inheritable set} del file,
987 nell'esecuzione di un qualunque programma l'amministratore perderebbe tutti i
988 privilegi originali dal processo.
989
990 Per questo motivo se un programma senza \textit{capabilities} assegnate viene
991 eseguito da un processo con \ids{UID} reale 0, esso verrà trattato come
992 se tanto il \textit{permitted set} che l'\textit{inheritable set} fossero con
993 tutte le \textit{capabilities} abilitate, con l'\textit{effective set} attivo,
994 col risultato di fornire comunque al processo tutte le capacità presenti nel
995 proprio \textit{bounding set}. Lo stesso avviene quando l'eseguibile ha attivo
996 il \acr{suid} bit ed appartiene all'amministratore, in entrambi i casi si
997 riesce così a riottenere il comportamento classico di un sistema unix-like.
998
999 Una seconda circostanza è quella relativa a cosa succede alle
1000 \textit{capabilities} di un processo nelle possibili transizioni da \ids{UID}
1001 nullo a \ids{UID} non nullo o viceversa (corrispondenti rispettivamente a
1002 cedere o riottenere i i privilegi di amministratore) che si possono effettuare
1003 con le varie funzioni viste in sez.~\ref{sec:proc_setuid}. In questo caso la
1004 casistica è di nuovo alquanto complessa, considerata anche la presenza dei
1005 diversi gruppi di identificatori illustrati in tab.~\ref{tab:proc_uid_gid}, si
1006 avrà allora che:
1007 \begin{enumerate*}
1008 \item se si passa da \ids{UID} effettivo nullo a non nullo
1009   l'\textit{effective set} del processo viene totalmente azzerato, se
1010   viceversa si passa da \ids{UID} effettivo non nullo a nullo il
1011   \textit{permitted set} viene copiato nell'\textit{effective set};
1012 \item se si passa da \textit{file system} \ids{UID} nullo a non nullo verranno
1013   cancellate dall'\textit{effective set} del processo tutte le capacità
1014   attinenti i file, e cioè \const{CAP\_LINUX\_IMMUTABLE}, \const{CAP\_MKNOD},
1015   \const{CAP\_DAC\_OVERRIDE}, \const{CAP\_DAC\_READ\_SEARCH},
1016   \const{CAP\_MAC\_OVERRIDE}, \const{CAP\_CHOWN}, \const{CAP\_FSETID} e
1017   \const{CAP\_FOWNER} (le prime due a partire dal kernel 2.2.30), nella
1018   transizione inversa verranno invece inserite nell'\textit{effective set}
1019   quelle capacità della precedente lista che sono presenti nel suo
1020   \textit{permitted set}.
1021 \item se come risultato di una transizione riguardante gli identificativi dei
1022   gruppi \textit{real}, \textit{saved} ed \textit{effective} in cui si passa
1023   da una situazione in cui uno di questi era nullo ad una in cui sono tutti
1024   non nulli,\footnote{in sostanza questo è il caso di quando si chiama
1025     \func{setuid} per rimuovere definitivamente i privilegi di amministratore
1026     da un processo.} verranno azzerati completamente sia il \textit{permitted
1027     set} che l'\textit{effective set}.
1028 \end{enumerate*}
1029 \label{sec:capability-uid-transition}
1030
1031 La combinazione di tutte queste regole consente di riprodurre il comportamento
1032 ordinario di un sistema di tipo Unix tradizionale, ma può risultare
1033 problematica qualora si voglia passare ad una configurazione di sistema
1034 totalmente basata sull'applicazione delle \textit{capabilities}; in tal caso
1035 infatti basta ad esempio eseguire un programma con \acr{suid} bit di proprietà
1036 dell'amministratore per far riottenere ad un processo tutte le capacità
1037 presenti nel suo \textit{bounding set}, anche se si era avuta la cura di
1038 cancellarle dal \textit{permitted set}.
1039
1040 \itindbeg{securebits}
1041
1042 Per questo motivo a partire dal kernel 2.6.26, se le \textit{file
1043   capabilities} sono abilitate, ad ogni processo viene stata associata una
1044 ulteriore maschera binaria, chiamata \textit{securebits flags}, su cui sono
1045 mantenuti una serie di flag (vedi tab.~\ref{tab:securebits_values}) il cui
1046 valore consente di modificare queste regole speciali che si applicano ai
1047 processi con \ids{UID} nullo. La maschera viene sempre mantenuta
1048 attraverso una \func{fork}, mentre attraverso una \func{exec} viene sempre
1049 cancellato il flag \const{SECURE\_KEEP\_CAPS}.
1050
1051 \begin{table}[htb]
1052   \centering
1053   \footnotesize
1054   \begin{tabular}{|l|p{10cm}|}
1055     \hline
1056     \textbf{Flag} & \textbf{Descrizione} \\
1057     \hline
1058     \hline
1059     \constd{SECURE\_KEEP\_CAPS}&Il processo non subisce la cancellazione delle
1060                                 sue \textit{capabilities} quando tutti i suoi
1061                                 \ids{UID} passano ad un valore non
1062                                 nullo (regola di compatibilità per il cambio
1063                                 di \ids{UID} n.~3 del precedente
1064                                 elenco), sostituisce il precedente uso
1065                                 dell'operazione \const{PR\_SET\_KEEPCAPS} di
1066                                 \func{prctl}.\\
1067     \constd{SECURE\_NO\_SETUID\_FIXUP}&Il processo non subisce le modifiche
1068                                 delle sue \textit{capabilities} nel passaggio
1069                                 da nullo a non nullo degli \ids{UID}
1070                                 dei gruppi \textit{effective} e
1071                                 \textit{file system} (regole di compatibilità
1072                                 per il cambio di \ids{UID} nn.~1 e 2 del
1073                                 precedente elenco).\\
1074     \constd{SECURE\_NOROOT}   & Il processo non assume nessuna capacità
1075                                 aggiuntiva quando esegue un programma, anche
1076                                 se ha \ids{UID} nullo o il programma ha
1077                                 il \acr{suid} bit attivo ed appartiene
1078                                 all'amministratore (regola di compatibilità
1079                                 per l'esecuzione di programmi senza
1080                                 \textit{capabilities}).\\
1081     \hline
1082   \end{tabular}
1083   \caption{Costanti identificative dei flag che compongono la maschera dei
1084     \textit{securebits}.}  
1085   \label{tab:securebits_values}
1086 \end{table}
1087
1088 A ciascuno dei flag di tab.~\ref{tab:securebits_values} è inoltre abbinato un
1089 corrispondente flag di blocco, identificato da una costante omonima con
1090 l'estensione \texttt{\_LOCKED}, la cui attivazione è irreversibile ed ha
1091 l'effetto di rendere permanente l'impostazione corrente del corrispondente
1092 flag ordinario; in sostanza con \constd{SECURE\_KEEP\_CAPS\_LOCKED} si rende
1093 non più modificabile \const{SECURE\_KEEP\_CAPS}, ed analogamente avviene con
1094 \constd{SECURE\_NO\_SETUID\_FIXUP\_LOCKED} per
1095 \const{SECURE\_NO\_SETUID\_FIXUP} e con \constd{SECURE\_NOROOT\_LOCKED} per
1096 \const{SECURE\_NOROOT}.
1097
1098 Per l'impostazione di questi flag sono state predisposte due specifiche
1099 operazioni di \func{prctl} (vedi sez.~\ref{sec:process_prctl}),
1100 \const{PR\_GET\_SECUREBITS}, che consente di ottenerne il valore, e
1101 \const{PR\_SET\_SECUREBITS}, che consente di modificarne il valore; per
1102 quest'ultima sono comunque necessari i privilegi di amministratore ed in
1103 particolare la capacità \const{CAP\_SETPCAP}. Prima dell'introduzione dei
1104 \textit{securebits} era comunque possibile ottenere lo stesso effetto di
1105 \const{SECURE\_KEEP\_CAPS} attraverso l'uso di un'altra operazione di
1106 \func{prctl}, \const{PR\_SET\_KEEPCAPS}.
1107
1108 \itindend{securebits}
1109
1110 Oltre alla gestione dei \textit{securebits} la nuova versione delle
1111 \textit{file capabilities} prevede l'uso di \func{prctl} anche per la gestione
1112 del \textit{capabilities bounding set}, attraverso altre due operazioni
1113 dedicate, \const{PR\_CAPBSET\_READ} per controllarne il valore e
1114 \const{PR\_CAPBSET\_DROP} per modificarlo; quest'ultima di nuovo è una
1115 operazione privilegiata che richiede la capacità \const{CAP\_SETPCAP} e che,
1116 come indica chiaramente il nome, permette solo la rimozione di una
1117 \textit{capability} dall'insieme; per i dettagli sull'uso di tutte queste
1118 operazioni si rimanda alla rilettura di sez.~\ref{sec:process_prctl}.
1119
1120 \itindend{file~capabilities}
1121
1122
1123 % NOTE per dati relativi al process capability bounding set, vedi:
1124 % http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=3b7391de67da515c91f48aa371de77cb6cc5c07e
1125
1126 % NOTE riferimenti ai vari cambiamenti vedi:
1127 % http://lwn.net/Articles/280279/  
1128 % http://lwn.net/Articles/256519/
1129 % http://lwn.net/Articles/211883/
1130
1131
1132 Un elenco delle delle \textit{capabilities} disponibili su Linux, con una
1133 breve descrizione ed il nome delle costanti che le identificano, è riportato
1134 in tab.~\ref{tab:proc_capabilities};\footnote{l'elenco presentato questa
1135   tabella, ripreso dalla pagina di manuale (accessibile con \texttt{man
1136     capabilities}) e dalle definizioni in
1137   \texttt{include/linux/capabilities.h}, è aggiornato al kernel 3.2.} la
1138 tabella è divisa in due parti, la prima riporta le \textit{capabilities}
1139 previste anche nella bozza dello standard POSIX1.e, la seconda quelle
1140 specifiche di Linux.  Come si può notare dalla tabella alcune
1141 \textit{capabilities} attengono a singole funzionalità e sono molto
1142 specializzate, mentre altre hanno un campo di applicazione molto vasto, che è
1143 opportuno dettagliare maggiormente.
1144
1145 \begin{table}[!h!btp]
1146   \centering
1147   \footnotesize
1148   \begin{tabular}{|l|p{10cm}|}
1149     \hline
1150     \textbf{Capacità}&\textbf{Descrizione}\\
1151     \hline
1152     \hline
1153 %
1154 % POSIX-draft defined capabilities.
1155 %
1156     \constd{CAP\_AUDIT\_CONTROL}& Abilitare e disabilitare il
1157                               controllo dell'auditing (dal kernel 2.6.11).\\ 
1158     \constd{CAP\_AUDIT\_WRITE}&Scrivere dati nel giornale di
1159                               auditing del kernel (dal kernel 2.6.11).\\ 
1160     % TODO verificare questa roba dell'auditing
1161     \constd{CAP\_BLOCK\_SUSPEND}&Utilizzare funzionalità che possono bloccare 
1162                               la sospensione del sistema (dal kernel 3.5).\\ 
1163     \constd{CAP\_CHOWN}     & Cambiare proprietario e gruppo
1164                               proprietario di un file (vedi
1165                               sez.~\ref{sec:file_ownership_management}).\\
1166     \constd{CAP\_DAC\_OVERRIDE}& Evitare il controllo dei
1167                                permessi di lettura, scrittura ed esecuzione dei
1168                                file, (vedi sez.~\ref{sec:file_access_control}).\\ 
1169     \constd{CAP\_DAC\_READ\_SEARCH}& Evitare il controllo dei
1170                               permessi di lettura ed esecuzione per
1171                               le directory (vedi
1172                               sez.~\ref{sec:file_access_control}).\\
1173     \const{CAP\_FOWNER}     & Evitare il controllo della proprietà di un file
1174                               per tutte le operazioni privilegiate non coperte
1175                               dalle precedenti \const{CAP\_DAC\_OVERRIDE} e
1176                               \const{CAP\_DAC\_READ\_SEARCH}.\\
1177     \constd{CAP\_FSETID}    & Evitare la cancellazione automatica dei bit
1178                               \acr{suid} e \acr{sgid} quando un file
1179                               per i quali sono impostati viene modificato da
1180                               un processo senza questa capacità e la capacità
1181                               di impostare il bit \acr{sgid} su un file anche
1182                               quando questo è relativo ad un gruppo cui non si
1183                               appartiene (vedi
1184                               sez.~\ref{sec:file_perm_management}).\\ 
1185     \constd{CAP\_KILL}      & Mandare segnali a qualunque
1186                               processo (vedi sez.~\ref{sec:sig_kill_raise}).\\
1187     \constd{CAP\_SETFCAP}   & Impostare le \textit{capabilities} di un file
1188                               (dal kernel 2.6.24).\\ 
1189     \constd{CAP\_SETGID}    & Manipolare i group ID dei
1190                               processi, sia il principale che i supplementari,
1191                               (vedi sez.~\ref{sec:proc_setgroups}) che quelli
1192                               trasmessi tramite i socket \textit{unix domain}
1193                               (vedi sez.~\ref{sec:unix_socket}).\\
1194     \constd{CAP\_SETUID}    & Manipolare gli user ID del
1195                               processo (vedi sez.~\ref{sec:proc_setuid}) e di
1196                               trasmettere un user ID arbitrario nel passaggio
1197                               delle credenziali coi socket \textit{unix
1198                                 domain} (vedi sez.~\ref{sec:unix_socket}).\\ 
1199 %
1200 % Linux specific capabilities
1201 %
1202 \hline
1203     \constd{CAP\_IPC\_LOCK} & Effettuare il \textit{memory locking} con le
1204                               funzioni \func{mlock}, \func{mlockall},
1205                               \func{shmctl}, \func{mmap} (vedi
1206                               sez.~\ref{sec:proc_mem_lock} e 
1207                               sez.~\ref{sec:file_memory_map}). \\ 
1208 % TODO verificare l'interazione con SHM_HUGETLB
1209     \constd{CAP\_IPC\_OWNER}& Evitare il controllo dei permessi
1210                               per le operazioni sugli oggetti di
1211                               intercomunicazione fra processi (vedi
1212                               sez.~\ref{sec:ipc_sysv}).\\  
1213     \constd{CAP\_LEASE}     & Creare dei \textit{file lease} (vedi
1214                               sez.~\ref{sec:file_asyncronous_lease})
1215                               pur non essendo proprietari del file (dal kernel
1216                               2.4).\\ 
1217     \constd{CAP\_LINUX\_IMMUTABLE}& Impostare sui file gli attributi 
1218                              \textit{immutable} e \textit{append-only} (vedi
1219                              sez.~\ref{sec:file_perm_overview}) se
1220                              supportati.\\
1221     \constd{CAP\_MAC\_ADMIN}& Amministrare il \textit{Mandatory
1222                                Access Control} di \textit{Smack} (dal kernel
1223                               2.6.25).\\
1224     \constd{CAP\_MAC\_OVERRIDE}& Evitare il \textit{Mandatory
1225                                Access Control} di \textit{Smack} (dal kernel
1226                               2.6.25).\\   
1227     \constd{CAP\_MKNOD}     & Creare file di dispositivo con \func{mknod} (vedi
1228                               sez.~\ref{sec:file_mknod}) (dal kernel 2.4).\\ 
1229     \const{CAP\_NET\_ADMIN} & Eseguire alcune operazioni
1230                               privilegiate sulla rete.\\
1231     \constd{CAP\_NET\_BIND\_SERVICE}& Porsi in ascolto su porte riservate (vedi 
1232                               sez.~\ref{sec:TCP_func_bind}).\\ 
1233     \constd{CAP\_NET\_BROADCAST}& Consentire l'uso di socket in
1234                               \textit{broadcast} e \textit{multicast}.\\ 
1235     \constd{CAP\_NET\_RAW}  & Usare socket \texttt{RAW} e \texttt{PACKET}
1236                               (vedi sez.~\ref{sec:sock_type}).\\ 
1237     \const{CAP\_SETPCAP}    & Effettuare modifiche privilegiate alle
1238                               \textit{capabilities}.\\   
1239     \const{CAP\_SYS\_ADMIN} & Eseguire una serie di compiti amministrativi.\\
1240     \constd{CAP\_SYS\_BOOT} & Eseguire un riavvio del sistema (vedi
1241                               sez.~\ref{sec:sys_reboot}).\\ 
1242     \constd{CAP\_SYS\_CHROOT}& Eseguire la funzione \func{chroot} (vedi 
1243                               sez.~\ref{sec:file_chroot}).\\
1244     \constd{CAP\_SYS\_MODULE}& Caricare e rimuovere moduli del kernel.\\ 
1245     \const{CAP\_SYS\_NICE}  & Modificare le varie priorità dei processi (vedi 
1246                               sez.~\ref{sec:proc_priority}).\\
1247     \constd{CAP\_SYS\_PACCT}& Usare le funzioni di \textit{accounting} dei 
1248                               processi (vedi
1249                               sez.~\ref{sec:sys_bsd_accounting}).\\  
1250     \constd{CAP\_SYS\_PTRACE}& La capacità di tracciare qualunque processo con
1251                               \func{ptrace} (vedi 
1252                               sez.~\ref{sec:process_ptrace}).\\
1253     \constd{CAP\_SYS\_RAWIO}& Operare sulle porte di I/O con \func{ioperm} e
1254                                \func{iopl} (vedi
1255                               sez.~\ref{sec:process_io_port}).\\
1256     \const{CAP\_SYS\_RESOURCE}& Superare le varie limitazioni sulle risorse.\\ 
1257     \constd{CAP\_SYS\_TIME} & Modificare il tempo di sistema (vedi 
1258                               sez.~\ref{sec:sys_time}).\\ 
1259     \constd{CAP\_SYS\_TTY\_CONFIG}&Simulare un \textit{hangup} della console,
1260                               con la funzione \func{vhangup}.\\
1261     \constd{CAP\_SYSLOG}    & Gestire il buffer dei messaggi
1262                               del kernel, (vedi sez.~\ref{sec:sess_daemon}),
1263                               introdotta dal kernel 2.6.38 come capacità
1264                               separata da \const{CAP\_SYS\_ADMIN}.\\
1265     \constd{CAP\_WAKE\_ALARM}&Usare i timer di tipo
1266                               \const{CLOCK\_BOOTTIME\_ALARM} e
1267                               \const{CLOCK\_REALTIME\_ALARM}, vedi
1268                               sez.~\ref{sec:sig_timer_adv} (dal kernel 3.0).\\  
1269     \hline
1270   \end{tabular}
1271   \caption{Le costanti che identificano le \textit{capabilities} presenti nel
1272     kernel.}
1273 \label{tab:proc_capabilities}
1274 \end{table}
1275
1276 \constbeg{CAP\_SETPCAP}
1277
1278 Prima di dettagliare il significato della capacità più generiche, conviene
1279 però dedicare un discorso a parte a \const{CAP\_SETPCAP}, il cui significato è
1280 stato completamente cambiato con l'introduzione delle \textit{file
1281   capabilities} nel kernel 2.6.24. In precedenza questa capacità era quella
1282 che permetteva al processo che la possedeva di impostare o rimuovere le
1283 \textit{capabilities} presenti nel suo \textit{permitted set} su un qualunque
1284 altro processo. In realtà questo non è mai stato l'uso inteso nelle bozze
1285 dallo standard POSIX, ed inoltre, come si è già accennato, dato che questa
1286 capacità è sempre stata assente (a meno di specifiche ricompilazioni del
1287 kernel) nel \textit{capabilities bounding set} usato di default, essa non è
1288 neanche mai stata realmente disponibile.
1289
1290 Con l'introduzione \textit{file capabilities} e il cambiamento del significato
1291 del \textit{capabilities bounding set} la possibilità di modificare le
1292 capacità di altri processi è stata completamente rimossa, e
1293 \const{CAP\_SETPCAP} ha acquisito quello che avrebbe dovuto essere il suo
1294 significato originario, e cioè la capacità del processo di poter inserire nel
1295 suo \textit{inheritable set} qualunque capacità presente nel \textit{bounding
1296   set}. Oltre a questo la disponibilità di \const{CAP\_SETPCAP} consente ad un
1297 processo di eliminare una capacità dal proprio \textit{bounding set} (con la
1298 conseguente impossibilità successiva di eseguire programmi con quella
1299 capacità), o di impostare i \textit{securebits} delle \textit{capabilities}.
1300
1301 \constend{CAP\_SETPCAP}
1302 \constbeg{CAP\_FOWNER}
1303
1304 La prima fra le capacità ``\textsl{ampie}'' che occorre dettagliare
1305 maggiormente è \const{CAP\_FOWNER}, che rimuove le restrizioni poste ad un
1306 processo che non ha la proprietà di un file in un vasto campo di
1307 operazioni;\footnote{vale a dire la richiesta che l'\ids{UID} effettivo del
1308   processo (o meglio l'\ids{UID} di filesystem, vedi
1309   sez.~\ref{sec:proc_setuid}) coincida con quello del proprietario.}  queste
1310 comprendono i cambiamenti dei permessi e dei tempi del file (vedi
1311 sez.~\ref{sec:file_perm_management} e sez.~\ref{sec:file_file_times}), le
1312 impostazioni degli attributi dei file e delle ACL (vedi
1313 sez.~\ref{sec:file_xattr} e \ref{sec:file_ACL}), poter ignorare lo
1314 \textit{sticky bit} nella cancellazione dei file (vedi
1315 sez.~\ref{sec:file_special_perm}), la possibilità di impostare il flag di
1316 \const{O\_NOATIME} con \func{open} e \func{fcntl} (vedi
1317 sez.~\ref{sec:file_open_close} e sez.~\ref{sec:file_fcntl_ioctl}) senza
1318 restrizioni.
1319
1320 \constend{CAP\_FOWNER}
1321 \constbeg{CAP\_NET\_ADMIN}
1322
1323 Una seconda capacità che copre diverse operazioni, in questo caso riguardanti
1324 la rete, è \const{CAP\_NET\_ADMIN}, che consente di impostare le opzioni
1325 privilegiate dei socket (vedi sez.~\ref{sec:sock_generic_options}), abilitare
1326 il \textit{multicasting} (vedi sez.\ref{sec:sock_ipv4_options}), eseguire la
1327 configurazione delle interfacce di rete (vedi
1328 sez.~\ref{sec:sock_ioctl_netdevice}) ed impostare la tabella di instradamento.
1329
1330 \constend{CAP\_NET\_ADMIN}
1331 \constbeg{CAP\_SYS\_ADMIN}
1332
1333 Una terza \textit{capability} con vasto campo di applicazione è
1334 \const{CAP\_SYS\_ADMIN}, che copre una serie di operazioni amministrative,
1335 come impostare le quote disco (vedi sez.\ref{sec:disk_quota}), attivare e
1336 disattivare la swap, montare, rimontare e smontare filesystem (vedi
1337 sez.~\ref{sec:filesystem_mounting}), effettuare operazioni di controllo su
1338 qualunque oggetto dell'IPC di SysV (vedi sez.~\ref{sec:ipc_sysv}), operare
1339 sugli attributi estesi dei file di classe \texttt{security} o \texttt{trusted}
1340 (vedi sez.~\ref{sec:file_xattr}), specificare un \ids{UID} arbitrario nella
1341 trasmissione delle credenziali dei socket (vedi
1342 sez.~\ref{sec:socket_credential_xxx}), assegnare classi privilegiate
1343 (\const{IOPRIO\_CLASS\_RT} e prima del kernel 2.6.25 anche
1344 \const{IOPRIO\_CLASS\_IDLE}) per lo scheduling dell'I/O (vedi
1345 sez.~\ref{sec:io_priority}), superare il limite di sistema sul numero massimo
1346 di file aperti,\footnote{quello indicato da \sysctlfiled{fs/file-max}.}
1347 effettuare operazioni privilegiate sulle chiavi mantenute dal kernel (vedi
1348 sez.~\ref{sec:keyctl_management}), usare la funzione \func{lookup\_dcookie},
1349 usare \const{CLONE\_NEWNS} con \func{unshare} e \func{clone}, (vedi
1350 sez.~\ref{sec:process_clone}).
1351
1352 \constend{CAP\_SYS\_ADMIN}
1353 \constbeg{CAP\_SYS\_NICE}
1354
1355 Originariamente \const{CAP\_SYS\_NICE} riguardava soltanto la capacità di
1356 aumentare le priorità di esecuzione dei processi, come la diminuzione del
1357 valore di \textit{nice} (vedi sez.~\ref{sec:proc_sched_stand}), l'uso delle
1358 priorità \textit{real-time} (vedi sez.~\ref{sec:proc_real_time}), o
1359 l'impostazione delle affinità di processore (vedi
1360 sez.~\ref{sec:proc_sched_multiprocess}); ma con l'introduzione di priorità
1361 anche riguardo le operazioni di accesso al disco, e, nel caso di sistemi NUMA,
1362 alla memoria, essa viene a coprire anche la possibilità di assegnare priorità
1363 arbitrarie nell'accesso a disco (vedi sez.~\ref{sec:io_priority}) e nelle
1364 politiche di allocazione delle pagine di memoria ai nodi di un sistema NUMA.
1365
1366 \constend{CAP\_SYS\_NICE}
1367 \constbeg{CAP\_SYS\_RESOURCE}
1368
1369 Infine la \textit{capability} \const{CAP\_SYS\_RESOURCE} attiene alla
1370 possibilità di superare i limiti imposti sulle risorse di sistema, come usare
1371 lo spazio disco riservato all'amministratore sui filesystem che lo supportano,
1372 usare la funzione \func{ioctl} per controllare il \textit{journaling} sul
1373 filesystem \acr{ext3}, non subire le quote disco, aumentare i limiti sulle
1374 risorse di un processo (vedi sez.~\ref{sec:sys_resource_limit}) e quelle sul
1375 numero di processi, ed i limiti sulle dimensioni dei messaggi delle code del
1376 SysV IPC (vedi sez.~\ref{sec:ipc_sysv_mq}).
1377
1378 \constend{CAP\_SYS\_RESOURCE}
1379
1380 Per la gestione delle \textit{capabilities} il kernel mette a disposizione due
1381 funzioni che permettono rispettivamente di leggere ed impostare i valori dei
1382 tre insiemi illustrati in precedenza. Queste due funzioni di sistema sono
1383 \funcd{capget} e \funcd{capset} e costituiscono l'interfaccia di gestione
1384 basso livello; i loro rispettivi prototipi sono:
1385
1386 \begin{funcproto}{
1387 \fhead{sys/capability.h}
1388 \fdecl{int capget(cap\_user\_header\_t hdrp, cap\_user\_data\_t datap)}
1389 \fdesc{Legge le \textit{capabilities}.} 
1390 \fdecl{int capset(cap\_user\_header\_t hdrp, const cap\_user\_data\_t datap)} 
1391 \fdesc{Imposta le \textit{capabilities}.} 
1392 }
1393
1394 {Le funzioni ritornano $0$ in caso di successo e $-1$ per un errore, nel qual
1395   caso \var{errno} assumerà uno dei valori: 
1396   \begin{errlist}
1397   \item[\errcode{EFAULT}] si è indicato un puntatore sbagliato o nullo
1398     per \param{hdrp} o \param{datap} (quest'ultimo può essere nullo solo se si
1399     usa \func{capget} per ottenere la versione delle \textit{capabilities}
1400     usata dal kernel).
1401   \item[\errcode{EINVAL}] si è specificato un valore non valido per uno dei
1402     campi di \param{hdrp}, in particolare una versione non valida della
1403     versione delle \textit{capabilities}.
1404   \item[\errcode{EPERM}] si è tentato di aggiungere una capacità nell'insieme
1405     delle \textit{capabilities} permesse, o di impostare una capacità non
1406     presente nell'insieme di quelle permesse negli insieme delle effettive o
1407     ereditate, o si è cercato di impostare una \textit{capability} di un altro
1408     processo senza avare \const{CAP\_SETPCAP}.
1409   \item[\errcode{ESRCH}] si è fatto riferimento ad un processo inesistente.
1410   \end{errlist}
1411 }
1412 \end{funcproto}
1413
1414 Queste due funzioni prendono come argomenti due tipi di dati dedicati,
1415 definiti come puntatori a due strutture specifiche di Linux, illustrate in
1416 fig.~\ref{fig:cap_kernel_struct}.  Per un certo periodo di tempo era anche
1417 indicato che per poterle utilizzare fosse necessario che la macro
1418 \macro{\_POSIX\_SOURCE} risultasse non definita (ed era richiesto di inserire
1419 una istruzione \texttt{\#undef \_POSIX\_SOURCE} prima di includere
1420 \headfiled{sys/capability.h}) requisito che non risulta più
1421 presente.\footnote{e non è chiaro neanche quanto sia mai stato davvero
1422   necessario.}
1423
1424 \begin{figure}[!htb]
1425   \footnotesize
1426   \centering
1427   \begin{minipage}[c]{0.8\textwidth}
1428     \includestruct{listati/cap_user_header_t.h}
1429   \end{minipage}
1430   \normalsize 
1431   \caption{Definizione delle strutture a cui fanno riferimento i puntatori
1432     \structd{cap\_user\_header\_t} e \structd{cap\_user\_data\_t} usati per
1433     l'interfaccia di gestione di basso livello delle \textit{capabilities}.}
1434   \label{fig:cap_kernel_struct}
1435 \end{figure}
1436
1437 Si tenga presente che le strutture di fig.~\ref{fig:cap_kernel_struct}, come i
1438 prototipi delle due funzioni \func{capget} e \func{capset}, sono soggette ad
1439 essere modificate con il cambiamento del kernel (in particolare i tipi di dati
1440 delle strutture) ed anche se finora l'interfaccia è risultata stabile, non c'è
1441 nessuna assicurazione che questa venga mantenuta,\footnote{viene però
1442   garantito che le vecchie funzioni continuino a funzionare.} Pertanto se si
1443 vogliono scrivere programmi portabili che possano essere eseguiti senza
1444 modifiche o adeguamenti su qualunque versione del kernel è opportuno
1445 utilizzare le interfacce di alto livello che vedremo più avanti.
1446
1447 La struttura a cui deve puntare l'argomento \param{hdrp} serve ad indicare,
1448 tramite il campo \var{pid}, il \ids{PID} del processo del quale si vogliono
1449 leggere o modificare le \textit{capabilities}. Con \func{capset} questo, se si
1450 usano le \textit{file capabilities}, può essere solo 0 o il \ids{PID} del
1451 processo chiamante, che sono equivalenti. Non tratteremo, essendo comunque di
1452 uso irrilevante, il caso in cui, in mancanza di tale supporto, la funzione può
1453 essere usata per modificare le \textit{capabilities} di altri processi, per il
1454 quale si rimanda, se interessati, alla lettura della pagina di manuale.
1455
1456 Il campo \var{version} deve essere impostato al valore della versione delle
1457 stesse usata dal kernel (quello indicato da una delle costanti
1458 \texttt{\_LINUX\_CAPABILITY\_VERSION\_n} di fig.~\ref{fig:cap_kernel_struct})
1459 altrimenti le funzioni ritorneranno con un errore di \errcode{EINVAL},
1460 restituendo nel campo stesso il valore corretto della versione in uso. La
1461 versione due è comunque deprecata e non deve essere usata, ed il kernel
1462 stamperà un avviso se lo si fa.
1463
1464 I valori delle \textit{capabilities} devono essere passati come maschere
1465 binarie;\footnote{e si tenga presente che i valori di
1466   tab.~\ref{tab:proc_capabilities} non possono essere combinati direttamente,
1467   indicando il numero progressivo del bit associato alla relativa capacità.}
1468 con l'introduzione delle \textit{capabilities} a 64 bit inoltre il
1469 puntatore \param{datap} non può essere più considerato come relativo ad una
1470 singola struttura, ma ad un vettore di due strutture.\footnote{è questo cambio
1471   di significato che ha portato a deprecare la versione 2, che con
1472   \func{capget} poteva portare ad un buffer overflow per vecchie applicazioni
1473   che continuavano a considerare \param{datap} come puntatore ad una singola
1474   struttura.}
1475
1476 Dato che le precedenti funzioni, oltre ad essere specifiche di Linux, non
1477 garantiscono la stabilità nell'interfaccia, è sempre opportuno effettuare la
1478 gestione delle \textit{capabilities} utilizzando le funzioni di libreria a
1479 questo dedicate. Queste funzioni, che seguono quanto previsto nelle bozze
1480 dello standard POSIX.1e, non fanno parte della \acr{glibc} e sono fornite in
1481 una libreria a parte,\footnote{la libreria è \texttt{libcap2}, nel caso di
1482   Debian può essere installata con il pacchetto omonimo.} pertanto se un
1483 programma le utilizza si dovrà indicare esplicitamente al compilatore l'uso
1484 della suddetta libreria attraverso l'opzione \texttt{-lcap}.
1485
1486 \itindbeg{capability~state}
1487
1488 Le funzioni dell'interfaccia alle \textit{capabilities} definite nelle bozze
1489 dello standard POSIX.1e prevedono l'uso di un tipo di dato opaco,
1490 \typed{cap\_t}, come puntatore ai dati mantenuti nel cosiddetto
1491 \textit{capability state},\footnote{si tratta in sostanza di un puntatore ad
1492   una struttura interna utilizzata dalle librerie, i cui campi non devono mai
1493   essere acceduti direttamente.} in sono memorizzati tutti i dati delle
1494 \textit{capabilities}.
1495
1496 In questo modo è possibile mascherare i dettagli della gestione di basso
1497 livello, che potranno essere modificati senza dover cambiare le funzioni
1498 dell'interfaccia, che fanno riferimento soltanto ad oggetti di questo tipo.
1499 L'interfaccia pertanto non soltanto fornisce le funzioni per modificare e
1500 leggere le \textit{capabilities}, ma anche quelle per gestire i dati
1501 attraverso i \textit{capability state}, che presentano notevoli affinità,
1502 essendo parte di bozze dello stesso standard, con quelle già viste per le ACL.
1503
1504 La prima funzione dell'interfaccia è quella che permette di inizializzare un
1505 \textit{capability state}, allocando al contempo la memoria necessaria per i
1506 relativi dati. La funzione è \funcd{cap\_init} ed il suo prototipo è:
1507
1508 \begin{funcproto}{
1509 \fhead{sys/capability.h}
1510 \fdecl{cap\_t cap\_init(void)}
1511 \fdesc{Crea ed inizializza un \textit{capability state}.} 
1512 }
1513
1514 {La funzione ritorna un \textit{capability state} in caso di successo e
1515   \val{NULL} per un errore, nel qual caso \var{errno} potrà assumere solo il
1516   valore \errval{ENOMEM}.  }
1517 \end{funcproto}
1518
1519 La funzione restituisce il puntatore \type{cap\_t} ad uno stato inizializzato
1520 con tutte le \textit{capabilities} azzerate. In caso di errore (cioè quando
1521 non c'è memoria sufficiente ad allocare i dati) viene restituito \val{NULL}
1522 ed \var{errno} viene impostata a \errval{ENOMEM}.  
1523
1524 La memoria necessaria a mantenere i dati viene automaticamente allocata da
1525 \func{cap\_init}, ma dovrà essere disallocata esplicitamente quando non è più
1526 necessaria utilizzando, per questo l'interfaccia fornisce una apposita
1527 funzione, \funcd{cap\_free}, il cui prototipo è:
1528
1529 \begin{funcproto}{
1530 \fhead{sys/capability.h}
1531 \fdecl{int cap\_free(void *obj\_d)}
1532 \fdesc{Disalloca la memoria allocata per i dati delle \textit{capabilities}..} 
1533 }
1534
1535 {La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
1536   caso \var{errno} potrà assumere solo il valore \errval{EINVAL}.
1537 }
1538 \end{funcproto}
1539
1540
1541 La funzione permette di liberare la memoria allocata dalle altre funzioni
1542 della libreria sia per un \textit{capability state}, nel qual caso l'argomento
1543 sarà un dato di tipo \type{cap\_t}, che per una descrizione testuale dello
1544 stesso,\footnote{cioè quanto ottenuto tramite la funzione
1545   \func{cap\_to\_text}.} nel qual caso l'argomento sarà un dato di tipo
1546 \texttt{char *}. Per questo motivo l'argomento \param{obj\_d} è dichiarato
1547 come \texttt{void *}, per evitare la necessità di eseguire un \textit{cast},
1548 ma dovrà comunque corrispondere ad un puntatore ottenuto tramite le altre
1549 funzioni della libreria, altrimenti la funzione fallirà con un errore di
1550 \errval{EINVAL}.
1551
1552 Infine si può creare una copia di un \textit{capability state} ottenuto in
1553 precedenza tramite la funzione \funcd{cap\_dup}, il cui prototipo è:
1554
1555 \begin{funcproto}{
1556 \fhead{sys/capability.h}
1557 \fdecl{cap\_t cap\_dup(cap\_t cap\_p)}
1558 \fdesc{Duplica un \textit{capability state} restituendone una copia.} 
1559 }
1560
1561 {La funzione ritorna un \textit{capability state} in caso di successo e
1562   \val{NULL} per un errore, nel qual caso \var{errno} assumerà i valori
1563   \errval{ENOMEM} o \errval{EINVAL} nel loro significato generico.}
1564 \end{funcproto}
1565
1566
1567 La funzione crea una copia del \textit{capability state} posto all'indirizzo
1568 \param{cap\_p} che si è passato come argomento, restituendo il puntatore alla
1569 copia, che conterrà gli stessi valori delle \textit{capabilities} presenti
1570 nell'originale. La memoria necessaria viene allocata automaticamente dalla
1571 funzione. Una volta effettuata la copia i due \textit{capability state}
1572 potranno essere modificati in maniera completamente indipendente, ed alla fine
1573 delle operazioni si dovrà disallocare anche la copia, oltre all'originale.
1574
1575 Una seconda classe di funzioni di servizio previste dall'interfaccia sono
1576 quelle per la gestione dei dati contenuti all'interno di un \textit{capability
1577   state}; la prima di queste è \funcd{cap\_clear}, il cui prototipo è:
1578
1579 \begin{funcproto}{
1580 \fhead{sys/capability.h}
1581 \fdecl{int cap\_clear(cap\_t cap\_p)}
1582 \fdesc{Inizializza un \textit{capability state} cancellando tutte le
1583   \textit{capabilities}.}
1584 }
1585
1586 {La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
1587   caso \var{errno} potrà assumere solo il valore \errval{EINVAL}.
1588 }
1589 \end{funcproto}
1590
1591 La funzione si limita ad azzerare tutte le \textit{capabilities} presenti nel
1592 \textit{capability state} all'indirizzo \param{cap\_p} passato come argomento,
1593 restituendo uno stato \textsl{vuoto}, analogo a quello che si ottiene nella
1594 creazione con \func{cap\_init}.
1595
1596 Una variante di \func{cap\_clear} è \funcd{cap\_clear\_flag} che cancella da
1597 un \textit{capability state} tutte le \textit{capabilities} di un certo
1598 insieme fra quelli elencati a pag.~\pageref{sec:capabilities_set}, il suo
1599 prototipo è:
1600
1601 \begin{funcproto}{
1602 \fhead{sys/capability.h}
1603 \fdecl{int cap\_clear\_flag(cap\_t cap\_p, cap\_flag\_t flag)} 
1604 \fdesc{Cancella delle \textit{capabilities} da un \textit{capability state}.} 
1605 }
1606
1607 {La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
1608   caso \var{errno}  potrà assumere solo il valore \errval{EINVAL}.
1609 }
1610 \end{funcproto}
1611
1612 La funzione richiede che si indichi quale degli insiemi si intente cancellare
1613 da \param{cap\_p} con l'argomento \param{flag}. Questo deve essere specificato
1614 con una variabile di tipo \type{cap\_flag\_t} che può assumere
1615 esclusivamente\footnote{si tratta in effetti di un tipo enumerato, come si può
1616   verificare dalla sua definizione che si trova in
1617   \headfile{sys/capability.h}.} uno dei valori illustrati in
1618 tab.~\ref{tab:cap_set_identifier}.
1619
1620 \begin{table}[htb]
1621   \centering
1622   \footnotesize
1623   \begin{tabular}[c]{|l|l|}
1624     \hline
1625     \textbf{Valore} & \textbf{Significato} \\
1626     \hline
1627     \hline
1628     \constd{CAP\_EFFECTIVE}  & Capacità dell'insieme \textsl{effettivo}.\\
1629     \constd{CAP\_PERMITTED}  & Capacità dell'insieme \textsl{permesso}.\\ 
1630     \constd{CAP\_INHERITABLE}& Capacità dell'insieme \textsl{ereditabile}.\\
1631     \hline
1632   \end{tabular}
1633   \caption{Valori possibili per il tipo di dato \typed{cap\_flag\_t} che
1634     identifica gli insiemi delle \textit{capabilities}.}
1635   \label{tab:cap_set_identifier}
1636 \end{table}
1637
1638 Si possono inoltre confrontare in maniera diretta due diversi
1639 \textit{capability state} con la funzione \funcd{cap\_compare}; il suo
1640 prototipo è:
1641
1642 \begin{funcproto}{
1643 \fhead{sys/capability.h}
1644 \fdecl{int cap\_compare(cap\_t cap\_a, cap\_t cap\_b)}
1645 \fdesc{Confronta due \textit{capability state}.} 
1646 }
1647
1648 {La funzione ritorna $0$ se i \textit{capability state} sono identici
1649     ed un valore positivo se differiscono, non sono previsti errori.}
1650 \end{funcproto}
1651
1652
1653 La funzione esegue un confronto fra i due \textit{capability state} passati
1654 come argomenti e ritorna in un valore intero il risultato, questo è nullo se
1655 sono identici o positivo se vi sono delle differenze. Il valore di ritorno
1656 della funzione consente inoltre di per ottenere ulteriori informazioni su
1657 quali sono gli insiemi di \textit{capabilities} che risultano differenti.  Per
1658 questo si può infatti usare la apposita macro \macro{CAP\_DIFFERS}:
1659
1660 {\centering
1661 \vspace{3pt}
1662 \begin{funcbox}{
1663 \fhead{sys/capability.h}
1664 \fdecl{int \macrod{CAP\_DIFFERS}(value, flag)}
1665 \fdesc{Controlla lo stato di eventuali differenze delle \textit{capabilities}
1666   nell'insieme \texttt{flag}.}
1667 }
1668 \end{funcbox}
1669 }
1670
1671 La macro richiede che si passi nell'argomento \texttt{value} il risultato
1672 della funzione \func{cap\_compare} e in \texttt{flag} l'indicazione (coi
1673 valori di tab.~\ref{tab:cap_set_identifier}) dell'insieme che si intende
1674 controllare; restituirà un valore diverso da zero se le differenze rilevate da
1675 \func{cap\_compare} sono presenti nell'insieme indicato.
1676
1677 Per la gestione dei singoli valori delle \textit{capabilities} presenti in un
1678 \textit{capability state} l'interfaccia prevede due funzioni specifiche,
1679 \funcd{cap\_get\_flag} e \funcd{cap\_set\_flag}, che permettono
1680 rispettivamente di leggere o impostare il valore di una capacità all'interno
1681 in uno dei tre insiemi già citati; i rispettivi prototipi sono:
1682
1683 \begin{funcproto}{
1684 \fhead{sys/capability.h}
1685 \fdecl{int cap\_get\_flag(cap\_t cap\_p, cap\_value\_t cap, cap\_flag\_t 
1686 flag,\\
1687 \phantom{int cap\_get\_flag(}cap\_flag\_value\_t *value\_p)}
1688 \fdesc{Legge il valore di una \textit{capability}.}
1689 \fdecl{int cap\_set\_flag(cap\_t cap\_p, cap\_flag\_t flag, int ncap,
1690   cap\_value\_t *caps, \\
1691 \phantom{int cap\_set\_flag(}cap\_flag\_value\_t value)} 
1692 \fdesc{Imposta il valore di una \textit{capability}.} 
1693 }
1694
1695 {Le funzioni ritornano $0$ in caso di successo e $-1$ per un errore, nel qual
1696   caso \var{errno} potrà assumere solo il valore \errval{EINVAL}.  
1697 }
1698 \end{funcproto}
1699
1700 In entrambe le funzioni l'argomento \param{cap\_p} indica il puntatore al
1701 \textit{capability state} su cui operare, mentre l'argomento \param{flag}
1702 indica su quale dei tre insiemi si intende operare, sempre con i valori di
1703 tab.~\ref{tab:cap_set_identifier}.  La capacità che si intende controllare o
1704 impostare invece deve essere specificata attraverso una variabile di tipo
1705 \typed{cap\_value\_t}, che può prendere come valore uno qualunque di quelli
1706 riportati in tab.~\ref{tab:proc_capabilities}, in questo caso però non è
1707 possibile combinare diversi valori in una maschera binaria, una variabile di
1708 tipo \type{cap\_value\_t} può indicare una sola capacità.\footnote{in
1709   \headfile{sys/capability.h} il tipo \type{cap\_value\_t} è definito come
1710   \ctyp{int}, ma i valori validi sono soltanto quelli di
1711   tab.~\ref{tab:proc_capabilities}.}
1712
1713 Infine lo stato di una capacità è descritto ad una variabile di tipo
1714 \type{cap\_flag\_value\_t}, che a sua volta può assumere soltanto
1715 uno\footnote{anche questo è un tipo enumerato.} dei valori di
1716 tab.~\ref{tab:cap_value_type}.
1717
1718 \begin{table}[htb]
1719   \centering
1720   \footnotesize
1721   \begin{tabular}[c]{|l|l|}
1722     \hline
1723     \textbf{Valore} & \textbf{Significato} \\
1724     \hline
1725     \hline
1726     \constd{CAP\_CLEAR}& La capacità non è impostata.\\ 
1727     \constd{CAP\_SET}  & La capacità è impostata.\\
1728     \hline
1729   \end{tabular}
1730   \caption{Valori possibili per il tipo di dato \typed{cap\_flag\_value\_t} che
1731     indica lo stato di una capacità.}
1732   \label{tab:cap_value_type}
1733 \end{table}
1734
1735 La funzione \func{cap\_get\_flag} legge lo stato della capacità indicata
1736 dall'argomento \param{cap} all'interno dell'insieme indicato dall'argomento
1737 \param{flag} e lo restituisce come \textit{value result argument} nella
1738 variabile puntata dall'argomento \param{value\_p}. Questa deve essere di tipo
1739 \type{cap\_flag\_value\_t} ed assumerà uno dei valori di
1740 tab.~\ref{tab:cap_value_type}. La funzione consente pertanto di leggere solo
1741 lo stato di una capacità alla volta.
1742
1743 La funzione \func{cap\_set\_flag} può invece impostare in una sola chiamata
1744 più \textit{capabilities}, anche se solo all'interno dello stesso insieme ed
1745 allo stesso valore. Per questo motivo essa prende un vettore di valori di tipo
1746 \type{cap\_value\_t} nell'argomento \param{caps}, la cui dimensione viene
1747 specificata dall'argomento \param{ncap}. Il tipo di impostazione da eseguire
1748 (cancellazione o attivazione) per le capacità elencate in \param{caps} viene
1749 indicato dall'argomento \param{value} sempre con i valori di
1750 tab.~\ref{tab:cap_value_type}.
1751
1752 Per semplificare la gestione delle \textit{capabilities} l'interfaccia prevede
1753 che sia possibile utilizzare anche una rappresentazione testuale del contenuto
1754 di un \textit{capability state} e fornisce le opportune funzioni di
1755 gestione;\footnote{entrambe erano previste dalla bozza dello standard
1756   POSIX.1e.} la prima di queste, che consente di ottenere la rappresentazione
1757 testuale, è \funcd{cap\_to\_text}, il cui prototipo è:
1758
1759 \begin{funcproto}{
1760 \fhead{sys/capability.h}
1761 \fdecl{char *cap\_to\_text(cap\_t caps, ssize\_t *length\_p)}
1762 \fdesc{Genera una visualizzazione testuale delle \textit{capabilities}.} 
1763 }
1764
1765 {La funzione ritorna un puntatore alla stringa con la descrizione delle
1766   \textit{capabilities} in caso di successo e \val{NULL} per un errore, nel
1767   qual caso \var{errno} assumerà i valori \errval{EINVAL} o \errval{ENOMEM}
1768   nel loro significato generico.}
1769 \end{funcproto}
1770
1771 La funzione ritorna l'indirizzo di una stringa contente la descrizione
1772 testuale del contenuto del \textit{capability state} \param{caps} passato come
1773 argomento, e, qualora l'argomento \param{length\_p} sia diverso da \val{NULL},
1774 restituisce come \textit{value result argument} nella variabile intera da
1775 questo puntata la lunghezza della stringa. La stringa restituita viene
1776 allocata automaticamente dalla funzione e pertanto dovrà essere liberata con
1777 \func{cap\_free}.
1778
1779 La rappresentazione testuale, che viene usata anche dai programmi di gestione a
1780 riga di comando, prevede che lo stato venga rappresentato con una stringa di
1781 testo composta da una serie di proposizioni separate da spazi, ciascuna delle
1782 quali specifica una operazione da eseguire per creare lo stato finale. Nella
1783 rappresentazione si fa sempre conto di partire da uno stato in cui tutti gli
1784 insiemi sono vuoti e si provvede a impostarne i contenuti.
1785
1786 Ciascuna proposizione è nella forma di un elenco di capacità, espresso con i
1787 nomi di tab.~\ref{tab:proc_capabilities} separati da virgole, seguito da un
1788 operatore, e dall'indicazione degli insiemi a cui l'operazione si applica. I
1789 nomi delle capacità possono essere scritti sia maiuscoli che minuscoli, viene
1790 inoltre riconosciuto il nome speciale \texttt{all} che è equivalente a
1791 scrivere la lista completa. Gli insiemi sono identificati dalle tre lettere
1792 iniziali: ``\texttt{p}'' per il \textit{permitted}, ``\texttt{i}'' per
1793 l'\textit{inheritable} ed ``\texttt{e}'' per l'\textit{effective} che devono
1794 essere sempre minuscole, e se ne può indicare più di uno.
1795
1796 Gli operatori possibili sono solo tre: ``\texttt{+}'' che aggiunge le capacità
1797 elencate agli insiemi indicati, ``\texttt{-}'' che le toglie e ``\texttt{=}''
1798 che le assegna esattamente. I primi due richiedono che sia sempre indicato sia
1799 un elenco di capacità che gli insiemi a cui esse devono applicarsi, e
1800 rispettivamente attiveranno o disattiveranno le capacità elencate nell'insieme
1801 o negli insiemi specificati, ignorando tutto il resto. I due operatori possono
1802 anche essere combinati nella stessa proposizione, per aggiungere e togliere le
1803 capacità dell'elenco da insiemi diversi.
1804
1805 L'assegnazione si applica invece su tutti gli insiemi allo stesso tempo,
1806 pertanto l'uso di ``\texttt{=}'' è equivalente alla cancellazione preventiva
1807 di tutte le capacità ed alla impostazione di quelle elencate negli insiemi
1808 specificati, questo significa che in genere lo si usa una sola volta
1809 all'inizio della stringa. In tal caso l'elenco delle capacità può non essere
1810 indicato e viene assunto che si stia facendo riferimento a tutte quante senza
1811 doverlo scrivere esplicitamente.
1812
1813 Come esempi avremo allora che un processo non privilegiato di un utente, che
1814 non ha nessuna capacità attiva, avrà una rappresentazione nella forma
1815 ``\texttt{=}'' che corrisponde al fatto che nessuna capacità viene assegnata a
1816 nessun insieme (vale la cancellazione preventiva), mentre un processo con
1817 privilegi di amministratore avrà una rappresentazione nella forma
1818 ``\texttt{=ep}'' in cui tutte le capacità vengono assegnate agli insiemi
1819 \textit{permitted} ed \textit{effective} (e l'\textit{inheritable} è ignorato
1820 in quanto per le regole viste a pag.~\ref{sec:capability-uid-transition} le
1821 capacità verranno comunque attivate attraverso una \func{exec}). Infine, come
1822 esempio meno banale dei precedenti, otterremo per \texttt{init} una
1823 rappresentazione nella forma ``\texttt{=ep cap\_setpcap-e}'' dato che come
1824 accennato tradizionalmente \const{CAP\_SETPCAP} è sempre stata rimossa da
1825 detto processo.
1826
1827 Viceversa per ottenere un \textit{capability state} dalla sua rappresentazione
1828 testuale si può usare la funzione \funcd{cap\_from\_text}, il cui prototipo è:
1829
1830 \begin{funcproto}{
1831 \fhead{sys/capability.h}
1832 \fdecl{cap\_t cap\_from\_text(const char *string)}
1833 \fdesc{Crea un \textit{capability state} dalla sua rappresentazione testuale.} 
1834 }
1835
1836 {La funzione ritorna un \textit{capability state} in caso di successo e
1837   \val{NULL} per un errore, nel qual caso \var{errno} assumerà i valori
1838   \errval{EINVAL} o \errval{ENOMEM} nel loro significato generico.}
1839 \end{funcproto}
1840
1841
1842 La funzione restituisce il puntatore ad un \textit{capability state}
1843 inizializzato con i valori indicati nella stringa \param{string} che ne
1844 contiene la rappresentazione testuale. La memoria per il \textit{capability
1845   state} viene allocata automaticamente dalla funzione e dovrà essere liberata
1846 con \func{cap\_free}.
1847
1848 Alle due funzioni citate se ne aggiungono altre due che consentono di
1849 convertire i valori delle costanti di tab.~\ref{tab:proc_capabilities} nelle
1850 stringhe usate nelle rispettive rappresentazioni e viceversa. Le due funzioni,
1851 \funcd{cap\_to\_name} e \funcd{cap\_from\_name}, sono estensioni specifiche di
1852 Linux ed i rispettivi prototipi sono:
1853
1854 \begin{funcproto}{
1855 \fhead{sys/capability.h}
1856 \fdecl{char *cap\_to\_name(cap\_value\_t cap)}
1857 \fdesc{Converte il valore numerico di una \textit{capabilities} alla sua
1858   rappresentazione testuale.} 
1859 \fdecl{int cap\_from\_name(const char *name, cap\_value\_t *cap\_p)}
1860
1861 \fdesc{Converte la rappresentazione testuale di una \textit{capabilities} al
1862   suo valore numerico.} 
1863 }
1864
1865 {La funzione \func{cap\_to\_name} ritorna un puntatore ad una stringa in caso
1866   di successo e \val{NULL} per un errore, mentre \func{cap\_to\_name} ritorna
1867   $0$ in caso di successo e $-1$ per un errore, per entrambe in caso di errore
1868   \var{errno} assumerà i valori \errval{EINVAL} o \errval{ENOMEM} nel loro
1869   significato generico.  
1870 }
1871 \end{funcproto}
1872
1873 La prima funzione restituisce la stringa (allocata automaticamente e che dovrà
1874 essere liberata con \func{cap\_free}) che corrisponde al valore della
1875 capacità \param{cap}, mentre la seconda restituisce nella variabile puntata
1876 da \param{cap\_p}, come \textit{value result argument}, il valore della
1877 capacità rappresentata dalla stringa \param{name}.
1878
1879 Fin quei abbiamo trattato solo le funzioni di servizio relative alla
1880 manipolazione dei \textit{capability state} come strutture di dati;
1881 l'interfaccia di gestione prevede però anche le funzioni per trattare le
1882 \textit{capabilities} presenti nei processi. La prima di queste funzioni è
1883 \funcd{cap\_get\_proc} che consente la lettura delle \textit{capabilities} del
1884 processo corrente, il suo prototipo è:
1885
1886 \begin{funcproto}{
1887 \fhead{sys/capability.h}
1888 \fdecl{cap\_t cap\_get\_proc(void)}
1889 \fdesc{Legge le \textit{capabilities} del processo corrente.} 
1890 }
1891
1892 {La funzione ritorna un \textit{capability state} in caso di successo e
1893   \val{NULL} per un errore, nel qual caso \var{errno} assumerà i valori
1894   \errval{EINVAL}, \errval{EPERM} o \errval{ENOMEM} nel loro significato
1895   generico.}
1896 \end{funcproto}
1897
1898 La funzione legge il valore delle \textit{capabilities} associate al processo
1899 da cui viene invocata, restituendo il risultato tramite il puntatore ad un
1900 \textit{capability state} contenente tutti i dati che provvede ad allocare
1901 autonomamente e che di nuovo occorrerà liberare con \func{cap\_free} quando
1902 non sarà più utilizzato.
1903
1904 Se invece si vogliono leggere le \textit{capabilities} di un processo
1905 specifico occorre usare la funzione \funcd{cap\_get\_pid}, il cui
1906 prototipo\footnote{su alcune pagine di manuale la funzione è descritta con un
1907   prototipo sbagliato, che prevede un valore di ritorno di tipo \type{cap\_t},
1908   ma il valore di ritorno è intero, come si può verificare anche dalla
1909   dichiarazione della stessa in \headfile{sys/capability.h}.} è:
1910
1911 \begin{funcproto}{
1912 \fhead{sys/capability.h}
1913 \fdecl{cap\_t cap\_get\_pid(pid\_t pid)}
1914 \fdesc{Legge le \textit{capabilities} di un processo.} 
1915 }
1916
1917 {La funzione ritorna un \textit{capability state} in caso di successo e
1918   \val{NULL} per un errore, nel qual caso \var{errno} assumerà i valori
1919   \errval{ESRCH} o \errval{ENOMEM} nel loro significato generico.  }
1920 \end{funcproto}
1921
1922 La funzione legge il valore delle \textit{capabilities} del processo indicato
1923 con l'argomento \param{pid}, e restituisce il risultato tramite il puntatore
1924 ad un \textit{capability state} contenente tutti i dati che provvede ad
1925 allocare autonomamente e che al solito deve essere disallocato con
1926 \func{cap\_free}. Qualora il processo indicato non esista si avrà un errore di
1927 \errval{ESRCH}. Gli stessi valori possono essere letti direttamente nel
1928 filesystem \textit{proc}, nei file \texttt{/proc/<pid>/status}; ad esempio per
1929 \texttt{init} si otterrà qualcosa del tipo:
1930 \begin{Console}
1931 piccardi@hain:~/gapil$ \textbf{cat /proc/1/status}
1932 ...
1933 CapInh: 0000000000000000
1934 CapPrm: 00000000fffffeff
1935 CapEff: 00000000fffffeff  
1936 ...
1937 \end{Console}
1938 %$
1939
1940 \itindend{capability~state}
1941
1942 Infine per impostare le \textit{capabilities} del processo corrente (nella
1943 bozza dello standard POSIX.1e non esiste una funzione che permetta di cambiare
1944 le \textit{capabilities} di un altro processo) si deve usare la funzione
1945 \funcd{cap\_set\_proc}, il cui prototipo è:
1946
1947 \begin{funcproto}{
1948 \fhead{sys/capability.h}
1949 \fdecl{int cap\_set\_proc(cap\_t cap\_p)}
1950 \fdesc{Imposta le \textit{capabilities} del processo corrente.} 
1951 }
1952
1953 {La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
1954   caso \var{errno} assumerà i valori:
1955   \begin{errlist}
1956   \item[\errcode{EPERM}] si è cercato di attivare una capacità non permessa.
1957   \end{errlist} ed inoltre \errval{EINVAL} nel suo significato generico.}
1958 \end{funcproto}
1959
1960 La funzione modifica le \textit{capabilities} del processo corrente secondo
1961 quanto specificato con l'argomento \param{cap\_p}, posto che questo sia
1962 possibile nei termini spiegati in precedenza (non sarà ad esempio possibile
1963 impostare capacità non presenti nell'insieme di quelle permesse). 
1964
1965 In caso di successo i nuovi valori saranno effettivi al ritorno della
1966 funzione, in caso di fallimento invece lo stato delle capacità resterà
1967 invariato. Si tenga presente che \textsl{tutte} le capacità specificate
1968 tramite \param{cap\_p} devono essere permesse; se anche una sola non lo è la
1969 funzione fallirà, e per quanto appena detto, lo stato delle
1970 \textit{capabilities} non verrà modificato (neanche per le parti eventualmente
1971 permesse).
1972
1973 Oltre a queste funzioni su Linux sono presenti due ulteriori funzioni,
1974 \funcm{capgetp} e \funcm{capsetp}, che svolgono un compito analogo. Queste
1975 funzioni risalgono alla implementazione iniziale delle \textit{capabilities}
1976 ed in particolare \funcm{capsetp} consentirebbe anche, come possibile in quel
1977 caso, di cambiare le capacità di un altro processo. Le due funzioni oggi sono
1978 deprecate e pertanto eviteremo di trattarle, per chi fosse interessato si
1979 rimanda alla lettura della loro pagina di manuale.
1980
1981 Come esempio di utilizzo di queste funzioni nei sorgenti allegati alla guida
1982 si è distribuito il programma \texttt{getcap.c}, che consente di leggere le
1983 \textit{capabilities} del processo corrente\footnote{vale a dire di sé stesso,
1984   quando lo si lancia, il che può sembrare inutile, ma serve a mostrarci quali
1985   sono le \textit{capabilities} standard che ottiene un processo lanciato
1986   dalla riga di comando.} o tramite l'opzione \texttt{-p}, quelle di un
1987 processo qualunque il cui \ids{PID} viene passato come parametro dell'opzione.
1988
1989 \begin{figure}[!htbp]
1990   \footnotesize \centering
1991   \begin{minipage}[c]{\codesamplewidth}
1992     \includecodesample{listati/getcap.c}
1993   \end{minipage} 
1994   \normalsize
1995   \caption{Corpo principale del programma \texttt{getcap.c}.}
1996   \label{fig:proc_getcap}
1997 \end{figure}
1998
1999 La sezione principale del programma è riportata in fig.~\ref{fig:proc_getcap},
2000 e si basa su una condizione sulla variabile \var{pid} che se si è usato
2001 l'opzione \texttt{-p} è impostata (nella sezione di gestione delle opzioni,
2002 che si è tralasciata) al valore del \ids{PID} del processo di cui si vuole
2003 leggere le \textit{capabilities} e nulla altrimenti. Nel primo caso
2004 (\texttt{\small 1-6}) si utilizza (\texttt{\small 2}) \func{cap\_get\_proc}
2005 per ottenere lo stato delle capacità del processo, nel secondo (\texttt{\small
2006   7-13}) si usa invece \func{cap\_get\_pid} (\texttt{\small 8}) per leggere
2007 il valore delle capacità del processo indicato.
2008
2009 Il passo successivo è utilizzare (\texttt{\small 15}) \func{cap\_to\_text} per
2010 tradurre in una stringa lo stato, e poi (\texttt{\small 16}) stamparlo; infine
2011 (\texttt{\small 18-19}) si libera la memoria allocata dalle precedenti
2012 funzioni con \func{cap\_free} per poi ritornare dal ciclo principale della
2013 funzione.
2014
2015 \itindend{capabilities}
2016
2017 % TODO vedi http://lwn.net/Articles/198557/ e 
2018 % http://www.madore.org/~david/linux/newcaps/
2019
2020
2021
2022
2023
2024
2025 % TODO: trattare keyctl (man 2 keyctl)
2026
2027 % TODO trattare le funzioni di protezione della memoria pkey_alloc, pkey_free,
2028 % pkey_mprotect, introdotte con il kernel 4.8, vedi
2029 % http://lwn.net/Articles/689395/ e Documentation/x86/protection-keys.txt 
2030
2031 %TODO trattare kcmp aggiunta con il kernel 3.5, vedi
2032 % https://lwn.net/Articles/478111/
2033
2034
2035 \section{Funzionalità avanzate e specialistiche}
2036 \label{sec:process_special}
2037
2038
2039
2040 \subsection{La gestione delle operazioni in virgola mobile}
2041 \label{sec:process_fenv}
2042
2043 Da fare.
2044
2045 % TODO eccezioni ed arrotondamenti per la matematica in virgola mobile 
2046 % consultare la manpage di fenv, math_error, fpclassify, matherr, isgreater,
2047 % isnan, nan, INFINITY
2048
2049
2050 \subsection{L'accesso alle porte di I/O}
2051 \label{sec:process_io_port}
2052
2053 %
2054 % TODO l'I/O sulle porte di I/O 
2055 % consultare le manpage di ioperm, iopl e outb
2056 % non c'entra nulla qui, va trovato un altro posto (altri meccanismi di I/O in
2057 % fileintro ?)
2058
2059 Da fare
2060
2061
2062 %\subsection{La gestione di architetture a nodi multipli}
2063 %\label{sec:process_NUMA}
2064
2065 % TODO trattare i cpuset, che attiene anche a NUMA, e che possono essere usati
2066 % per associare l'uso di gruppi di processori a gruppi di processi (vedi
2067 % manpage omonima)
2068 % TODO trattare getcpu, che attiene anche a NUMA, mettere qui anche
2069 % sched_getcpu, che potrebbe essere indipendente ma richiama getcpu
2070
2071 %TODO trattare le funzionalità per il NUMA
2072 % vedi man numa e, mbind, get_mempolicy, set_mempolicy, 
2073 % le pagine di manuale relative
2074 % vedere anche dove metterle...
2075
2076 % \subsection{La gestione dei moduli}
2077 % \label{sec:kernel_modules}
2078
2079 % da fare
2080
2081 %TODO trattare init_module e finit_module (quest'ultima introdotta con il
2082 %kernel 3.8)
2083
2084 %%%% Altre cose di cui non è chiara la collocazione:
2085
2086 %TODO trattare membarrier, introdotta con il kernel 4.3
2087 % vedi http://lwn.net/Articles/369567/ http://lwn.net/Articles/369640/
2088 % http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=5b25b13ab08f616efd566347d809b4ece54570d1 
2089 % vedi anche l'ulteriore opzione "expedited" introdotta con il kernel 4.14
2090 % (https://lwn.net/Articles/728795/) 
2091
2092
2093
2094 %%% Local Variables:
2095 %%% mode: latex
2096 %%% TeX-master: "gapil"
2097 %%% End: