1 \chapter{La gestione avanzata dei processi}
2 \label{cha:proc_advanced}
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
14 \section{Funzioni di gestione e controllo}
15 \label{sec:proc_manage_control}
17 In questa sezione prenderemo in esame alcune specifiche \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.
22 \subsection{La funzione \func{prctl}}
23 \label{sec:process_prctl}
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 processi 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.}
37 \fdecl{int prctl(int option, unsigned long arg2, unsigned long arg3, unsigned
39 \phantom{int prctl(}unsigned long arg5)}
40 \fdesc{Esegue una operazione speciale sul processo corrente.}
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}.}
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).
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
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.
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
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}).
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
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.
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
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.
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.
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.
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:
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.}
162 Introdotta a partire dal kernel 2.4.21, solo su PowerPC.
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.
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
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.
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.
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.
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.
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.
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.
226 \item[\constd{PR\_SET\_SECCOMP}] Attiva il \textit{secure computing mode} per
227 il processo corrente. Introdotta a partire dal kernel 2.6.23 la funzionalità
228 è stata ulteriormente estesa con il kernel 3.5, salvo poi diventare un
229 sottoinsieme della \textit{system call} \func{seccomp} a partire dal kernel
230 3.17. Prevede che si indichi per \param{arg2} il valore
231 \const{SECCOMP\_MODE\_STRICT} (unico possibile fino al kernel 2.6.23) per
232 selezionare il cosiddetto \textit{strict mode} o, dal kernel 3.5,
233 \const{SECCOMP\_MODE\_FILTER} per usare il \textit{filter mode}. Tratteremo
234 questa opzione nei dettagli più avanti, in sez.~\ref{sec:procadv_seccomp},
235 quando affronteremo l'argomento del \textit{Secure Computing}.
237 \item[\constd{PR\_GET\_SECCOMP}] Ottiene come valore di ritorno della funzione
238 lo stato corrente del \textit{secure computing mode}. Fino al kernel 3.5,
239 quando era possibile solo lo \textit{strict mode}, la funzione era
240 totalmente inutile in quanto l'unico valore ottenibile era 0 in assenza di
241 \textit{secure computing}, dato che la chiamata di questa funzione in
242 \textit{strict mode} avrebbe comportato l'emissione di \signal{SIGKILL} per
243 il chiamante. La funzione però, a partire dal kernel 2.6.23, era stata
244 comunque definita per eventuali estensioni future, ed infatti con
245 l'introduzione del \textit{filter mode} con il kernel 3.5, se essa viene
246 inclusa nelle funzioni consentite restituisce il valore 2 quando il
247 \textit{secure computing mode} è attivo (se non inclusa si avrà di nuovo un
250 \item[\constd{PR\_SET\_SECUREBITS}] Imposta i \textit{securebits} per il
251 processo chiamante al valore indicato da \param{arg2}; per i dettagli sul
252 significato dei \textit{securebits} si veda
253 sez.~\ref{sec:proc_capabilities}, ed in particolare i valori di
254 tab.~\ref{tab:securebits_values} e la relativa trattazione. L'operazione
255 richiede i privilegi di amministratore (la capacità \const{CAP\_SETPCAP}),
256 altrimenti la chiamata fallirà con un errore di \errval{EPERM}. Introdotta a
257 partire dal kernel 2.6.26.
259 \item[\constd{PR\_GET\_SECUREBITS}] Ottiene come valore di ritorno della
260 funzione l'impostazione corrente per i \textit{securebits}. Introdotta a
261 partire dal kernel 2.6.26.
263 \item[\constd{PR\_SET\_TIMING}] Imposta il metodo di temporizzazione del
264 processo da indicare con il valore di \param{arg2}, attualmente i valori
265 possibili sono due, con \constd{PR\_TIMING\_STATISTICAL} si usa il metodo
266 statistico tradizionale, con \constd{PR\_TIMING\_TIMESTAMP} il più accurato
267 basato su dei \textit{timestamp}, quest'ultimo però non è ancora
268 implementato ed il suo uso comporta la restituzione di un errore di
269 \errval{EINVAL}. Introdotta a partire dal kernel 2.6.0-test4.
271 \item[\constd{PR\_GET\_TIMING}] Ottiene come valore di ritorno della funzione
272 il metodo di temporizzazione del processo attualmente in uso (uno dei due
273 valori citati per \const{PR\_SET\_TIMING}). Introdotta a partire dal kernel
276 \item[\constd{PR\_SET\_TSC}] Imposta il flag che indica se il processo
277 chiamante può leggere il registro di processore contenente il contatore dei
278 \textit{timestamp} (TSC, o \textit{Time Stamp Counter}) da indicare con il
279 valore di \param{arg2}. Si deve specificare \constd{PR\_TSC\_ENABLE} per
280 abilitare la lettura o \constd{PR\_TSC\_SIGSEGV} per disabilitarla con la
281 generazione di un segnale di \signal{SIGSEGV} (vedi
282 sez.~\ref{sec:sig_prog_error}). La lettura viene automaticamente
283 disabilitata se si attiva il \textit{secure computing mode} (vedi
284 \const{PR\_SET\_SECCOMP} e sez.~\ref{sec:procadv_seccomp}). Introdotta a
285 partire dal kernel 2.6.26, solo su x86.
287 \item[\constd{PR\_GET\_TSC}] Ottiene il valore del flag che controlla la
288 lettura del contattore dei \textit{timestamp}, salvato all'indirizzo
289 puntato \param{arg2}, che deve essere di tipo ``\ctyp{int *}''. Introdotta a
290 partire dal kernel 2.6.26, solo su x86.
291 % articoli sul TSC e relativi problemi: http://lwn.net/Articles/209101/,
292 % http://blog.cr0.org/2009/05/time-stamp-counter-disabling-oddities.html,
293 % http://en.wikipedia.org/wiki/Time_Stamp_Counter
295 \item[\constd{PR\_SET\_UNALIGN}] Imposta la modalità di controllo per l'accesso
296 a indirizzi di memoria non allineati, che in varie architetture risultano
297 illegali, da indicare con il valore di \param{arg2}. Si deve specificare il
298 valore \constd{PR\_UNALIGN\_NOPRINT} per ignorare gli accessi non allineati,
299 ed il valore \constd{PR\_UNALIGN\_SIGBUS} per generare un segnale di
300 \signal{SIGBUS} (vedi sez.~\ref{sec:sig_prog_error}) in caso di accesso non
301 allineato. Introdotta con diverse versioni su diverse architetture.
303 \item[\const{PR\_GET\_UNALIGN}] Ottiene il valore della modalità di controllo
304 per l'accesso a indirizzi di memoria non allineati, salvato all'indirizzo
305 puntato \param{arg2}, che deve essere di tipo \code{(int *)}. Introdotta con
306 diverse versioni su diverse architetture.
307 \item[\const{PR\_MCE\_KILL}] Imposta la politica di gestione degli errori
308 dovuti a corruzione della memoria per problemi hardware. Questo tipo di
309 errori vengono riportati dall'hardware di controllo della RAM e vengono
310 gestiti dal kernel,\footnote{la funzionalità è disponibile solo sulle
311 piattaforme più avanzate che hanno il supporto hardware per questo tipo di
312 controlli.} ma devono essere opportunamente riportati ai processi che
313 usano quella parte di RAM che presenta errori; nel caso specifico questo
314 avviene attraverso l'emissione di un segnale di \signal{SIGBUS} (vedi
315 sez.~\ref{sec:sig_prog_error}).\footnote{in particolare viene anche
316 impostato il valore di \var{si\_code} in \struct{siginfo\_t} a
317 \const{BUS\_MCEERR\_AO}; per il significato di tutto questo si faccia
318 riferimento alla trattazione di sez.~\ref{sec:sig_sigaction}.}
320 Il comportamento di default prevede che per tutti i processi si applichi la
321 politica generale di sistema definita nel file
322 \sysctlfiled{vm/memory\_failure\_early\_kill}, ma specificando
323 per \param{arg2} il valore \constd{PR\_MCE\_KILL\_SET} è possibile impostare
324 con il contenuto di \param{arg3} una politica specifica del processo
325 chiamante. Si può tornare alla politica di default del sistema utilizzando
326 invece per \param{arg2} il valore \constd{PR\_MCE\_KILL\_CLEAR}. In tutti i
327 casi, per compatibilità con eventuali estensioni future, tutti i valori
328 degli argomenti non utilizzati devono essere esplicitamente posti a zero,
329 pena il fallimento della chiamata con un errore di \errval{EINVAL}.
331 In caso di impostazione di una politica specifica del processo con
332 \const{PR\_MCE\_KILL\_SET} i valori di \param{arg3} possono essere soltanto
333 due, che corrispondono anche al valore che si trova nell'impostazione
334 generale di sistema di \texttt{memory\_failure\_early\_kill}, con
335 \constd{PR\_MCE\_KILL\_EARLY} si richiede l'emissione immediata di
336 \signal{SIGBUS} non appena viene rilevato un errore, mentre con
337 \constd{PR\_MCE\_KILL\_LATE} il segnale verrà inviato solo quando il processo
338 tenterà un accesso alla memoria corrotta. Questi due valori corrispondono
339 rispettivamente ai valori 1 e 0 di
340 \texttt{memory\_failure\_early\_kill}.\footnote{in sostanza nel primo caso
341 viene immediatamente inviato il segnale a tutti i processi che hanno la
342 memoria corrotta mappata all'interno del loro spazio degli indirizzi, nel
343 secondo caso prima la pagina di memoria viene tolta dallo spazio degli
344 indirizzi di ciascun processo, mentre il segnale viene inviato solo quei
345 processi che tentano di accedervi.} Si può usare per \param{arg3} anche un
346 terzo valore, \constd{PR\_MCE\_KILL\_DEFAULT}, che corrisponde a impostare
347 per il processo la politica di default.\footnote{si presume la politica di
348 default corrente, in modo da non essere influenzati da un eventuale
349 successivo cambiamento della stessa.} Introdotta a partire dal kernel
351 \item[\constd{PR\_MCE\_KILL\_GET}] Ottiene come valore di ritorno della
352 funzione la politica di gestione degli errori dovuti a corruzione della
353 memoria. Tutti gli argomenti non utilizzati (al momento tutti) devono essere
354 nulli pena la ricezione di un errore di \errval{EINVAL}. Introdotta a
355 partire dal kernel 2.6.32.
356 \itindbeg{child~reaper}
357 \item[\constd{PR\_SET\_CHILD\_SUBREAPER}] Se \param{arg2} è diverso da zero
358 imposta l'attributo di \textit{child reaper} per il processo, se nullo lo
359 cancella. Lo stato di \textit{child reaper} è una funzionalità, introdotta
360 con il kernel 3.4, che consente di far svolgere al processo che ha questo
361 attributo il ruolo di ``\textsl{genitore adottivo}'' per tutti i processi
362 suoi ``\textsl{discendenti}'' che diventano orfani, in questo modo il
363 processo potrà ricevere gli stati di terminazione alla loro uscita,
364 sostituendo in questo ruolo \cmd{init} (si ricordi quanto illustrato in
365 sez.~\ref{sec:proc_termination}). Il meccanismo è stato introdotto ad uso
366 dei programmi di gestione dei servizi, per consentire loro di ricevere gli
367 stati di terminazione di tutti i processi che lanciano, anche se questi
368 eseguono una doppia \func{fork}; nel comportamento ordinario infatti questi
369 verrebbero adottati da \cmd{init} ed il programma che li ha lanciati non
370 sarebbe più in grado di riceverne lo stato di terminazione. Se un processo
371 con lo stato di \textit{child reaper} termina prima dei suoi discendenti,
372 svolgerà questo ruolo il più prossimo antenato ad avere lo stato di
373 \textit{child reaper},
374 \item[\constd{PR\_GET\_CHILD\_SUBREAPER}] Ottiene l'impostazione relativa allo
375 lo stato di \textit{child reaper} del processo chiamante, salvata come
376 \textit{value result} all'indirizzo puntato da \param{arg2} (da indicare
377 come di tipo \code{int *}). Il valore viene letto come valore logico, se
378 diverso da 0 lo stato di \textit{child reaper} è attivo altrimenti è
379 disattivo. Introdotta a partire dal kernel 3.4.
380 \itindend{child~reaper}
383 % TODO documentare PR_MPX_INIT e PR_MPX_RELEASE, vedi
384 % http://lwn.net/Articles/582712/
386 % TODO documentare PR_SET_MM_MAP aggiunta con il kernel 3.18, per impostare i
387 % parametri di base del layout dello spazio di indirizzi di un processo (area
388 % codice e dati, stack, brack pointer ecc. vedi
389 % http://git.kernel.org/linus/f606b77f1a9e362451aca8f81d8f36a3a112139e
391 % TODO documentare ARCH_SET_CPUID e ARCH_GET_CPUID, introdotte con il kernel
392 % 4.12, vedi https://lwn.net/Articles/721182/
393 \label{sec:prctl_operation}
397 %\subsection{La funzione \func{ptrace}}
398 %\label{sec:process_ptrace}
402 % TODO: trattare PTRACE_SEIZE, aggiunta con il kernel 3.1
403 % TODO: trattare PTRACE_O_EXITKILL, aggiunta con il kernel 3.8 (vedi
404 % http://lwn.net/Articles/529060/)
405 % TODO: trattare PTRACE_GETSIGMASK e PTRACE_SETSIGMASK introdotte con il
407 % TODO: trattare PTRACE_O_SUSPEND_SECCOMP, aggiunta con il kernel 4.3, vedi
408 % http://lwn.net/Articles/656675/
411 \section{La gestione avanzata della creazione dei processi}
412 \label{sec:process_adv_creation}
414 In questa sezione tratteremo le funzionalità avanzate relative alla creazione
415 dei processi e del loro ambiente, sia per quanto riguarda l'utilizzo delle
416 stesse per la creazione dei \textit{thread} che per la gestione dei
417 \textit{namespace} che sono alla base dei cosiddetti \textit{container}.
420 \subsection{La \textit{system call} \func{clone}}
421 \label{sec:process_clone}
423 La funzione tradizionale con cui creare un nuovo processo in un sistema
424 Unix-like, come illustrato in sez.~\ref{sec:proc_fork}, è \func{fork}, ma con
425 l'introduzione del supporto del kernel per i \textit{thread}\unavref{ (vedi
426 cap.~\ref{cha:threads})}, si è avuta la necessità di una interfaccia che
427 consentisse un maggiore controllo sulla modalità con cui vengono creati nuovi
428 processi, che poi è stata utilizzata anche per fornire supporto per le
429 tecnologie di virtualizzazione dei processi (i cosiddetti \textit{container})
430 su cui torneremo in sez.~\ref{sec:process_namespaces}.
432 Per questo l'interfaccia per la creazione di un nuovo processo è stata
433 delegata ad una nuova \textit{system call}, \funcm{sys\_clone}, che consente
434 di reimplementare anche la tradizionale \func{fork}. In realtà in questo caso
435 più che di nuovi processi si può parlare della creazioni di nuovi
436 ``\textit{task}'' del kernel che possono assumere la veste sia di un processo
437 classico isolato dagli altri come quelli trattati finora, che di un
438 \textit{thread} in cui la memoria viene condivisa fra il processo chiamante ed
439 il nuovo processo creato, come quelli che vedremo in
440 sez.~\ref{sec:linux_thread}. Per evitare confusione fra \textit{thread} e
441 processi ordinari, abbiamo deciso di usare la nomenclatura \textit{task} per
442 indicare la unità di esecuzione generica messa a disposizione del kernel che
443 \texttt{sys\_clone} permette di creare.
445 La \textit{system call} richiede soltanto due argomenti: il
446 primo, \param{flags}, consente di controllare le modalità di creazione del
447 nuovo \textit{task}, il secondo, \param{child\_stack}, imposta l'indirizzo
448 dello \textit{stack} per il nuovo \textit{task}, e deve essere indicato quando
449 si intende creare un \textit{thread}. L'esecuzione del programma creato da
450 \func{sys\_clone} riprende, come per \func{fork}, da dopo l'esecuzione della
453 La necessità di avere uno \textit{stack} alternativo c'è solo quando si
454 intende creare un \textit{thread}, in tal caso infatti il nuovo \textit{task}
455 vede esattamente la stessa memoria del \textit{task}
456 ``\textsl{padre}'',\footnote{in questo caso per padre si intende semplicemente
457 il \textit{task} che ha eseguito \func{sys\_clone} rispetto al \textit{task}
458 da essa creato, senza nessuna delle implicazioni che il concetto ha per i
459 processi.} e nella sua esecuzione alla prima chiamata di una funzione
460 andrebbe a scrivere sullo \textit{stack} usato anche dal padre (si ricordi
461 quanto visto in sez.~\ref{sec:proc_mem_layout} riguardo all'uso dello
464 Per evitare di doversi garantire contro la evidente possibilità di
465 \textit{race condition} che questa situazione comporta (vedi
466 sez.~\ref{sec:proc_race_cond} per una spiegazione della problematica) è
467 necessario che il chiamante allochi preventivamente un'area di memoria. In
468 genere lo si fa con una \func{malloc} che allochi un buffer che la funzione
469 imposterà come \textit{stack} del nuovo processo, avendo ovviamente cura di
470 non utilizzarlo direttamente nel processo chiamante.
472 In questo modo i due \textit{task} avranno degli \textit{stack} indipendenti e
473 non si dovranno affrontare problematiche di \textit{race condition}. Si tenga
474 presente inoltre che in molte architetture di processore lo \textit{stack}
475 cresce verso il basso, pertanto in tal caso non si dovrà specificare
476 per \param{child\_stack} il puntatore restituito da \func{malloc}, ma un
477 puntatore alla fine del buffer da essa allocato.
479 Dato che tutto ciò è necessario solo per i \textit{thread} che condividono la
480 memoria, la \textit{system call}, a differenza della funzione di libreria che
481 vedremo a breve, consente anche di passare per \param{child\_stack} il valore
482 \val{NULL}, che non imposta un nuovo \textit{stack}. Se infatti si crea un
483 processo, questo ottiene un suo nuovo spazio degli indirizzi (è sottinteso
484 cioè che non si stia usando il flag \const{CLONE\_VM} che vedremo a breve) ed
485 in questo caso si applica la semantica del \textit{copy on write} illustrata
486 in sez.~\ref{sec:proc_fork}, per cui le pagine dello \textit{stack} verranno
487 automaticamente copiate come le altre e il nuovo processo avrà un suo
488 \textit{stack} totalmente indipendente da quello del padre.
490 Dato che l'uso principale della nuova \textit{system call} è quello relativo
491 alla creazione dei \textit{thread}, la \acr{glibc} definisce una funzione di
492 libreria con una sintassi diversa, orientata a questo scopo, e la
493 \textit{system call} resta accessibile solo se invocata esplicitamente come
494 visto in sez.~\ref{sec:proc_syscall}.\footnote{ed inoltre per questa
495 \textit{system call} non è disponibile la chiamata veloce con
496 \texttt{vsyscall}.} La funzione di libreria si chiama semplicemente
497 \funcd{clone} ed il suo prototipo è:
501 \fdecl{int clone(int (*fn)(void *), void *child\_stack, int flags, void *arg,
503 \phantom{int clone(}/* pid\_t *ptid, struct user\_desc *tls, pid\_t *ctid */ )}
504 \fdesc{Crea un nuovo processo o \textit{thread}.}
506 {La funzione ritorna il \textit{Thread ID} assegnato al nuovo processo in caso
507 di successo e $-1$ per un errore, nel qual caso \var{errno} assumerà uno dei
510 \item[\errcode{EAGAIN}] sono già in esecuzione troppi processi.
511 \item[\errcode{EINVAL}] si è usata una combinazione non valida di flag o
512 un valore nullo per \param{child\_stack}.
513 \item[\errcode{ENOMEM}] non c'è memoria sufficiente per creare una nuova
514 \texttt{task\_struct} o per copiare le parti del contesto del chiamante
515 necessarie al nuovo \textit{task}.
516 \item[\errcode{EPERM}] non si hanno i privilegi di amministratore
517 richiesti dai flag indicati.
521 % NOTE: una pagina con la descrizione degli argomenti:
522 % * http://www.lindevdoc.org/wiki/Clone
524 La funzione prende come primo argomento \param{fn} il puntatore alla funzione
525 che verrà messa in esecuzione nel nuovo processo, che può avere un unico
526 argomento di tipo puntatore a \ctyp{void}, il cui valore viene passato dal
527 terzo argomento \param{arg}. Per quanto il precedente prototipo possa
528 intimidire nella sua espressione, in realtà l'uso è molto semplice basterà
529 definire una qualunque funzione \param{fn} che restituisce un intero ed ha
530 come argomento un puntatore a \ctyp{void}, e \code{fn(arg)} sarà eseguita in
533 Il nuovo processo resterà in esecuzione fintanto che la funzione \param{fn}
534 non ritorna, o esegue \func{exit} o viene terminata da un segnale. Il valore
535 di ritorno della funzione (o quello specificato con \func{exit}) verrà
536 utilizzato come stato di uscita della funzione. I tre
537 argomenti \param{ptid}, \param{tls} e \param{ctid} sono opzionali e sono
538 presenti solo a partire dal kernel 2.6 e sono stati aggiunti come supporto per
539 le funzioni di gestione dei \textit{thread} (la \textit{Native Thread Posix
540 Library}, vedi sez.~\ref{sec:linux_ntpl}) nella \acr{glibc}, essi vengono
541 utilizzati soltanto se si sono specificati rispettivamente i flag
542 \const{CLONE\_PARENT\_SETTID}, \const{CLONE\_SETTLS} e
543 \const{CLONE\_CHILD\_SETTID}.
545 La funzione ritorna un l'identificatore del nuovo \textit{task}, denominato
546 \texttt{Thread ID} (da qui in avanti \ids{TID}) il cui significato è analogo
547 al \ids{PID} dei normali processi e che a questo corrisponde qualora si crei
548 un processo ordinario e non un \textit{thread}.
550 Il comportamento di \func{clone}, che si riflette sulle caratteristiche del
551 nuovo processo da essa creato, è controllato principalmente
552 dall'argomento \param{flags}, che deve essere specificato come maschera
553 binaria, ottenuta con un OR aritmetico di una delle costanti del seguente
554 elenco, che illustra quelle attualmente disponibili:\footnote{si fa
555 riferimento al momento della stesura di questa sezione, cioè con il kernel
558 \begin{basedescript}{\desclabelwidth{1.5 cm}\desclabelstyle{\nextlinelabel}}
560 \item[\constd{CLONE\_CHILD\_CLEARTID}] cancella il valore del \textit{thread
561 ID} posto all'indirizzo dato dall'argomento \param{ctid}, eseguendo un
562 riattivazione del \textit{futex} (vedi sez.~\ref{sec:xxx_futex}) a
563 quell'indirizzo. Questo flag viene utilizzato dalla librerie di gestione dei
564 \textit{thread} ed è presente dal kernel 2.5.49.
566 \item[\constd{CLONE\_CHILD\_SETTID}] scrive il \ids{TID} del \textit{thread}
567 figlio all'indirizzo dato dall'argomento \param{ctid}. Questo flag viene
568 utilizzato dalla librerie di gestione dei \textit{thread} ed è presente dal
571 \item[\constd{CLONE\_FILES}] se impostato il nuovo processo condividerà con il
572 padre la \textit{file descriptor table} (vedi sez.~\ref{sec:file_fd}),
573 questo significa che ogni \textit{file descriptor} aperto da un processo
574 verrà visto anche dall'altro e che ogni chiusura o cambiamento dei
575 \textit{file descriptor flag} di un \textit{file descriptor} verrà per
578 Se non viene impostato il processo figlio eredita una copia della
579 \textit{file descriptor table} del padre e vale la semantica classica della
580 gestione dei \textit{file descriptor}, che costituisce il comportamento
581 ordinario di un sistema unix-like e che illustreremo in dettaglio in
582 sez.~\ref{sec:file_shared_access}.
584 \item[\constd{CLONE\_FS}] se questo flag viene impostato il nuovo processo
585 condividerà con il padre le informazioni relative all'albero dei file, ed in
586 particolare avrà la stessa radice (vedi sez.~\ref{sec:file_chroot}), la
587 stessa directory di lavoro (vedi sez.~\ref{sec:file_work_dir}) e la stessa
588 \textit{umask} (sez.~\ref{sec:file_perm_management}). Una modifica di una
589 qualunque di queste caratteristiche in un processo, avrà effetto anche
590 sull'altro. Se assente il nuovo processo riceverà una copia delle precedenti
591 informazioni, che saranno così indipendenti per i due processi, come avviene
592 nel comportamento ordinario di un sistema unix-like.
594 \item[\constd{CLONE\_IO}] se questo flag viene impostato il nuovo processo
595 condividerà con il padre il contesto dell'I/O, altrimenti, come avviene nel
596 comportamento ordinario con una \func{fork} otterrà un suo contesto
599 Il contesto dell'I/O viene usato dagli \textit{scheduler} di I/O (visti in
600 sez.~\ref{sec:io_priority}) e se questo è lo stesso per diversi processi
601 questi vengono trattati come se fossero lo stesso, condividendo il tempo per
602 l'accesso al disco, e possono interscambiarsi nell'accesso a disco. L'uso di
603 questo flag consente, quando più \textit{thread} eseguono dell'I/O per conto
604 dello stesso processo (ad esempio con le funzioni di I/O asincrono di
605 sez.~\ref{sec:file_asyncronous_io}), migliori prestazioni.
607 %TODO : tutti i CLONE_NEW* attengono ai namespace, ed è meglio metterli nella
608 %relativa sezione da creare a parte
610 % \item[\constd{CLONE\_NEWIPC}] è uno dei flag ad uso dei \textit{container},
611 % introdotto con il kernel 2.6.19. L'uso di questo flag crea per il nuovo
612 % processo un nuovo \textit{namespace} per il sistema di IPC, sia per quello
613 % di SysV (vedi sez.~\ref{sec:ipc_sysv}) che, dal kernel 2.6.30, per le code
614 % di messaggi POSIX (vedi sez.~\ref{sec:ipc_posix_mq}); si applica cioè a
615 % tutti quegli oggetti che non vegono identificati con un \textit{pathname}
616 % sull'albero dei file.
618 % L'uso di questo flag richiede privilegi di amministratore (più precisamente
619 % la capacità \const{CAP\_SYS\_ADMIN}) e non può essere usato in combinazione
620 % con \const{CLONE\_SYSVSEM}.
622 % \item[\constd{CLONE\_NEWNET}]
623 % \item[\constd{CLONE\_NEWNS}]
624 % \item[\constd{CLONE\_NEWPID}]
625 % \item[\constd{CLONE\_NEWUTS}]
628 % TODO trattare CLONE_NEWCGROUP introdotto con il kernel 4.6, vedi
629 % http://lwn.net/Articles/680566/
631 \item[\constd{CLONE\_PARENT}]
632 \item[\constd{CLONE\_PARENT\_SETTID}]
633 \item[\constd{CLONE\_PID}]
635 \item[\constd{CLONE\_PTRACE}] se questo flag viene impostato ed il processo
636 chiamante viene tracciato (vedi sez.~\ref{sec:process_ptrace}) anche il
637 figlio viene tracciato.
639 \item[\constd{CLONE\_SETTLS}]
640 \item[\constd{CLONE\_SIGHAND}]
641 \item[\constd{CLONE\_STOPPED}]
642 \item[\constd{CLONE\_SYSVSEM}]
643 \item[\constd{CLONE\_THREAD}]
645 \item[\constd{CLONE\_UNTRACED}] se questo flag viene impostato un processo non
646 può più forzare \const{CLONE\_PTRACE} su questo processo.
648 \item[\constd{CLONE\_VFORK}] se questo flag viene impostato il chiamante viene
649 fermato fintato che il figlio appena creato non rilascia la sua memoria
650 virtuale con una chiamata a \func{exec} o \func{exit}, viene quindi
651 replicato il comportamento di \func{vfork}.
653 \item[\constd{CLONE\_VM}] se questo flag viene impostato il nuovo processo
654 condividerà con il padre la stessa memoria virtuale, e le scritture in
655 memoria fatte da uno qualunque dei processi saranno visibili dall'altro,
656 così come ogni mappatura in memoria (vedi sez.~\ref{sec:file_memory_map}).
658 Se non viene impostato il processo figlio otterrà una copia dello spazio
659 degli indirizzi e si otterrà il comportamento ordinario di un processo di un
660 sistema unix-like creato con la funzione \func{fork}.
665 \subsection{La gestione dei \textit{namespace}}
666 \label{sec:process_namespaces}
669 Come accennato all'inizio di sez.~\ref{sec:process_clone} oltre al controllo
670 delle caratteristiche dei processi usate per la creazione dei \textit{thread},
671 l'uso di \func{clone} consente, ad uso delle nuove funzionalità di
672 virtualizzazione dei processi, di creare nuovi ``\textit{namespace}'' per una
673 serie di proprietà generali (come l'elenco dei \ids{PID}, l'albero dei file, i
674 \textit{mount point}, la rete, il sistema di IPC, ecc.).
676 L'uso dei ``\textit{namespace}'' consente creare gruppi di processi che vedono
677 le suddette proprietà in maniera indipendente fra loro. I processi di ciascun
678 gruppo vengono così eseguiti come in una sorta di spazio separato da quello
679 degli altri gruppi, che costituisce poi quello che viene chiamato un
690 %TODO sezione separata sui namespace
692 %TODO trattare unshare, vedi anche http://lwn.net/Articles/532748/
694 %TODO: trattare la funzione setns e i namespace file descriptors (vedi
695 % http://lwn.net/Articles/407495/) introdotti con il kernel 3.0, altre
696 % informazioni su setns qui: http://lwn.net/Articles/532748/
697 % http://lwn.net/Articles/531498/
700 \section{La gestione avanzata della sicurezza}
701 \label{sec:process_security}
703 Tratteremo in questa sezione le funzionalità più avanzate relative alla
704 gestione della sicurezza ed il controllo degli accessi all'interno dei
705 processi, a partire dalle \textit{capabilities} e dalle funzionalità di
706 \textit{Secure Computing}. Esamineremo inoltre tutte le altre funzionalità
707 relative alla sicurezza come gestione delle chiavi crittografiche e varie
708 estensioni e funzionalità disponibili su questo argomento.
712 \subsection{La gestione delle \textit{capabilities}}
713 \label{sec:proc_capabilities}
715 \itindbeg{capabilities}
717 Come accennato in sez.~\ref{sec:proc_access_id} l'architettura classica della
718 gestione dei privilegi in un sistema unix-like ha il sostanziale problema di
719 fornire all'amministratore dei poteri troppo ampi. Questo comporta che anche
720 quando si siano predisposte delle misure di protezione per in essere in grado
721 di difendersi dagli effetti di una eventuale compromissione del sistema (come
722 montare un filesystem in sola lettura per impedirne modifiche, o marcare un
723 file come immutabile) una volta che questa sia stata effettuata e si siano
724 ottenuti i privilegi di amministratore, queste misure potranno essere comunque
725 rimosse (nei casi elencati nella precedente nota si potrà sempre rimontare il
726 sistema in lettura-scrittura, o togliere l'attributo di immutabilità).
728 Il problema consiste nel fatto che nell'architettura tradizionale di un
729 sistema unix-like i controlli di accesso sono basati su un solo livello di
730 separazione: per i processi normali essi sono posti in atto, mentre per i
731 processi con i privilegi di amministratore essi non vengono neppure eseguiti.
732 Per questo motivo non era previsto alcun modo per evitare che un processo con
733 diritti di amministratore non potesse eseguire certe operazioni, o per cedere
734 definitivamente alcuni privilegi da un certo momento in poi.
736 Per risolvere questo problema sono possibili varie soluzioni ed ad esempio dai
737 kernel 2.5 è stata introdotta la struttura dei
738 \itindex{Linux~Security~Modules~(LSM)} \textit{Linux Security Modules} che han
739 permesso di aggiungere varie forme di \itindex{Mandatory~Access~Control~(DAC)}
740 \textit{Mandatory Access Control} (MAC), in cui si potessero parcellizzare e
741 controllare nei minimi dettagli tutti i privilegi e le modalità in cui questi
742 possono essere usati dai programmi e trasferiti agli utenti, con la creazione
743 di varie estensioni (come \textit{SELinux}, \textit{Smack}, \textit{Tomoyo},
744 \textit{AppArmor}) che consentono di superare l'architettura tradizionale dei
745 permessi basati sul modello classico del controllo di accesso chiamato
746 \itindex{Discrectionary~Access~Control~(DAC)} \textit{Discrectionary Access
749 Ma già in precedenza, a partire dai kernel della serie 2.2, era stato
750 introdotto un meccanismo, detto \textit{capabilities}, che consentisse di
751 suddividere i vari privilegi tradizionalmente associati all'amministratore in
752 un insieme di \textsl{capacità} distinte. L'idea era che queste capacità
753 potessero essere abilitate e disabilitate in maniera indipendente per ciascun
754 processo con privilegi di amministratore, permettendo così una granularità
755 molto più fine nella distribuzione degli stessi che evitasse la situazione
756 originaria di ``\textsl{tutto o nulla}''.
758 \itindbeg{file~capabilities}
760 Il meccanismo completo delle \textit{capabilities} (l'implementazione si rifà
761 ad una bozza di quello che doveva diventare lo standard POSIX.1e, poi
762 abbandonato) prevede inoltre la possibilità di associare le stesse ai singoli
763 file eseguibili, in modo da poter stabilire quali capacità possono essere
764 utilizzate quando viene messo in esecuzione uno specifico programma; ma il
765 supporto per questa funzionalità, chiamata \textit{file capabilities}, è stato
766 introdotto soltanto a partire dal kernel 2.6.24. Fino ad allora doveva essere
767 il programma stesso ad eseguire una riduzione esplicita delle sue capacità,
768 cosa che ha reso l'uso di questa funzionalità poco diffuso, vista la presenza
769 di meccanismi alternativi per ottenere limitazioni delle capacità
770 dell'amministratore a livello di sistema operativo, come \textit{SELinux}.
772 Con questo supporto e con le ulteriori modifiche introdotte con il kernel
773 2.6.25 il meccanismo delle \textit{capabilities} è stato totalmente
774 rivoluzionato, rendendolo più aderente alle intenzioni originali dello
775 standard POSIX, rimuovendo il significato che fino ad allora aveva avuto la
776 capacità \const{CAP\_SETPCAP} e cambiando le modalità di funzionamento del
777 cosiddetto \textit{capabilities bounding set}. Ulteriori modifiche sono state
778 apportate con il kernel 2.6.26 per consentire la rimozione non ripristinabile
779 dei privilegi di amministratore. Questo fa sì che il significato ed il
780 comportamento del kernel finisca per dipendere dalla versione dello stesso e
781 dal fatto che le nuove \textit{file capabilities} siano abilitate o meno. Per
782 capire meglio la situazione e cosa è cambiato conviene allora spiegare con
783 maggiori dettagli come funziona il meccanismo delle \textit{capabilities}.
785 Il primo passo per frazionare i privilegi garantiti all'amministratore,
786 supportato fin dalla introduzione iniziale del kernel 2.2, è stato quello in
787 cui a ciascun processo sono stati associati tre distinti insiemi di
788 \textit{capabilities}, denominati rispettivamente \textit{permitted},
789 \textit{inheritable} ed \textit{effective}. Questi insiemi vengono mantenuti
790 in forma di tre diverse maschere binarie,\footnote{il kernel li mantiene, come
791 i vari identificatori di sez.~\ref{sec:proc_setuid}, all'interno della
792 \texttt{task\_struct} di ciascun processo (vedi
793 fig.~\ref{fig:proc_task_struct}), nei tre campi \texttt{cap\_effective},
794 \texttt{cap\_inheritable}, \texttt{cap\_permitted} del tipo
795 \texttt{kernel\_cap\_t}; questo era, fino al kernel 2.6.25 definito come
796 intero a 32 bit per un massimo di 32 \textit{capabilities} distinte,
797 attualmente è stato aggiornato ad un vettore in grado di mantenerne fino a
798 64.} in cui ciascun bit corrisponde ad una capacità diversa.
800 L'utilizzo di tre distinti insiemi serve a fornire una interfaccia flessibile
801 per l'uso delle \textit{capabilities}, con scopi analoghi a quelli per cui
802 sono mantenuti i diversi insiemi di identificatori di
803 sez.~\ref{sec:proc_setuid}; il loro significato, che è rimasto sostanzialmente
804 lo stesso anche dopo le modifiche seguite alla introduzione delle
805 \textit{file capabilities} è il seguente:
806 \begin{basedescript}{\desclabelwidth{2.1cm}\desclabelstyle{\nextlinelabel}}
807 \item[\textit{permitted}] l'insieme delle \textit{capabilities}
808 ``\textsl{permesse}'', cioè l'insieme di quelle capacità che un processo
809 \textsl{può} impostare come \textsl{effettive} o come
810 \textsl{ereditabili}. Se un processo cancella una capacità da questo insieme
811 non potrà più riassumerla.\footnote{questo nei casi ordinari, sono
812 previste però una serie di eccezioni, dipendenti anche dal tipo di
813 supporto, che vedremo meglio in seguito dato il notevole intreccio nella
815 \item[\textit{inheritable}] l'insieme delle \textit{capabilities}
816 ``\textsl{ereditabili}'', cioè di quelle che verranno trasmesse come insieme
817 delle \textsl{permesse} ad un nuovo programma eseguito attraverso una
818 chiamata ad \func{exec}.
819 \item[\textit{effective}] l'insieme delle \textit{capabilities}
820 ``\textsl{effettive}'', cioè di quelle che vengono effettivamente usate dal
821 kernel quando deve eseguire il controllo di accesso per le varie operazioni
822 compiute dal processo.
823 \label{sec:capabilities_set}
826 Con l'introduzione delle \textit{file capabilities} sono stati introdotti
827 altri tre insiemi associabili a ciascun file.\footnote{la realizzazione viene
828 eseguita con l'uso di uno specifico attributo esteso,
829 \texttt{security.capability}, la cui modifica è riservata, (come illustrato
830 in sez.~\ref{sec:file_xattr}) ai processi dotato della capacità
831 \const{CAP\_SYS\_ADMIN}.} Le \textit{file capabilities} hanno effetto
832 soltanto quando il file che le porta viene eseguito come programma con una
833 \func{exec}, e forniscono un meccanismo che consente l'esecuzione dello stesso
834 con maggiori privilegi; in sostanza sono una sorta di estensione del
835 \acr{suid} bit limitato ai privilegi di amministratore. Anche questi tre
836 insiemi sono identificati con gli stessi nomi di quello dei processi, ma il
837 loro significato è diverso:
838 \begin{basedescript}{\desclabelwidth{2.1cm}\desclabelstyle{\nextlinelabel}}
839 \item[\textit{permitted}] (chiamato originariamente \textit{forced}) l'insieme
840 delle capacità che con l'esecuzione del programma verranno aggiunte alle
841 capacità \textsl{permesse} del processo.
842 \item[\textit{inheritable}] (chiamato originariamente \textit{allowed})
843 l'insieme delle capacità che con l'esecuzione del programma possono essere
844 ereditate dal processo originario (che cioè non vengono tolte
845 dall'\textit{inheritable set} del processo originale all'esecuzione di
847 \item[\textit{effective}] in questo caso non si tratta di un insieme ma di un
848 unico valore logico; se attivo all'esecuzione del programma tutte le
849 capacità che risulterebbero \textsl{permesse} verranno pure attivate,
850 inserendole automaticamente nelle \textsl{effettive}, se disattivato nessuna
851 capacità verrà attivata (cioè l'\textit{effective set} resterà vuoto).
854 \itindbeg{capabilities~bounding~set}
856 Infine come accennato, esiste un ulteriore insieme, chiamato
857 \textit{capabilities bounding set}, il cui scopo è quello di costituire un
858 limite alle capacità che possono essere attivate per un programma. Il suo
859 funzionamento però è stato notevolmente modificato con l'introduzione delle
860 \textit{file capabilities} e si deve pertanto prendere in considerazione una
861 casistica assai complessa.
863 Per i kernel fino al 2.6.25, o se non si attiva il supporto per le
864 \textit{file capabilities}, il \textit{capabilities bounding set} è un
865 parametro generale di sistema, il cui valore viene riportato nel file
866 \sysctlfiled{kernel/cap-bound}. Il suo valore iniziale è definito in sede di
867 compilazione del kernel, e da sempre ha previsto come default la presenza di
868 tutte le \textit{capabilities} eccetto \const{CAP\_SETPCAP}. In questa
869 situazione solo il primo processo eseguito nel sistema (quello con
870 \textsl{pid} 1, di norma \texttt{/sbin/init}) ha la possibilità di
871 modificarlo; ogni processo eseguito successivamente, se dotato dei privilegi
872 di amministratore, è in grado soltanto di rimuovere una delle
873 \textit{capabilities} già presenti dell'insieme.\footnote{per essere precisi
874 occorre la capacità \const{CAP\_SYS\_MODULE}.}
876 In questo caso l'effetto complessivo del \textit{capabilities bounding set} è
877 che solo le capacità in esso presenti possono essere trasmesse ad un altro
878 programma attraverso una \func{exec}. Questo in sostanza significa che se un
879 qualunque programma elimina da esso una capacità, considerato che
880 \texttt{init} (almeno nelle versioni ordinarie) non supporta la reimpostazione
881 del \textit{bounding set}, questa non sarà più disponibile per nessun processo
882 a meno di un riavvio, eliminando così in forma definitiva quella capacità per
883 tutti, compreso l'amministratore.\footnote{la qual cosa, visto il default
884 usato per il \textit{capabilities bounding set}, significa anche che
885 \const{CAP\_SETPCAP} non è stata praticamente mai usata nella sua forma
888 Con il kernel 2.6.25 e le \textit{file capabilities} il \textit{bounding set}
889 è diventato una proprietà di ciascun processo, che viene propagata invariata
890 sia attraverso una \func{fork} che una \func{exec}. In questo caso il file
891 \sysctlfile{kernel/cap-bound} non esiste e \texttt{init} non ha nessun
892 ruolo speciale, inoltre in questo caso all'avvio il valore iniziale prevede la
893 presenza di tutte le capacità (compresa \const{CAP\_SETPCAP}).
895 Con questo nuovo meccanismo il \textit{bounding set} continua a ricoprire un
896 ruolo analogo al precedente nel passaggio attraverso una \func{exec}, come
897 limite alle capacità che possono essere aggiunte al processo in quanto
898 presenti nel \textit{permitted set} del programma messo in esecuzione, in
899 sostanza il nuovo programma eseguito potrà ricevere una capacità presente nel
900 suo \textit{permitted set} (quello del file) solo se questa è anche nel
901 \textit{bounding set} (del processo). In questo modo si possono rimuovere
902 definitivamente certe capacità da un processo, anche qualora questo dovesse
903 eseguire un programma privilegiato che prevede di riassegnarle.
905 Si tenga presente però che in questo caso il \textit{bounding set} blocca
906 esclusivamente le capacità indicate nel \textit{permitted set} del programma
907 che verrebbero attivate in caso di esecuzione, e non quelle eventualmente già
908 presenti nell'\textit{inheritable set} del processo (ad esempio perché
909 presenti prima di averle rimosse dal \textit{bounding set}). In questo caso
910 eseguendo un programma che abbia anche lui dette capacità nel suo
911 \textit{inheritable set} queste verrebbero assegnate.
913 In questa seconda versione inoltre il \textit{bounding set} costituisce anche
914 un limite per le capacità che possono essere aggiunte all'\textit{inheritable
915 set} del processo stesso con \func{capset}, sempre nel senso che queste
916 devono essere presenti nel \textit{bounding set} oltre che nel
917 \textit{permitted set} del processo. Questo limite vale anche per processi con
918 i privilegi di amministratore,\footnote{si tratta sempre di avere la
919 \textit{capability} \const{CAP\_SETPCAP}.} per i quali invece non vale la
920 condizione che le \textit{capabilities} da aggiungere nell'\textit{inheritable
921 set} debbano essere presenti nel proprio \textit{permitted set}.\footnote{lo
922 scopo anche in questo caso è ottenere una rimozione definitiva della
923 possibilità di passare una capacità rimossa dal \textit{bounding set}.}
925 Come si può notare per fare ricorso alle \textit{capabilities} occorre
926 comunque farsi carico di una notevole complessità di gestione, aggravata dalla
927 presenza di una radicale modifica del loro funzionamento con l'introduzione
928 delle \textit{file capabilities}. Considerato che il meccanismo originale era
929 incompleto e decisamente problematico nel caso di programmi che non ne
930 sapessero tener conto,\footnote{c'è stato un grosso problema di sicurezza con
931 \texttt{sendmail}, riuscendo a rimuovere \const{CAP\_SETGID}
932 dall'\textit{inheritable set} di un processo si ottenne di far fallire
933 \func{setuid} in maniera inaspettata per il programma (che aspettandosi
934 sempre il successo della funzione non ne controllava lo stato di uscita) con
935 la conseguenza di effettuare come amministratore operazioni che altrimenti
936 sarebbero state eseguite, senza poter apportare danni, da utente normale.}
937 ci soffermeremo solo sulla implementazione completa presente a partire dal
938 kernel 2.6.25, tralasciando ulteriori dettagli riguardo la versione
941 Riassumendo le regole finora illustrate tutte le \textit{capabilities} vengono
942 ereditate senza modifiche attraverso una \func{fork} mentre, indicati con
943 \texttt{orig\_*} i valori degli insiemi del processo chiamante, con
944 \texttt{file\_*} quelli del file eseguito e con \texttt{bound\_set} il
945 \textit{capabilities bounding set}, dopo l'invocazione di \func{exec} il
946 processo otterrà dei nuovi insiemi di capacità \texttt{new\_*} secondo la
947 formula espressa dal seguente pseudo-codice C:
949 \includecodesnip{listati/cap-results.c}
951 % \begin{figure}[!htbp]
952 % \footnotesize \centering
953 % \begin{minipage}[c]{12cm}
954 % \includecodesnip{listati/cap-results.c}
956 % \caption{Espressione della modifica delle \textit{capabilities} attraverso
958 % \label{fig:cap_across_exec}
961 \noindent e si noti come in particolare il \textit{capabilities bounding set}
962 non venga comunque modificato e resti lo stesso sia attraverso una \func{fork}
963 che attraverso una \func{exec}.
966 \itindend{capabilities~bounding~set}
968 A queste regole se ne aggiungono delle altre che servono a riprodurre il
969 comportamento tradizionale di un sistema unix-like in tutta una serie di
970 circostanze. La prima di queste è relativa a quello che avviene quando si
971 esegue un file senza \textit{capabilities}; se infatti si considerasse questo
972 equivalente al non averne assegnata alcuna, non essendo presenti capacità né
973 nel \textit{permitted set} né nell'\textit{inheritable set} del file,
974 nell'esecuzione di un qualunque programma l'amministratore perderebbe tutti i
975 privilegi originali dal processo.
977 Per questo motivo se un programma senza \textit{capabilities} assegnate viene
978 eseguito da un processo con \ids{UID} reale 0, esso verrà trattato come
979 se tanto il \textit{permitted set} che l'\textit{inheritable set} fossero con
980 tutte le \textit{capabilities} abilitate, con l'\textit{effective set} attivo,
981 col risultato di fornire comunque al processo tutte le capacità presenti nel
982 proprio \textit{bounding set}. Lo stesso avviene quando l'eseguibile ha attivo
983 il \acr{suid} bit ed appartiene all'amministratore, in entrambi i casi si
984 riesce così a riottenere il comportamento classico di un sistema unix-like.
986 Una seconda circostanza è quella relativa a cosa succede alle
987 \textit{capabilities} di un processo nelle possibili transizioni da \ids{UID}
988 nullo a \ids{UID} non nullo o viceversa (corrispondenti rispettivamente a
989 cedere o riottenere i privilegi di amministratore) che si possono effettuare
990 con le varie funzioni viste in sez.~\ref{sec:proc_setuid}. In questo caso la
991 casistica è di nuovo alquanto complessa, considerata anche la presenza dei
992 diversi gruppi di identificatori illustrati in tab.~\ref{tab:proc_uid_gid}, si
995 \item se si passa da \ids{UID} effettivo nullo a non nullo
996 l'\textit{effective set} del processo viene totalmente azzerato, se
997 viceversa si passa da \ids{UID} effettivo non nullo a nullo il
998 \textit{permitted set} viene copiato nell'\textit{effective set};
999 \item se si passa da \textit{file system} \ids{UID} nullo a non nullo verranno
1000 cancellate dall'\textit{effective set} del processo tutte le capacità
1001 attinenti i file, e cioè \const{CAP\_LINUX\_IMMUTABLE}, \const{CAP\_MKNOD},
1002 \const{CAP\_DAC\_OVERRIDE}, \const{CAP\_DAC\_READ\_SEARCH},
1003 \const{CAP\_MAC\_OVERRIDE}, \const{CAP\_CHOWN}, \const{CAP\_FSETID} e
1004 \const{CAP\_FOWNER} (le prime due a partire dal kernel 2.2.30), nella
1005 transizione inversa verranno invece inserite nell'\textit{effective set}
1006 quelle capacità della precedente lista che sono presenti nel suo
1007 \textit{permitted set}.
1008 \item se come risultato di una transizione riguardante gli identificativi dei
1009 gruppi \textit{real}, \textit{saved} ed \textit{effective} in cui si passa
1010 da una situazione in cui uno di questi era nullo ad una in cui sono tutti
1011 non nulli,\footnote{in sostanza questo è il caso di quando si chiama
1012 \func{setuid} per rimuovere definitivamente i privilegi di amministratore
1013 da un processo.} verranno azzerati completamente sia il \textit{permitted
1014 set} che l'\textit{effective set}.
1016 \label{sec:capability-uid-transition}
1018 La combinazione di tutte queste regole consente di riprodurre il comportamento
1019 ordinario di un sistema di tipo Unix tradizionale, ma può risultare
1020 problematica qualora si voglia passare ad una configurazione di sistema
1021 totalmente basata sull'applicazione delle \textit{capabilities}; in tal caso
1022 infatti basta ad esempio eseguire un programma con \acr{suid} bit di proprietà
1023 dell'amministratore per far riottenere ad un processo tutte le capacità
1024 presenti nel suo \textit{bounding set}, anche se si era avuta la cura di
1025 cancellarle dal \textit{permitted set}.
1027 \itindbeg{securebits}
1029 Per questo motivo a partire dal kernel 2.6.26, se le \textit{file
1030 capabilities} sono abilitate, ad ogni processo viene stata associata una
1031 ulteriore maschera binaria, chiamata \textit{securebits flags}, su cui sono
1032 mantenuti una serie di flag (vedi tab.~\ref{tab:securebits_values}) il cui
1033 valore consente di modificare queste regole speciali che si applicano ai
1034 processi con \ids{UID} nullo. La maschera viene sempre mantenuta
1035 attraverso una \func{fork}, mentre attraverso una \func{exec} viene sempre
1036 cancellato il flag \const{SECURE\_KEEP\_CAPS}.
1041 \begin{tabular}{|l|p{10cm}|}
1043 \textbf{Flag} & \textbf{Descrizione} \\
1046 \constd{SECURE\_KEEP\_CAPS}&Il processo non subisce la cancellazione delle
1047 sue \textit{capabilities} quando tutti i suoi
1048 \ids{UID} passano ad un valore non
1049 nullo (regola di compatibilità per il cambio
1050 di \ids{UID} n.~3 del precedente
1051 elenco), sostituisce il precedente uso
1052 dell'operazione \const{PR\_SET\_KEEPCAPS} di
1054 \constd{SECURE\_NO\_SETUID\_FIXUP}&Il processo non subisce le modifiche
1055 delle sue \textit{capabilities} nel passaggio
1056 da nullo a non nullo degli \ids{UID}
1057 dei gruppi \textit{effective} e
1058 \textit{file system} (regole di compatibilità
1059 per il cambio di \ids{UID} nn.~1 e 2 del
1060 precedente elenco).\\
1061 \constd{SECURE\_NOROOT} & Il processo non assume nessuna capacità
1062 aggiuntiva quando esegue un programma, anche
1063 se ha \ids{UID} nullo o il programma ha
1064 il \acr{suid} bit attivo ed appartiene
1065 all'amministratore (regola di compatibilità
1066 per l'esecuzione di programmi senza
1067 \textit{capabilities}).\\
1070 \caption{Costanti identificative dei flag che compongono la maschera dei
1071 \textit{securebits}.}
1072 \label{tab:securebits_values}
1075 A ciascuno dei flag di tab.~\ref{tab:securebits_values} è inoltre abbinato un
1076 corrispondente flag di blocco, identificato da una costante omonima con
1077 l'estensione \texttt{\_LOCKED}, la cui attivazione è irreversibile ed ha
1078 l'effetto di rendere permanente l'impostazione corrente del corrispondente
1079 flag ordinario; in sostanza con \constd{SECURE\_KEEP\_CAPS\_LOCKED} si rende
1080 non più modificabile \const{SECURE\_KEEP\_CAPS}, ed analogamente avviene con
1081 \constd{SECURE\_NO\_SETUID\_FIXUP\_LOCKED} per
1082 \const{SECURE\_NO\_SETUID\_FIXUP} e con \constd{SECURE\_NOROOT\_LOCKED} per
1083 \const{SECURE\_NOROOT}.
1085 Per l'impostazione di questi flag sono state predisposte due specifiche
1086 operazioni di \func{prctl} (vedi sez.~\ref{sec:process_prctl}),
1087 \const{PR\_GET\_SECUREBITS}, che consente di ottenerne il valore, e
1088 \const{PR\_SET\_SECUREBITS}, che consente di modificarne il valore; per
1089 quest'ultima sono comunque necessari i privilegi di amministratore ed in
1090 particolare la capacità \const{CAP\_SETPCAP}. Prima dell'introduzione dei
1091 \textit{securebits} era comunque possibile ottenere lo stesso effetto di
1092 \const{SECURE\_KEEP\_CAPS} attraverso l'uso di un'altra operazione di
1093 \func{prctl}, \const{PR\_SET\_KEEPCAPS}.
1095 \itindend{securebits}
1097 Oltre alla gestione dei \textit{securebits} la nuova versione delle
1098 \textit{file capabilities} prevede l'uso di \func{prctl} anche per la gestione
1099 del \textit{capabilities bounding set}, attraverso altre due operazioni
1100 dedicate, \const{PR\_CAPBSET\_READ} per controllarne il valore e
1101 \const{PR\_CAPBSET\_DROP} per modificarlo; quest'ultima di nuovo è una
1102 operazione privilegiata che richiede la capacità \const{CAP\_SETPCAP} e che,
1103 come indica chiaramente il nome, permette solo la rimozione di una
1104 \textit{capability} dall'insieme; per i dettagli sull'uso di tutte queste
1105 operazioni si rimanda alla rilettura di sez.~\ref{sec:process_prctl}.
1107 \itindend{file~capabilities}
1110 % NOTE per dati relativi al process capability bounding set, vedi:
1111 % http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=3b7391de67da515c91f48aa371de77cb6cc5c07e
1113 % NOTE riferimenti ai vari cambiamenti vedi:
1114 % http://lwn.net/Articles/280279/
1115 % http://lwn.net/Articles/256519/
1116 % http://lwn.net/Articles/211883/
1119 Un elenco delle \textit{capabilities} disponibili su Linux, con una breve
1120 descrizione ed il nome delle costanti che le identificano, è riportato in
1121 tab.~\ref{tab:proc_capabilities};\footnote{l'elenco presentato questa tabella,
1122 ripreso dalla pagina di manuale (accessibile con \texttt{man capabilities})
1123 e dalle definizioni in \texttt{include/linux/capabilities.h}, è aggiornato
1124 al kernel 3.2.} la tabella è divisa in due parti, la prima riporta le
1125 \textit{capabilities} previste anche nella bozza dello standard POSIX1.e, la
1126 seconda quelle specifiche di Linux. Come si può notare dalla tabella alcune
1127 \textit{capabilities} attengono a singole funzionalità e sono molto
1128 specializzate, mentre altre hanno un campo di applicazione molto vasto, che è
1129 opportuno dettagliare maggiormente.
1131 \begin{table}[!h!btp]
1134 \begin{tabular}{|l|p{10cm}|}
1136 \textbf{Capacità}&\textbf{Descrizione}\\
1140 % POSIX-draft defined capabilities.
1142 \constd{CAP\_AUDIT\_CONTROL}& Abilitare e disabilitare il
1143 controllo dell'auditing (dal kernel 2.6.11).\\
1144 \constd{CAP\_AUDIT\_WRITE}&Scrivere dati nel giornale di
1145 auditing del kernel (dal kernel 2.6.11).\\
1146 % TODO verificare questa roba dell'auditing
1147 \constd{CAP\_BLOCK\_SUSPEND}&Utilizzare funzionalità che possono bloccare
1148 la sospensione del sistema (dal kernel 3.5).\\
1149 \constd{CAP\_CHOWN} & Cambiare proprietario e gruppo
1150 proprietario di un file (vedi
1151 sez.~\ref{sec:file_ownership_management}).\\
1152 \constd{CAP\_DAC\_OVERRIDE}& Evitare il controllo dei
1153 permessi di lettura, scrittura ed esecuzione dei
1154 file, (vedi sez.~\ref{sec:file_access_control}).\\
1155 \constd{CAP\_DAC\_READ\_SEARCH}& Evitare il controllo dei
1156 permessi di lettura ed esecuzione per
1158 sez.~\ref{sec:file_access_control}).\\
1159 \const{CAP\_FOWNER} & Evitare il controllo della proprietà di un file
1160 per tutte le operazioni privilegiate non coperte
1161 dalle precedenti \const{CAP\_DAC\_OVERRIDE} e
1162 \const{CAP\_DAC\_READ\_SEARCH}.\\
1163 \constd{CAP\_FSETID} & Evitare la cancellazione automatica dei bit
1164 \acr{suid} e \acr{sgid} quando un file
1165 per i quali sono impostati viene modificato da
1166 un processo senza questa capacità e la capacità
1167 di impostare il bit \acr{sgid} su un file anche
1168 quando questo è relativo ad un gruppo cui non si
1170 sez.~\ref{sec:file_perm_management}).\\
1171 \constd{CAP\_KILL} & Mandare segnali a qualunque
1172 processo (vedi sez.~\ref{sec:sig_kill_raise}).\\
1173 \constd{CAP\_SETFCAP} & Impostare le \textit{capabilities} di un file
1174 (dal kernel 2.6.24).\\
1175 \constd{CAP\_SETGID} & Manipolare i group ID dei
1176 processi, sia il principale che i supplementari,
1177 (vedi sez.~\ref{sec:proc_setgroups}) che quelli
1178 trasmessi tramite i socket \textit{unix domain}
1179 (vedi sez.~\ref{sec:unix_socket}).\\
1180 \constd{CAP\_SETUID} & Manipolare gli user ID del
1181 processo (vedi sez.~\ref{sec:proc_setuid}) e di
1182 trasmettere un user ID arbitrario nel passaggio
1183 delle credenziali coi socket \textit{unix
1184 domain} (vedi sez.~\ref{sec:unix_socket}).\\
1186 % Linux specific capabilities
1189 \constd{CAP\_IPC\_LOCK} & Effettuare il \textit{memory locking} con le
1190 funzioni \func{mlock}, \func{mlockall},
1191 \func{shmctl}, \func{mmap} (vedi
1192 sez.~\ref{sec:proc_mem_lock} e
1193 sez.~\ref{sec:file_memory_map}). \\
1194 % TODO verificare l'interazione con SHM_HUGETLB
1195 \constd{CAP\_IPC\_OWNER}& Evitare il controllo dei permessi
1196 per le operazioni sugli oggetti di
1197 intercomunicazione fra processi (vedi
1198 sez.~\ref{sec:ipc_sysv}).\\
1199 \constd{CAP\_LEASE} & Creare dei \textit{file lease} (vedi
1200 sez.~\ref{sec:file_asyncronous_lease})
1201 pur non essendo proprietari del file (dal kernel
1203 \constd{CAP\_LINUX\_IMMUTABLE}& Impostare sui file gli attributi
1204 \textit{immutable} e \textit{append-only} (vedi
1205 sez.~\ref{sec:file_perm_overview}) se
1207 \constd{CAP\_MAC\_ADMIN}& Amministrare il \textit{Mandatory
1208 Access Control} di \textit{Smack} (dal kernel
1210 \constd{CAP\_MAC\_OVERRIDE}& Evitare il \textit{Mandatory
1211 Access Control} di \textit{Smack} (dal kernel
1213 \constd{CAP\_MKNOD} & Creare file di dispositivo con \func{mknod} (vedi
1214 sez.~\ref{sec:file_mknod}) (dal kernel 2.4).\\
1215 \const{CAP\_NET\_ADMIN} & Eseguire alcune operazioni
1216 privilegiate sulla rete.\\
1217 \constd{CAP\_NET\_BIND\_SERVICE}& Porsi in ascolto su porte riservate (vedi
1218 sez.~\ref{sec:TCP_func_bind}).\\
1219 \constd{CAP\_NET\_BROADCAST}& Consentire l'uso di socket in
1220 \textit{broadcast} e \textit{multicast}.\\
1221 \constd{CAP\_NET\_RAW} & Usare socket \texttt{RAW} e \texttt{PACKET}
1222 (vedi sez.~\ref{sec:sock_type}).\\
1223 \const{CAP\_SETPCAP} & Effettuare modifiche privilegiate alle
1224 \textit{capabilities}.\\
1225 \const{CAP\_SYS\_ADMIN} & Eseguire una serie di compiti amministrativi.\\
1226 \constd{CAP\_SYS\_BOOT} & Eseguire un riavvio del sistema (vedi
1227 sez.~\ref{sec:sys_reboot}).\\
1228 \constd{CAP\_SYS\_CHROOT}& Eseguire la funzione \func{chroot} (vedi
1229 sez.~\ref{sec:file_chroot}).\\
1230 \constd{CAP\_SYS\_MODULE}& Caricare e rimuovere moduli del kernel.\\
1231 \const{CAP\_SYS\_NICE} & Modificare le varie priorità dei processi (vedi
1232 sez.~\ref{sec:proc_priority}).\\
1233 \constd{CAP\_SYS\_PACCT}& Usare le funzioni di \textit{accounting} dei
1235 sez.~\ref{sec:sys_bsd_accounting}).\\
1236 \constd{CAP\_SYS\_PTRACE}& La capacità di tracciare qualunque processo con
1238 sez.~\ref{sec:process_ptrace}).\\
1239 \constd{CAP\_SYS\_RAWIO}& Operare sulle porte di I/O con \func{ioperm} e
1241 sez.~\ref{sec:process_io_port}).\\
1242 \const{CAP\_SYS\_RESOURCE}& Superare le varie limitazioni sulle risorse.\\
1243 \constd{CAP\_SYS\_TIME} & Modificare il tempo di sistema (vedi
1244 sez.~\ref{sec:sys_time}).\\
1245 \constd{CAP\_SYS\_TTY\_CONFIG}&Simulare un \textit{hangup} della console,
1246 con la funzione \func{vhangup}.\\
1247 \constd{CAP\_SYSLOG} & Gestire il buffer dei messaggi
1248 del kernel, (vedi sez.~\ref{sec:sess_daemon}),
1249 introdotta dal kernel 2.6.38 come capacità
1250 separata da \const{CAP\_SYS\_ADMIN}.\\
1251 \constd{CAP\_WAKE\_ALARM}&Usare i timer di tipo
1252 \const{CLOCK\_BOOTTIME\_ALARM} e
1253 \const{CLOCK\_REALTIME\_ALARM}, vedi
1254 sez.~\ref{sec:sig_timer_adv} (dal kernel 3.0).\\
1257 \caption{Le costanti che identificano le \textit{capabilities} presenti nel
1259 \label{tab:proc_capabilities}
1262 \constbeg{CAP\_SETPCAP}
1264 Prima di dettagliare il significato della capacità più generiche, conviene
1265 però dedicare un discorso a parte a \const{CAP\_SETPCAP}, il cui significato è
1266 stato completamente cambiato con l'introduzione delle \textit{file
1267 capabilities} nel kernel 2.6.24. In precedenza questa capacità era quella
1268 che permetteva al processo che la possedeva di impostare o rimuovere le
1269 \textit{capabilities} presenti nel suo \textit{permitted set} su un qualunque
1270 altro processo. In realtà questo non è mai stato l'uso inteso nelle bozze
1271 dallo standard POSIX, ed inoltre, come si è già accennato, dato che questa
1272 capacità è sempre stata assente (a meno di specifiche ricompilazioni del
1273 kernel) nel \textit{capabilities bounding set} usato di default, essa non è
1274 neanche mai stata realmente disponibile.
1276 Con l'introduzione \textit{file capabilities} e il cambiamento del significato
1277 del \textit{capabilities bounding set} la possibilità di modificare le
1278 capacità di altri processi è stata completamente rimossa, e
1279 \const{CAP\_SETPCAP} ha acquisito quello che avrebbe dovuto essere il suo
1280 significato originario, e cioè la capacità del processo di poter inserire nel
1281 suo \textit{inheritable set} qualunque capacità presente nel \textit{bounding
1282 set}. Oltre a questo la disponibilità di \const{CAP\_SETPCAP} consente ad un
1283 processo di eliminare una capacità dal proprio \textit{bounding set} (con la
1284 conseguente impossibilità successiva di eseguire programmi con quella
1285 capacità), o di impostare i \textit{securebits} delle \textit{capabilities}.
1287 \constend{CAP\_SETPCAP}
1288 \constbeg{CAP\_FOWNER}
1290 La prima fra le capacità ``\textsl{ampie}'' che occorre dettagliare
1291 maggiormente è \const{CAP\_FOWNER}, che rimuove le restrizioni poste ad un
1292 processo che non ha la proprietà di un file in un vasto campo di
1293 operazioni;\footnote{vale a dire la richiesta che l'\ids{UID} effettivo del
1294 processo (o meglio l'\ids{UID} di filesystem, vedi
1295 sez.~\ref{sec:proc_setuid}) coincida con quello del proprietario.} queste
1296 comprendono i cambiamenti dei permessi e dei tempi del file (vedi
1297 sez.~\ref{sec:file_perm_management} e sez.~\ref{sec:file_file_times}), le
1298 impostazioni degli attributi dei file e delle ACL (vedi
1299 sez.~\ref{sec:file_xattr} e \ref{sec:file_ACL}), poter ignorare lo
1300 \textit{sticky bit} nella cancellazione dei file (vedi
1301 sez.~\ref{sec:file_special_perm}), la possibilità di impostare il flag di
1302 \const{O\_NOATIME} con \func{open} e \func{fcntl} (vedi
1303 sez.~\ref{sec:file_open_close} e sez.~\ref{sec:file_fcntl_ioctl}) senza
1306 \constend{CAP\_FOWNER}
1307 \constbeg{CAP\_NET\_ADMIN}
1309 Una seconda capacità che copre diverse operazioni, in questo caso riguardanti
1310 la rete, è \const{CAP\_NET\_ADMIN}, che consente di impostare le opzioni
1311 privilegiate dei socket (vedi sez.~\ref{sec:sock_generic_options}), abilitare
1312 il \textit{multicasting} (vedi sez.\ref{sec:sock_ipv4_options}), eseguire la
1313 configurazione delle interfacce di rete (vedi
1314 sez.~\ref{sec:sock_ioctl_netdevice}) ed impostare la tabella di instradamento.
1316 \constend{CAP\_NET\_ADMIN}
1317 \constbeg{CAP\_SYS\_ADMIN}
1319 Una terza \textit{capability} con vasto campo di applicazione è
1320 \const{CAP\_SYS\_ADMIN}, che copre una serie di operazioni amministrative,
1321 come impostare le quote disco (vedi sez.\ref{sec:disk_quota}), attivare e
1322 disattivare la \textit{swap}, montare, rimontare e smontare filesystem (vedi
1323 sez.~\ref{sec:filesystem_mounting}), effettuare operazioni di controllo su
1324 qualunque oggetto dell'IPC di SysV (vedi sez.~\ref{sec:ipc_sysv}), operare
1325 sugli attributi estesi dei file di classe \texttt{security} o \texttt{trusted}
1326 (vedi sez.~\ref{sec:file_xattr}), specificare un \ids{UID} arbitrario nella
1327 trasmissione delle credenziali dei socket (vedi
1328 sez.~\ref{sec:socket_credential_xxx}), assegnare classi privilegiate
1329 (\const{IOPRIO\_CLASS\_RT} e prima del kernel 2.6.25 anche
1330 \const{IOPRIO\_CLASS\_IDLE}) per lo scheduling dell'I/O (vedi
1331 sez.~\ref{sec:io_priority}), superare il limite di sistema sul numero massimo
1332 di file aperti,\footnote{quello indicato da \sysctlfiled{fs/file-max}.}
1333 effettuare operazioni privilegiate sulle chiavi mantenute dal kernel (vedi
1334 sez.~\ref{sec:keyctl_management}), usare la funzione \func{lookup\_dcookie},
1335 usare \const{CLONE\_NEWNS} con \func{unshare} e \func{clone}, (vedi
1336 sez.~\ref{sec:process_clone}).
1338 \constend{CAP\_SYS\_ADMIN}
1339 \constbeg{CAP\_SYS\_NICE}
1341 Originariamente \const{CAP\_SYS\_NICE} riguardava soltanto la capacità di
1342 aumentare le priorità di esecuzione dei processi, come la diminuzione del
1343 valore di \textit{nice} (vedi sez.~\ref{sec:proc_sched_stand}), l'uso delle
1344 priorità \textit{real-time} (vedi sez.~\ref{sec:proc_real_time}), o
1345 l'impostazione delle affinità di processore (vedi
1346 sez.~\ref{sec:proc_sched_multiprocess}); ma con l'introduzione di priorità
1347 anche riguardo le operazioni di accesso al disco, e, nel caso di sistemi NUMA,
1348 alla memoria, essa viene a coprire anche la possibilità di assegnare priorità
1349 arbitrarie nell'accesso a disco (vedi sez.~\ref{sec:io_priority}) e nelle
1350 politiche di allocazione delle pagine di memoria ai nodi di un sistema NUMA.
1352 \constend{CAP\_SYS\_NICE}
1353 \constbeg{CAP\_SYS\_RESOURCE}
1355 Infine la \textit{capability} \const{CAP\_SYS\_RESOURCE} attiene alla
1356 possibilità di superare i limiti imposti sulle risorse di sistema, come usare
1357 lo spazio disco riservato all'amministratore sui filesystem che lo supportano,
1358 usare la funzione \func{ioctl} per controllare il \textit{journaling} sul
1359 filesystem \acr{ext3}, non subire le quote disco, aumentare i limiti sulle
1360 risorse di un processo (vedi sez.~\ref{sec:sys_resource_limit}) e quelle sul
1361 numero di processi, ed i limiti sulle dimensioni dei messaggi delle code del
1362 SysV IPC (vedi sez.~\ref{sec:ipc_sysv_mq}).
1364 \constend{CAP\_SYS\_RESOURCE}
1366 Per la gestione delle \textit{capabilities} il kernel mette a disposizione due
1367 funzioni che permettono rispettivamente di leggere ed impostare i valori dei
1368 tre insiemi illustrati in precedenza. Queste due funzioni di sistema sono
1369 \funcd{capget} e \funcd{capset} e costituiscono l'interfaccia di gestione
1370 basso livello; i loro rispettivi prototipi sono:
1373 \fhead{sys/capability.h}
1374 \fdecl{int capget(cap\_user\_header\_t hdrp, cap\_user\_data\_t datap)}
1375 \fdesc{Legge le \textit{capabilities}.}
1376 \fdecl{int capset(cap\_user\_header\_t hdrp, const cap\_user\_data\_t datap)}
1377 \fdesc{Imposta le \textit{capabilities}.}
1380 {Le funzioni ritornano $0$ in caso di successo e $-1$ per un errore, nel qual
1381 caso \var{errno} assumerà uno dei valori:
1383 \item[\errcode{EFAULT}] si è indicato un puntatore sbagliato o nullo
1384 per \param{hdrp} o \param{datap} (quest'ultimo può essere nullo solo se si
1385 usa \func{capget} per ottenere la versione delle \textit{capabilities}
1387 \item[\errcode{EINVAL}] si è specificato un valore non valido per uno dei
1388 campi di \param{hdrp}, in particolare una versione non valida della
1389 versione delle \textit{capabilities}.
1390 \item[\errcode{EPERM}] si è tentato di aggiungere una capacità nell'insieme
1391 delle \textit{capabilities} permesse, o di impostare una capacità non
1392 presente nell'insieme di quelle permesse negli insieme delle effettive o
1393 ereditate, o si è cercato di impostare una \textit{capability} di un altro
1394 processo senza avare \const{CAP\_SETPCAP}.
1395 \item[\errcode{ESRCH}] si è fatto riferimento ad un processo inesistente.
1400 Queste due funzioni prendono come argomenti due tipi di dati dedicati,
1401 definiti come puntatori a due strutture specifiche di Linux, illustrate in
1402 fig.~\ref{fig:cap_kernel_struct}. Per un certo periodo di tempo era anche
1403 indicato che per poterle utilizzare fosse necessario che la macro
1404 \macro{\_POSIX\_SOURCE} risultasse non definita (ed era richiesto di inserire
1405 una istruzione \texttt{\#undef \_POSIX\_SOURCE} prima di includere
1406 \headfiled{sys/capability.h}) requisito che non risulta più
1407 presente.\footnote{e non è chiaro neanche quanto sia mai stato davvero
1410 \begin{figure}[!htb]
1413 \begin{minipage}[c]{0.8\textwidth}
1414 \includestruct{listati/cap_user_header_t.h}
1417 \caption{Definizione delle strutture a cui fanno riferimento i puntatori
1418 \structd{cap\_user\_header\_t} e \structd{cap\_user\_data\_t} usati per
1419 l'interfaccia di gestione di basso livello delle \textit{capabilities}.}
1420 \label{fig:cap_kernel_struct}
1423 Si tenga presente che le strutture di fig.~\ref{fig:cap_kernel_struct}, come i
1424 prototipi delle due funzioni \func{capget} e \func{capset}, sono soggette ad
1425 essere modificate con il cambiamento del kernel (in particolare i tipi di dati
1426 delle strutture) ed anche se finora l'interfaccia è risultata stabile, non c'è
1427 nessuna assicurazione che questa venga mantenuta,\footnote{viene però
1428 garantito che le vecchie funzioni continuino a funzionare.} Pertanto se si
1429 vogliono scrivere programmi portabili che possano essere eseguiti senza
1430 modifiche o adeguamenti su qualunque versione del kernel è opportuno
1431 utilizzare le interfacce di alto livello che vedremo più avanti.
1433 La struttura a cui deve puntare l'argomento \param{hdrp} serve ad indicare,
1434 tramite il campo \var{pid}, il \ids{PID} del processo del quale si vogliono
1435 leggere o modificare le \textit{capabilities}. Con \func{capset} questo, se si
1436 usano le \textit{file capabilities}, può essere solo 0 o il \ids{PID} del
1437 processo chiamante, che sono equivalenti. Non tratteremo, essendo comunque di
1438 uso irrilevante, il caso in cui, in mancanza di tale supporto, la funzione può
1439 essere usata per modificare le \textit{capabilities} di altri processi, per il
1440 quale si rimanda, se interessati, alla lettura della pagina di manuale.
1442 Il campo \var{version} deve essere impostato al valore della versione delle
1443 stesse usata dal kernel (quello indicato da una delle costanti
1444 \texttt{\_LINUX\_CAPABILITY\_VERSION\_n} di fig.~\ref{fig:cap_kernel_struct})
1445 altrimenti le funzioni ritorneranno con un errore di \errcode{EINVAL},
1446 restituendo nel campo stesso il valore corretto della versione in uso. La
1447 versione due è comunque deprecata e non deve essere usata, ed il kernel
1448 stamperà un avviso se lo si fa.
1450 I valori delle \textit{capabilities} devono essere passati come maschere
1451 binarie;\footnote{e si tenga presente che i valori di
1452 tab.~\ref{tab:proc_capabilities} non possono essere combinati direttamente,
1453 indicando il numero progressivo del bit associato alla relativa capacità.}
1454 con l'introduzione delle \textit{capabilities} a 64 bit inoltre il
1455 puntatore \param{datap} non può essere più considerato come relativo ad una
1456 singola struttura, ma ad un vettore di due strutture.\footnote{è questo cambio
1457 di significato che ha portato a deprecare la versione 2, che con
1458 \func{capget} poteva portare ad un buffer overflow per vecchie applicazioni
1459 che continuavano a considerare \param{datap} come puntatore ad una singola
1462 Dato che le precedenti funzioni, oltre ad essere specifiche di Linux, non
1463 garantiscono la stabilità nell'interfaccia, è sempre opportuno effettuare la
1464 gestione delle \textit{capabilities} utilizzando le funzioni di libreria a
1465 questo dedicate. Queste funzioni, che seguono quanto previsto nelle bozze
1466 dello standard POSIX.1e, non fanno parte della \acr{glibc} e sono fornite in
1467 una libreria a parte,\footnote{la libreria è \texttt{libcap2}, nel caso di
1468 Debian può essere installata con il pacchetto omonimo.} pertanto se un
1469 programma le utilizza si dovrà indicare esplicitamente al compilatore l'uso
1470 della suddetta libreria attraverso l'opzione \texttt{-lcap}.
1472 \itindbeg{capability~state}
1474 Le funzioni dell'interfaccia alle \textit{capabilities} definite nelle bozze
1475 dello standard POSIX.1e prevedono l'uso di un tipo di dato opaco,
1476 \typed{cap\_t}, come puntatore ai dati mantenuti nel cosiddetto
1477 \textit{capability state},\footnote{si tratta in sostanza di un puntatore ad
1478 una struttura interna utilizzata dalle librerie, i cui campi non devono mai
1479 essere acceduti direttamente.} in sono memorizzati tutti i dati delle
1480 \textit{capabilities}.
1482 In questo modo è possibile mascherare i dettagli della gestione di basso
1483 livello, che potranno essere modificati senza dover cambiare le funzioni
1484 dell'interfaccia, che fanno riferimento soltanto ad oggetti di questo tipo.
1485 L'interfaccia pertanto non soltanto fornisce le funzioni per modificare e
1486 leggere le \textit{capabilities}, ma anche quelle per gestire i dati
1487 attraverso i \textit{capability state}, che presentano notevoli affinità,
1488 essendo parte di bozze dello stesso standard, con quelle già viste per le ACL.
1490 La prima funzione dell'interfaccia è quella che permette di inizializzare un
1491 \textit{capability state}, allocando al contempo la memoria necessaria per i
1492 relativi dati. La funzione è \funcd{cap\_init} ed il suo prototipo è:
1495 \fhead{sys/capability.h}
1496 \fdecl{cap\_t cap\_init(void)}
1497 \fdesc{Crea ed inizializza un \textit{capability state}.}
1500 {La funzione ritorna un \textit{capability state} in caso di successo e
1501 \val{NULL} per un errore, nel qual caso \var{errno} potrà assumere solo il
1502 valore \errval{ENOMEM}. }
1505 La funzione restituisce il puntatore \type{cap\_t} ad uno stato inizializzato
1506 con tutte le \textit{capabilities} azzerate. In caso di errore (cioè quando
1507 non c'è memoria sufficiente ad allocare i dati) viene restituito \val{NULL}
1508 ed \var{errno} viene impostata a \errval{ENOMEM}.
1510 La memoria necessaria a mantenere i dati viene automaticamente allocata da
1511 \func{cap\_init}, ma dovrà essere disallocata esplicitamente quando non è più
1512 necessaria utilizzando, per questo l'interfaccia fornisce una apposita
1513 funzione, \funcd{cap\_free}, il cui prototipo è:
1516 \fhead{sys/capability.h}
1517 \fdecl{int cap\_free(void *obj\_d)}
1518 \fdesc{Disalloca la memoria allocata per i dati delle \textit{capabilities}..}
1521 {La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
1522 caso \var{errno} potrà assumere solo il valore \errval{EINVAL}.
1527 La funzione permette di liberare la memoria allocata dalle altre funzioni
1528 della libreria sia per un \textit{capability state}, nel qual caso l'argomento
1529 sarà un dato di tipo \type{cap\_t}, che per una descrizione testuale dello
1530 stesso,\footnote{cioè quanto ottenuto tramite la funzione
1531 \func{cap\_to\_text}.} nel qual caso l'argomento sarà un dato di tipo
1532 \texttt{char *}. Per questo motivo l'argomento \param{obj\_d} è dichiarato
1533 come \texttt{void *}, per evitare la necessità di eseguire un \textit{cast},
1534 ma dovrà comunque corrispondere ad un puntatore ottenuto tramite le altre
1535 funzioni della libreria, altrimenti la funzione fallirà con un errore di
1538 Infine si può creare una copia di un \textit{capability state} ottenuto in
1539 precedenza tramite la funzione \funcd{cap\_dup}, il cui prototipo è:
1542 \fhead{sys/capability.h}
1543 \fdecl{cap\_t cap\_dup(cap\_t cap\_p)}
1544 \fdesc{Duplica un \textit{capability state} restituendone una copia.}
1547 {La funzione ritorna un \textit{capability state} in caso di successo e
1548 \val{NULL} per un errore, nel qual caso \var{errno} assumerà i valori
1549 \errval{ENOMEM} o \errval{EINVAL} nel loro significato generico.}
1553 La funzione crea una copia del \textit{capability state} posto all'indirizzo
1554 \param{cap\_p} che si è passato come argomento, restituendo il puntatore alla
1555 copia, che conterrà gli stessi valori delle \textit{capabilities} presenti
1556 nell'originale. La memoria necessaria viene allocata automaticamente dalla
1557 funzione. Una volta effettuata la copia i due \textit{capability state}
1558 potranno essere modificati in maniera completamente indipendente, ed alla fine
1559 delle operazioni si dovrà disallocare anche la copia, oltre all'originale.
1561 Una seconda classe di funzioni di servizio previste dall'interfaccia sono
1562 quelle per la gestione dei dati contenuti all'interno di un \textit{capability
1563 state}; la prima di queste è \funcd{cap\_clear}, il cui prototipo è:
1566 \fhead{sys/capability.h}
1567 \fdecl{int cap\_clear(cap\_t cap\_p)}
1568 \fdesc{Inizializza un \textit{capability state} cancellando tutte le
1569 \textit{capabilities}.}
1572 {La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
1573 caso \var{errno} potrà assumere solo il valore \errval{EINVAL}.
1577 La funzione si limita ad azzerare tutte le \textit{capabilities} presenti nel
1578 \textit{capability state} all'indirizzo \param{cap\_p} passato come argomento,
1579 restituendo uno stato \textsl{vuoto}, analogo a quello che si ottiene nella
1580 creazione con \func{cap\_init}.
1582 Una variante di \func{cap\_clear} è \funcd{cap\_clear\_flag} che cancella da
1583 un \textit{capability state} tutte le \textit{capabilities} di un certo
1584 insieme fra quelli elencati a pag.~\pageref{sec:capabilities_set}, il suo
1588 \fhead{sys/capability.h}
1589 \fdecl{int cap\_clear\_flag(cap\_t cap\_p, cap\_flag\_t flag)}
1590 \fdesc{Cancella delle \textit{capabilities} da un \textit{capability state}.}
1593 {La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
1594 caso \var{errno} potrà assumere solo il valore \errval{EINVAL}.
1598 La funzione richiede che si indichi quale degli insiemi si intente cancellare
1599 da \param{cap\_p} con l'argomento \param{flag}. Questo deve essere specificato
1600 con una variabile di tipo \type{cap\_flag\_t} che può assumere
1601 esclusivamente\footnote{si tratta in effetti di un tipo enumerato, come si può
1602 verificare dalla sua definizione che si trova in
1603 \headfile{sys/capability.h}.} uno dei valori illustrati in
1604 tab.~\ref{tab:cap_set_identifier}.
1609 \begin{tabular}[c]{|l|l|}
1611 \textbf{Valore} & \textbf{Significato} \\
1614 \constd{CAP\_EFFECTIVE} & Capacità dell'insieme \textsl{effettivo}.\\
1615 \constd{CAP\_PERMITTED} & Capacità dell'insieme \textsl{permesso}.\\
1616 \constd{CAP\_INHERITABLE}& Capacità dell'insieme \textsl{ereditabile}.\\
1619 \caption{Valori possibili per il tipo di dato \typed{cap\_flag\_t} che
1620 identifica gli insiemi delle \textit{capabilities}.}
1621 \label{tab:cap_set_identifier}
1624 Si possono inoltre confrontare in maniera diretta due diversi
1625 \textit{capability state} con la funzione \funcd{cap\_compare}; il suo
1629 \fhead{sys/capability.h}
1630 \fdecl{int cap\_compare(cap\_t cap\_a, cap\_t cap\_b)}
1631 \fdesc{Confronta due \textit{capability state}.}
1634 {La funzione ritorna $0$ se i \textit{capability state} sono identici
1635 ed un valore positivo se differiscono, non sono previsti errori.}
1639 La funzione esegue un confronto fra i due \textit{capability state} passati
1640 come argomenti e ritorna in un valore intero il risultato, questo è nullo se
1641 sono identici o positivo se vi sono delle differenze. Il valore di ritorno
1642 della funzione consente inoltre di per ottenere ulteriori informazioni su
1643 quali sono gli insiemi di \textit{capabilities} che risultano differenti. Per
1644 questo si può infatti usare la apposita macro \macro{CAP\_DIFFERS}:
1649 \fhead{sys/capability.h}
1650 \fdecl{int \macrod{CAP\_DIFFERS}(value, flag)}
1651 \fdesc{Controlla lo stato di eventuali differenze delle \textit{capabilities}
1652 nell'insieme \texttt{flag}.}
1657 La macro richiede che si passi nell'argomento \texttt{value} il risultato
1658 della funzione \func{cap\_compare} e in \texttt{flag} l'indicazione (coi
1659 valori di tab.~\ref{tab:cap_set_identifier}) dell'insieme che si intende
1660 controllare; restituirà un valore diverso da zero se le differenze rilevate da
1661 \func{cap\_compare} sono presenti nell'insieme indicato.
1663 Per la gestione dei singoli valori delle \textit{capabilities} presenti in un
1664 \textit{capability state} l'interfaccia prevede due funzioni specifiche,
1665 \funcd{cap\_get\_flag} e \funcd{cap\_set\_flag}, che permettono
1666 rispettivamente di leggere o impostare il valore di una capacità all'interno
1667 in uno dei tre insiemi già citati; i rispettivi prototipi sono:
1670 \fhead{sys/capability.h}
1671 \fdecl{int cap\_get\_flag(cap\_t cap\_p, cap\_value\_t cap, cap\_flag\_t
1673 \phantom{int cap\_get\_flag(}cap\_flag\_value\_t *value\_p)}
1674 \fdesc{Legge il valore di una \textit{capability}.}
1675 \fdecl{int cap\_set\_flag(cap\_t cap\_p, cap\_flag\_t flag, int ncap,
1676 cap\_value\_t *caps, \\
1677 \phantom{int cap\_set\_flag(}cap\_flag\_value\_t value)}
1678 \fdesc{Imposta il valore di una \textit{capability}.}
1681 {Le funzioni ritornano $0$ in caso di successo e $-1$ per un errore, nel qual
1682 caso \var{errno} potrà assumere solo il valore \errval{EINVAL}.
1686 In entrambe le funzioni l'argomento \param{cap\_p} indica il puntatore al
1687 \textit{capability state} su cui operare, mentre l'argomento \param{flag}
1688 indica su quale dei tre insiemi si intende operare, sempre con i valori di
1689 tab.~\ref{tab:cap_set_identifier}. La capacità che si intende controllare o
1690 impostare invece deve essere specificata attraverso una variabile di tipo
1691 \typed{cap\_value\_t}, che può prendere come valore uno qualunque di quelli
1692 riportati in tab.~\ref{tab:proc_capabilities}, in questo caso però non è
1693 possibile combinare diversi valori in una maschera binaria, una variabile di
1694 tipo \type{cap\_value\_t} può indicare una sola capacità.\footnote{in
1695 \headfile{sys/capability.h} il tipo \type{cap\_value\_t} è definito come
1696 \ctyp{int}, ma i valori validi sono soltanto quelli di
1697 tab.~\ref{tab:proc_capabilities}.}
1699 Infine lo stato di una capacità è descritto ad una variabile di tipo
1700 \type{cap\_flag\_value\_t}, che a sua volta può assumere soltanto
1701 uno\footnote{anche questo è un tipo enumerato.} dei valori di
1702 tab.~\ref{tab:cap_value_type}.
1707 \begin{tabular}[c]{|l|l|}
1709 \textbf{Valore} & \textbf{Significato} \\
1712 \constd{CAP\_CLEAR}& La capacità non è impostata.\\
1713 \constd{CAP\_SET} & La capacità è impostata.\\
1716 \caption{Valori possibili per il tipo di dato \typed{cap\_flag\_value\_t} che
1717 indica lo stato di una capacità.}
1718 \label{tab:cap_value_type}
1721 La funzione \func{cap\_get\_flag} legge lo stato della capacità indicata
1722 dall'argomento \param{cap} all'interno dell'insieme indicato dall'argomento
1723 \param{flag} e lo restituisce come \textit{value result argument} nella
1724 variabile puntata dall'argomento \param{value\_p}. Questa deve essere di tipo
1725 \type{cap\_flag\_value\_t} ed assumerà uno dei valori di
1726 tab.~\ref{tab:cap_value_type}. La funzione consente pertanto di leggere solo
1727 lo stato di una capacità alla volta.
1729 La funzione \func{cap\_set\_flag} può invece impostare in una sola chiamata
1730 più \textit{capabilities}, anche se solo all'interno dello stesso insieme ed
1731 allo stesso valore. Per questo motivo essa prende un vettore di valori di tipo
1732 \type{cap\_value\_t} nell'argomento \param{caps}, la cui dimensione viene
1733 specificata dall'argomento \param{ncap}. Il tipo di impostazione da eseguire
1734 (cancellazione o attivazione) per le capacità elencate in \param{caps} viene
1735 indicato dall'argomento \param{value} sempre con i valori di
1736 tab.~\ref{tab:cap_value_type}.
1738 Per semplificare la gestione delle \textit{capabilities} l'interfaccia prevede
1739 che sia possibile utilizzare anche una rappresentazione testuale del contenuto
1740 di un \textit{capability state} e fornisce le opportune funzioni di
1741 gestione;\footnote{entrambe erano previste dalla bozza dello standard
1742 POSIX.1e.} la prima di queste, che consente di ottenere la rappresentazione
1743 testuale, è \funcd{cap\_to\_text}, il cui prototipo è:
1746 \fhead{sys/capability.h}
1747 \fdecl{char *cap\_to\_text(cap\_t caps, ssize\_t *length\_p)}
1748 \fdesc{Genera una visualizzazione testuale delle \textit{capabilities}.}
1751 {La funzione ritorna un puntatore alla stringa con la descrizione delle
1752 \textit{capabilities} in caso di successo e \val{NULL} per un errore, nel
1753 qual caso \var{errno} assumerà i valori \errval{EINVAL} o \errval{ENOMEM}
1754 nel loro significato generico.}
1757 La funzione ritorna l'indirizzo di una stringa contente la descrizione
1758 testuale del contenuto del \textit{capability state} \param{caps} passato come
1759 argomento, e, qualora l'argomento \param{length\_p} sia diverso da \val{NULL},
1760 restituisce come \textit{value result argument} nella variabile intera da
1761 questo puntata la lunghezza della stringa. La stringa restituita viene
1762 allocata automaticamente dalla funzione e pertanto dovrà essere liberata con
1765 La rappresentazione testuale, che viene usata anche dai programmi di gestione a
1766 riga di comando, prevede che lo stato venga rappresentato con una stringa di
1767 testo composta da una serie di proposizioni separate da spazi, ciascuna delle
1768 quali specifica una operazione da eseguire per creare lo stato finale. Nella
1769 rappresentazione si fa sempre conto di partire da uno stato in cui tutti gli
1770 insiemi sono vuoti e si provvede a impostarne i contenuti.
1772 Ciascuna proposizione è nella forma di un elenco di capacità, espresso con i
1773 nomi di tab.~\ref{tab:proc_capabilities} separati da virgole, seguito da un
1774 operatore, e dall'indicazione degli insiemi a cui l'operazione si applica. I
1775 nomi delle capacità possono essere scritti sia maiuscoli che minuscoli, viene
1776 inoltre riconosciuto il nome speciale \texttt{all} che è equivalente a
1777 scrivere la lista completa. Gli insiemi sono identificati dalle tre lettere
1778 iniziali: ``\texttt{p}'' per il \textit{permitted}, ``\texttt{i}'' per
1779 l'\textit{inheritable} ed ``\texttt{e}'' per l'\textit{effective} che devono
1780 essere sempre minuscole, e se ne può indicare più di uno.
1782 Gli operatori possibili sono solo tre: ``\texttt{+}'' che aggiunge le capacità
1783 elencate agli insiemi indicati, ``\texttt{-}'' che le toglie e ``\texttt{=}''
1784 che le assegna esattamente. I primi due richiedono che sia sempre indicato sia
1785 un elenco di capacità che gli insiemi a cui esse devono applicarsi, e
1786 rispettivamente attiveranno o disattiveranno le capacità elencate nell'insieme
1787 o negli insiemi specificati, ignorando tutto il resto. I due operatori possono
1788 anche essere combinati nella stessa proposizione, per aggiungere e togliere le
1789 capacità dell'elenco da insiemi diversi.
1791 L'assegnazione si applica invece su tutti gli insiemi allo stesso tempo,
1792 pertanto l'uso di ``\texttt{=}'' è equivalente alla cancellazione preventiva
1793 di tutte le capacità ed alla impostazione di quelle elencate negli insiemi
1794 specificati, questo significa che in genere lo si usa una sola volta
1795 all'inizio della stringa. In tal caso l'elenco delle capacità può non essere
1796 indicato e viene assunto che si stia facendo riferimento a tutte quante senza
1797 doverlo scrivere esplicitamente.
1799 Come esempi avremo allora che un processo non privilegiato di un utente, che
1800 non ha nessuna capacità attiva, avrà una rappresentazione nella forma
1801 ``\texttt{=}'' che corrisponde al fatto che nessuna capacità viene assegnata a
1802 nessun insieme (vale la cancellazione preventiva), mentre un processo con
1803 privilegi di amministratore avrà una rappresentazione nella forma
1804 ``\texttt{=ep}'' in cui tutte le capacità vengono assegnate agli insiemi
1805 \textit{permitted} ed \textit{effective} (e l'\textit{inheritable} è ignorato
1806 in quanto per le regole viste a pag.~\ref{sec:capability-uid-transition} le
1807 capacità verranno comunque attivate attraverso una \func{exec}). Infine, come
1808 esempio meno banale dei precedenti, otterremo per \texttt{init} una
1809 rappresentazione nella forma ``\texttt{=ep cap\_setpcap-e}'' dato che come
1810 accennato tradizionalmente \const{CAP\_SETPCAP} è sempre stata rimossa da
1813 Viceversa per ottenere un \textit{capability state} dalla sua rappresentazione
1814 testuale si può usare la funzione \funcd{cap\_from\_text}, il cui prototipo è:
1817 \fhead{sys/capability.h}
1818 \fdecl{cap\_t cap\_from\_text(const char *string)}
1819 \fdesc{Crea un \textit{capability state} dalla sua rappresentazione testuale.}
1822 {La funzione ritorna un \textit{capability state} in caso di successo e
1823 \val{NULL} per un errore, nel qual caso \var{errno} assumerà i valori
1824 \errval{EINVAL} o \errval{ENOMEM} nel loro significato generico.}
1828 La funzione restituisce il puntatore ad un \textit{capability state}
1829 inizializzato con i valori indicati nella stringa \param{string} che ne
1830 contiene la rappresentazione testuale. La memoria per il \textit{capability
1831 state} viene allocata automaticamente dalla funzione e dovrà essere liberata
1832 con \func{cap\_free}.
1834 Alle due funzioni citate se ne aggiungono altre due che consentono di
1835 convertire i valori delle costanti di tab.~\ref{tab:proc_capabilities} nelle
1836 stringhe usate nelle rispettive rappresentazioni e viceversa. Le due funzioni,
1837 \funcd{cap\_to\_name} e \funcd{cap\_from\_name}, sono estensioni specifiche di
1838 Linux ed i rispettivi prototipi sono:
1841 \fhead{sys/capability.h}
1842 \fdecl{char *cap\_to\_name(cap\_value\_t cap)}
1843 \fdesc{Converte il valore numerico di una \textit{capabilities} alla sua
1844 rappresentazione testuale.}
1845 \fdecl{int cap\_from\_name(const char *name, cap\_value\_t *cap\_p)}
1847 \fdesc{Converte la rappresentazione testuale di una \textit{capabilities} al
1848 suo valore numerico.}
1851 {La funzione \func{cap\_to\_name} ritorna un puntatore ad una stringa in caso
1852 di successo e \val{NULL} per un errore, mentre \func{cap\_to\_name} ritorna
1853 $0$ in caso di successo e $-1$ per un errore, per entrambe in caso di errore
1854 \var{errno} assumerà i valori \errval{EINVAL} o \errval{ENOMEM} nel loro
1855 significato generico.
1859 La prima funzione restituisce la stringa (allocata automaticamente e che dovrà
1860 essere liberata con \func{cap\_free}) che corrisponde al valore della
1861 capacità \param{cap}, mentre la seconda restituisce nella variabile puntata
1862 da \param{cap\_p}, come \textit{value result argument}, il valore della
1863 capacità rappresentata dalla stringa \param{name}.
1865 Fin quei abbiamo trattato solo le funzioni di servizio relative alla
1866 manipolazione dei \textit{capability state} come strutture di dati;
1867 l'interfaccia di gestione prevede però anche le funzioni per trattare le
1868 \textit{capabilities} presenti nei processi. La prima di queste funzioni è
1869 \funcd{cap\_get\_proc} che consente la lettura delle \textit{capabilities} del
1870 processo corrente, il suo prototipo è:
1873 \fhead{sys/capability.h}
1874 \fdecl{cap\_t cap\_get\_proc(void)}
1875 \fdesc{Legge le \textit{capabilities} del processo corrente.}
1878 {La funzione ritorna un \textit{capability state} in caso di successo e
1879 \val{NULL} per un errore, nel qual caso \var{errno} assumerà i valori
1880 \errval{EINVAL}, \errval{EPERM} o \errval{ENOMEM} nel loro significato
1884 La funzione legge il valore delle \textit{capabilities} associate al processo
1885 da cui viene invocata, restituendo il risultato tramite il puntatore ad un
1886 \textit{capability state} contenente tutti i dati che provvede ad allocare
1887 autonomamente e che di nuovo occorrerà liberare con \func{cap\_free} quando
1888 non sarà più utilizzato.
1890 Se invece si vogliono leggere le \textit{capabilities} di un processo
1891 specifico occorre usare la funzione \funcd{cap\_get\_pid}, il cui
1892 prototipo\footnote{su alcune pagine di manuale la funzione è descritta con un
1893 prototipo sbagliato, che prevede un valore di ritorno di tipo \type{cap\_t},
1894 ma il valore di ritorno è intero, come si può verificare anche dalla
1895 dichiarazione della stessa in \headfile{sys/capability.h}.} è:
1898 \fhead{sys/capability.h}
1899 \fdecl{cap\_t cap\_get\_pid(pid\_t pid)}
1900 \fdesc{Legge le \textit{capabilities} di un processo.}
1903 {La funzione ritorna un \textit{capability state} in caso di successo e
1904 \val{NULL} per un errore, nel qual caso \var{errno} assumerà i valori
1905 \errval{ESRCH} o \errval{ENOMEM} nel loro significato generico. }
1908 La funzione legge il valore delle \textit{capabilities} del processo indicato
1909 con l'argomento \param{pid}, e restituisce il risultato tramite il puntatore
1910 ad un \textit{capability state} contenente tutti i dati che provvede ad
1911 allocare autonomamente e che al solito deve essere disallocato con
1912 \func{cap\_free}. Qualora il processo indicato non esista si avrà un errore di
1913 \errval{ESRCH}. Gli stessi valori possono essere letti direttamente nel
1914 filesystem \textit{proc}, nei file \texttt{/proc/<pid>/status}; ad esempio per
1915 \texttt{init} si otterrà qualcosa del tipo:
1917 piccardi@hain:~/gapil$ \textbf{cat /proc/1/status}
1919 CapInh: 0000000000000000
1920 CapPrm: 00000000fffffeff
1921 CapEff: 00000000fffffeff
1926 \itindend{capability~state}
1928 Infine per impostare le \textit{capabilities} del processo corrente (nella
1929 bozza dello standard POSIX.1e non esiste una funzione che permetta di cambiare
1930 le \textit{capabilities} di un altro processo) si deve usare la funzione
1931 \funcd{cap\_set\_proc}, il cui prototipo è:
1934 \fhead{sys/capability.h}
1935 \fdecl{int cap\_set\_proc(cap\_t cap\_p)}
1936 \fdesc{Imposta le \textit{capabilities} del processo corrente.}
1939 {La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
1940 caso \var{errno} assumerà i valori:
1942 \item[\errcode{EPERM}] si è cercato di attivare una capacità non permessa.
1943 \end{errlist} ed inoltre \errval{EINVAL} nel suo significato generico.}
1946 La funzione modifica le \textit{capabilities} del processo corrente secondo
1947 quanto specificato con l'argomento \param{cap\_p}, posto che questo sia
1948 possibile nei termini spiegati in precedenza (non sarà ad esempio possibile
1949 impostare capacità non presenti nell'insieme di quelle permesse).
1951 In caso di successo i nuovi valori saranno effettivi al ritorno della
1952 funzione, in caso di fallimento invece lo stato delle capacità resterà
1953 invariato. Si tenga presente che \textsl{tutte} le capacità specificate
1954 tramite \param{cap\_p} devono essere permesse; se anche una sola non lo è la
1955 funzione fallirà, e per quanto appena detto, lo stato delle
1956 \textit{capabilities} non verrà modificato (neanche per le parti eventualmente
1959 Oltre a queste funzioni su Linux sono presenti due ulteriori funzioni,
1960 \funcm{capgetp} e \funcm{capsetp}, che svolgono un compito analogo. Queste
1961 funzioni risalgono alla implementazione iniziale delle \textit{capabilities}
1962 ed in particolare \funcm{capsetp} consentirebbe anche, come possibile in quel
1963 caso, di cambiare le capacità di un altro processo. Le due funzioni oggi sono
1964 deprecate e pertanto eviteremo di trattarle, per chi fosse interessato si
1965 rimanda alla lettura della loro pagina di manuale.
1967 Come esempio di utilizzo di queste funzioni nei sorgenti allegati alla guida
1968 si è distribuito il programma \texttt{getcap.c}, che consente di leggere le
1969 \textit{capabilities} del processo corrente\footnote{vale a dire di sé stesso,
1970 quando lo si lancia, il che può sembrare inutile, ma serve a mostrarci quali
1971 sono le \textit{capabilities} standard che ottiene un processo lanciato
1972 dalla riga di comando.} o tramite l'opzione \texttt{-p}, quelle di un
1973 processo qualunque il cui \ids{PID} viene passato come parametro dell'opzione.
1975 \begin{figure}[!htbp]
1976 \footnotesize \centering
1977 \begin{minipage}[c]{\codesamplewidth}
1978 \includecodesample{listati/getcap.c}
1981 \caption{Corpo principale del programma \texttt{getcap.c}.}
1982 \label{fig:proc_getcap}
1985 La sezione principale del programma è riportata in fig.~\ref{fig:proc_getcap},
1986 e si basa su una condizione sulla variabile \var{pid} che se si è usato
1987 l'opzione \texttt{-p} è impostata (nella sezione di gestione delle opzioni,
1988 che si è tralasciata) al valore del \ids{PID} del processo di cui si vuole
1989 leggere le \textit{capabilities} e nulla altrimenti. Nel primo caso
1990 (\texttt{\small 1-6}) si utilizza (\texttt{\small 2}) \func{cap\_get\_proc}
1991 per ottenere lo stato delle capacità del processo, nel secondo (\texttt{\small
1992 7-13}) si usa invece \func{cap\_get\_pid} (\texttt{\small 8}) per leggere
1993 il valore delle capacità del processo indicato.
1995 Il passo successivo è utilizzare (\texttt{\small 15}) \func{cap\_to\_text} per
1996 tradurre in una stringa lo stato, e poi (\texttt{\small 16}) stamparlo; infine
1997 (\texttt{\small 18-19}) si libera la memoria allocata dalle precedenti
1998 funzioni con \func{cap\_free} per poi ritornare dal ciclo principale della
2001 \itindend{capabilities}
2003 % TODO vedi http://lwn.net/Articles/198557/ e
2004 % http://www.madore.org/~david/linux/newcaps/
2009 \subsection{La gestione del \textit{Secure Computing}.}
2010 \label{sec:procadv_seccomp}
2012 \itindbeg{secure~computing~mode}
2014 Il \textit{secure computing mode} è un meccanismo ideato per fornire un
2015 supporto per l'esecuzione di codice esterno non fidato e non verificabile a
2016 scopo di calcolo. L'idea era quello di poter vendere la capacità di calcolo
2017 della propria macchina ad un qualche servizio di calcolo distribuito, senza
2018 comprometterne la sicurezza eseguendo codice non sotto il proprio controllo.
2020 Nella prima versione del meccanismo, introdotto con il kernel 2.6.23 e
2021 disponibile solo avendo è abilitato il supporto nel kernel con
2022 \texttt{CONFIG\_SECCOMP}, questo veniva attivato con \func{prctl} indicando
2023 l'opzione \const{PR\_SET\_SECCOMP}, che all'epoca supportava soltanto l'uso
2024 del valore \const{SECCOMP\_MODE\_STRICT} per \param{arg2}.
2026 Una volta abilitato il \textit{secure computing mode} in questa modalità (in
2027 seguito denominata \textit{strict mode}) il processo o il \textit{thread}
2028 chiamante potrà utilizzare soltanto un insieme estremamente limitato di
2029 \textit{system call}: \func{read}, \func{write}, \func{\_exit} e
2030 \funcm{sigreturn}. Ogni altra \textit{system call} porterà all'emissione di un
2031 \signal{SIGKILL} (vedi sez.~\ref{sec:sig_termination}). In questa modalità di
2032 utilizzo i dati vengono letti o scritti grazie ad un socket o una
2033 \textit{pipe}, creati prima di lanciare il processo che eseguirà il codice non
2034 fidato, e per evitare problemi di sicurezza non saranno possibili altre
2035 operazioni se non quelle citate.
2038 % TODO a partire dal kernel 3.5 è stato introdotto la possibilità di usare un
2039 % terzo argomento se il secondo è SECCOMP_MODE_FILTER, vedi
2040 % Documentation/prctl/seccomp_filter.txt
2041 % vedi anche http://lwn.net/Articles/600250/
2043 % TODO documentare PR_SET_SECCOMP introdotto a partire dal kernel 3.5. Vedi:
2044 % * Documentation/prctl/seccomp_filter.txt
2045 % * http://lwn.net/Articles/475043/
2047 % TODO a partire dal kernel 3.17 è stata introdotta la nuova syscall seccomp,
2048 % vedi http://lwn.net/Articles/600250/ e http://lwn.net/Articles/603321/
2051 \itindend{secure~computing~mode}
2053 \subsection{Altre funzionalità di sicurezza.}
2054 \label{sec:procadv_security_misc}
2056 Oltre alle funzionalità specifiche esaminate nelle sezioni precedenti, il
2057 kernel supporta una varietà di ulteriori impostazioni di sicurezza,
2058 accessibili nelle maniere più varie, che abbiamo raccolto in questa sezione.
2060 Una serie di modalità di sicurezza sono attivabili a richiesta attraverso
2061 alcune opzioni di controllo attivabili via \func{sysctl} o il filesystem
2062 \texttt{/proc}, un elenco delle stesse e dei loro effetti è il seguente:
2064 \begin{basedescript}{\desclabelwidth{1cm}\desclabelstyle{\nextlinelabel}}
2065 \item[\sysctlrelfiled{fs}{protected\_hardlinks}] Un valore nullo, il default,
2066 mantiene il comportamento standard che non pone restrizioni alla creazione
2067 di \textit{hard link}. Se il valore viene posto ad 1 vengono invece attivate
2068 una serie di restrizioni protettive, denominate
2069 \itindex{protected~hardlinks} \textit{protected hardlinks}, che se non
2070 soddisfatte causano il fallimento di \func{link} con un errore di
2071 \errval{EPERM}. Perché questo non avvenga almeno una delle seguenti
2072 condizioni deve essere soddisfatta:
2074 \item il chiamante deve avere privilegi amministrativi (la
2075 \textit{capability} \const{CAP\_FOWNER}). In caso di utilizzo
2076 dell'\textit{user namespace} oltre a possedere \const{CAP\_FOWNER} è
2077 necessario che l'\ids{UID} del proprietario del file sia mappato nel
2079 \item il \textit{filesystem} \ids{UID} del chiamante (normalmente
2080 equivalente all'\ids{UID} effettivo) deve corrispondere a quello del
2081 proprietario del file a cui si vuole effettuare il collegamento.
2082 \item devono essere soddisfatte tutte le seguenti condizioni:
2084 \item il file è un file ordinario
2085 \item il file non ha il \acr{suid} bit attivo
2086 \item il file non ha lo \acr{sgid} bit attivo ed il permesso di esecuzione
2088 \item il chiamante ha i permessi di lettura e scrittura sul file
2092 In sostanza in questo caso un utente potrà creare un collegamento diretto ad
2093 un altro file solo se ne è il proprietario o se questo è un file ordinario
2094 senza permessi speciali ed a cui ha accesso in lettura e scrittura.
2096 Questa funzionalità fornisce una protezione generica che non inficia l'uso
2097 ordinario di \func{link}, ma rende impraticabili una serie di possibili
2098 abusi della stessa; oltre ad impedire l'uso di un \textit{hard link} come
2099 variante in un attacco di \textit{symlink race} (eludendo i
2100 \textit{protected symlinks} di cui al punto successivo), evita anche che si
2101 possa lasciare un riferimento ad un eventuale programma \acr{suid}
2102 vulnerabile, creando un collegamento diretto allo stesso.
2105 \item[\sysctlrelfiled{fs}{protected\_symlinks}] Un valore nullo, il default,
2106 mantiene il comportamento standard che non pone restrizioni nel seguire i
2107 link simbolici. Se il valore viene posto ad 1 vengono attivate delle
2108 restrizioni protettive, denominate \itindex{protected~symlinks}
2109 \textit{protected symlinks}. Quando vengono attivate una qualunque funzione
2110 che esegua la risoluzione di un \textit{pathname} contenente un link
2111 simbolico non conforme alle restrizioni fallirà con un errore di
2112 \errval{EACCESS}. Per evitare l'errore deve essere soddisfatta una delle
2113 seguenti condizioni:
2115 \item il link non è in una directory con permessi analoghi a \file{/tmp}
2116 (scrivibile a tutti e con lo \textit{sticky bit} attivo);
2117 \item il link è in una directory con permessi analoghi a \file{/tmp} ma è
2118 soddisfatta una delle condizioni seguenti:
2120 \item il link simbolico appartiene al chiamante: il controllo viene fatto
2121 usando il \textit{filesystem} \ids{UID} (che normalmente corrisponde
2122 all'\ids{UID} effettivo).
2123 \item il link simbolico ha lo stesso proprietario della directory.
2127 Questa funzionalità consente di rendere impraticabili alcuni attacchi in cui
2128 si approfitta di una differenza di tempo fra il controllo e l'uso di un
2129 file, utilizzando quella che viene usualmente chiamata una
2130 \itindex{symlink~race} \textit{symlink race}.\footnote{si tratta di un
2131 sottoinsieme di quella classe di attacchi chiamata genericamente
2132 \textit{TOCTTOU}, acronimo appunto di \textit{Time of check to time of
2135 Un possibile esempio di questo tipo di attacco è quello contro un programma
2136 che viene eseguito per conto di un utente privilegiato (ad esempio un
2137 programma con il \acr{suid} o lo \acr{sgid} bit attivi) che prima controlla
2138 l'esistenza di un file e se non esiste lo crea. Se questa procedura, che è
2139 tipica della creazione di file temporanei sotto \file{/tmp}, non viene
2140 eseguita in maniera corretta,\footnote{ad esempio con le modalità che
2141 abbiamo trattato in sez.~\ref{sec:file_temp_file}, che per quanto note da
2142 tempo continuano ad essere ignorate.} un attaccante ha una finestra di
2143 tempo in cui può creare prima del programma un \textit{link simbolico} ad un
2144 file di sua scelta, compresi file di dispositivo o file a cui non avrebbe
2145 accesso, facendolo poi utilizzare al programma.
2147 Attivando la funzionalità si rende impossibile seguire un link simbolico in
2148 una directory temporanea come \texttt{/tmp}, a meno che questo non sia di
2149 proprietà del chiamante, o che questo non appartenga al proprietario della
2150 directory. Questo impedisce che i link simbolici creati da un attaccante
2151 possano essere seguiti da un programma privilegiato (perché apparterranno
2152 all'attaccante) mentre quelli creati dall'amministratore (che i genere è il
2153 proprietario di \texttt{/tmp}) saranno seguiti comunque.
2159 % TODO: trattare keyctl (man 2 keyctl)
2163 % TODO trattare le funzioni di protezione della memoria pkey_alloc, pkey_free,
2164 % pkey_mprotect, introdotte con il kernel 4.8, vedi
2165 % http://lwn.net/Articles/689395/ e Documentation/x86/protection-keys.txt
2167 %TODO trattare kcmp aggiunta con il kernel 3.5, vedi
2168 % https://lwn.net/Articles/478111/
2171 \section{Funzionalità avanzate e specialistiche}
2172 \label{sec:process_special}
2176 \subsection{La gestione delle operazioni in virgola mobile}
2177 \label{sec:process_fenv}
2181 % TODO eccezioni ed arrotondamenti per la matematica in virgola mobile
2182 % consultare la manpage di fenv, math_error, fpclassify, matherr, isgreater,
2183 % isnan, nan, INFINITY
2186 \subsection{L'accesso alle porte di I/O}
2187 \label{sec:process_io_port}
2190 % TODO l'I/O sulle porte di I/O
2191 % consultare le manpage di ioperm, iopl e outb
2192 % non c'entra nulla qui, va trovato un altro posto (altri meccanismi di I/O in
2198 %\subsection{La gestione di architetture a nodi multipli}
2199 %\label{sec:process_NUMA}
2201 % TODO trattare i cpuset, che attiene anche a NUMA, e che possono essere usati
2202 % per associare l'uso di gruppi di processori a gruppi di processi (vedi
2204 % TODO trattare getcpu, che attiene anche a NUMA, mettere qui anche
2205 % sched_getcpu, che potrebbe essere indipendente ma richiama getcpu
2207 %TODO trattare le funzionalità per il NUMA
2208 % vedi man numa e, mbind, get_mempolicy, set_mempolicy,
2209 % le pagine di manuale relative
2210 % vedere anche dove metterle...
2212 % \subsection{La gestione dei moduli}
2213 % \label{sec:kernel_modules}
2217 %TODO trattare init_module e finit_module (quest'ultima introdotta con il
2220 %%%% Altre cose di cui non è chiara la collocazione:
2222 %TODO trattare membarrier, introdotta con il kernel 4.3
2223 % vedi http://lwn.net/Articles/369567/ http://lwn.net/Articles/369640/
2224 % http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=5b25b13ab08f616efd566347d809b4ece54570d1
2225 % vedi anche l'ulteriore opzione "expedited" introdotta con il kernel 4.14
2226 % (https://lwn.net/Articles/728795/)
2230 %%% Local Variables:
2232 %%% TeX-master: "gapil"
2235 % LocalWords: system call namespace prctl IRIX kernel sys int option long
2236 % LocalWords: unsigned arg errno EACCESS EBADF EBUSY EFAULT EINVAL ENXIO PR
2237 % LocalWords: EOPNOTSUPP EPERM CAPBSET READ capability sez tab capabilities
2238 % LocalWords: bounding CAP SETPCAP DUMPABLE dump suid sgid UID DISABLE GET
2239 % LocalWords: ENDIAN endianness BIG big endian LITTLE little PPC PowerPC ia
2240 % LocalWords: FPEMU NOPRINT SIGFPE FPEXC point exception FP EXC SW ENABLE
2241 % LocalWords: OVF overflow UND underflow RES INV DISABLED NONRECOV ASYNC AO
2242 % LocalWords: KEEPCAPS pag exec SECURE KEEP CAPS securebits LOCKED NAME NUL
2243 % LocalWords: char PDEATHSIG SIGCHLD fork PTRACER PID tracer process ptrace
2244 % LocalWords: Security Modules ANY Yama SECCOMP secure computing seccomp vm
2245 % LocalWords: STRICT strict FILTER filter SIGKILL TIMING STATISTICAL TSC fn
2246 % LocalWords: TIMESTAMP timestamp Stamp Counter SIGSEGV UNALIGN SIGBUS MCE
2247 % LocalWords: KILL siginfo MCEERR memory failure early kill CLEAR child cap
2248 % LocalWords: reaper SUBREAPER init value result thread like flags stack FS
2249 % LocalWords: race condition malloc NULL copy write glibc vsyscall sched RT
2250 % LocalWords: void pid ptid struct desc tls ctid EAGAIN ENOMEM exit Posix
2251 % LocalWords: Library PARENT SETTID SETTLS TID CLEARTID futex FILES table
2252 % LocalWords: descriptor umask dell'I scheduler SIGHAND STOPPED SYSVSEM IPC
2253 % LocalWords: UNTRACED VFORK vfork mount filesystem LSM Mandatory Access fs
2254 % LocalWords: Control DAC MAC SELinux Smack Tomoyo AppArmor Discrectionary
2255 % LocalWords: permitted inheritable effective fig security ADMIN forced new
2256 % LocalWords: allowed dall' bound MODULE nell' all' capset sendmail SETGID
2257 % LocalWords: setuid orig IMMUTABLE MKNOD OVERRIDE SEARCH CHOWN FSETID LOCK
2258 % LocalWords: FOWNER saved FIXUP NOROOT AUDIT BLOCK SUSPEND SETFCAP group
2259 % LocalWords: socket domain locking mlock mlockall shmctl mmap OWNER LEASE
2260 % LocalWords: lease immutable append only mknod BIND SERVICE BROADCAST RAW
2261 % LocalWords: broadcast multicast PACKET CHROOT chroot NICE PACCT RAWIO TTY
2262 % LocalWords: accounting ioperm iopl RESOURCE CONFIG hangup vhangup SYSLOG
2263 % LocalWords: WAKE ALARM CLOCK BOOTTIME REALTIME sticky NOATIME fcntl swap
2264 % LocalWords: multicasting dell'IPC SysV trusted IOPRIO CLASS IDLE lookup
2265 % LocalWords: scheduling dcookie NEWNS unshare nice NUMA ioctl journaling
2266 % LocalWords: ext capget header hdrp datap const ESRCH SOURCE undef version
2267 % LocalWords: libcap lcap obj to text dup clear DIFFERS get ncap caps ssize
2268 % LocalWords: argument length all setpcap from string name proc cat capgetp
2269 % LocalWords: capsetp getcap read sigreturn sysctl protected hardlinks tmp
2270 % LocalWords: dell' symlink symlinks pathname TOCTTOU of