X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=procadv.tex;h=2859e8b0f6529864d8c424edae9e385e6e23874a;hp=98d403122e43dbf09d50c15aeb257fee4481283c;hb=dc4eaddc9bad8eca47e81b003fefeccaa3372f48;hpb=743ef11e68d40acfca27b95a3438b4cec6c59a8a diff --git a/procadv.tex b/procadv.tex index 98d4031..2859e8b 100644 --- a/procadv.tex +++ b/procadv.tex @@ -14,7 +14,7 @@ I/O ecc. \section{Funzioni di gestione e controllo} \label{sec:proc_manage_control} -In questa sezione prenderemo in esame alcune specifice \textit{system call} +In questa sezione prenderemo in esame alcune specifiche \textit{system call} dedicate al controllo processi sia per quanto riguarda l'impostazione di caratteristiche specialistiche, che per quanto riguarda l'analisi ed il controllo della loro esecuzione. @@ -25,7 +25,7 @@ controllo della loro esecuzione. Benché la gestione ordinaria dei processi possa essere effettuata attraverso le funzioni che abbiamo già esaminato nei capitoli \ref{cha:process_interface} e \ref{cha:process_handling}, esistono una serie di proprietà e -caratteristiche specifiche dei proecessi per la cui gestione è stata +caratteristiche specifiche dei processi per la cui gestione è stata predisposta una apposita \textit{system call} che fornisce una interfaccia generica per tutte le operazioni specialistiche. La funzione di sistema è \funcd{prctl} ed il suo prototipo è:\footnote{la funzione non è standardizzata @@ -223,44 +223,29 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC. scopo di queste dispense, per i dettagli si consulti la documentazione su \textit{Yama} nei sorgenti del kernel. Introdotta a partire dal kernel 3.4. -\itindbeg{secure~computing~mode} -\item[\constd{PR\_SET\_SECCOMP}] Imposta il cosiddetto \textit{secure computing - mode} per il processo corrente. Prevede come unica possibilità - che \param{arg2} sia impostato ad 1. Una volta abilitato il \textit{secure - computing mode} il processo potrà utilizzare soltanto un insieme - estremamente limitato di \textit{system call}: \func{read}, \func{write}, - \func{\_exit} e \funcm{sigreturn}. Ogni altra \textit{system call} porterà - all'emissione di un \signal{SIGKILL} (vedi sez.~\ref{sec:sig_termination}). - Il \textit{secure computing mode} è stato ideato per fornire un supporto per - l'esecuzione di codice esterno non fidato e non verificabile a scopo di - calcolo;\footnote{lo scopo è quello di poter vendere la capacità di calcolo - della proprio macchina ad un qualche servizio di calcolo distribuito senza - comprometterne la sicurezza eseguendo codice non sotto il proprio - controllo.} in genere i dati vengono letti o scritti grazie ad un socket o - una \textit{pipe}, e per evitare problemi di sicurezza non sono possibili - altre operazioni se non quelle citate. Introdotta a partire dal kernel - 2.6.23, disponibile solo se si è abilitato il supporto nel kernel con - \texttt{CONFIG\_SECCOMP}. - -% TODO a partire dal kernel 3.5 è stato introdotto la possibilità di usare un -% terzo argomento se il secondo è SECCOMP_MODE_FILTER, vedi -% Documentation/prctl/seccomp_filter.txt -% vedi anche http://lwn.net/Articles/600250/ - -% TODO documentare PR_SET_SECCOMP introdotto a partire dal kernel 3.5. Vedi: -% * Documentation/prctl/seccomp_filter.txt -% * http://lwn.net/Articles/475043/ - -% TODO a partire dal kernel 3.17 è stata introdotta la nuova syscall seccomp, -% vedi http://lwn.net/Articles/600250/ e http://lwn.net/Articles/603321/ +\item[\constd{PR\_SET\_SECCOMP}] Attiva il \textit{secure computing mode} per + il processo corrente. Introdotta a partire dal kernel 2.6.23 la funzionalità + è stata ulteriormente estesa con il kernel 3.5, salvo poi diventare un + sottoinsieme della \textit{system call} \func{seccomp} a partire dal kernel + 3.17. Prevede che si indichi per \param{arg2} il valore + \const{SECCOMP\_MODE\_STRICT} (unico possibile fino al kernel 2.6.23) per + selezionare il cosiddetto \textit{strict mode} o, dal kernel 3.5, + \const{SECCOMP\_MODE\_FILTER} per usare il \textit{filter mode}. Tratteremo + questa opzione nei dettagli più avanti, in sez.~\ref{sec:procadv_seccomp}, + quando affronteremo l'argomento del \textit{Secure Computing}. \item[\constd{PR\_GET\_SECCOMP}] Ottiene come valore di ritorno della funzione - lo stato corrente del \textit{secure computing mode}, al momento attuale la - funzione è totalmente inutile in quanto l'unico valore ottenibile è 0, dato - che la chiamata di questa funzione in \textit{secure computing mode} - comporterebbe l'emissione di \signal{SIGKILL}, è stata comunque definita per - eventuali estensioni future. Introdotta a partire dal kernel 2.6.23. -\itindend{secure~computing~mode} + lo stato corrente del \textit{secure computing mode}. Fino al kernel 3.5, + quando era possibile solo lo \textit{strict mode}, la funzione era + totalmente inutile in quanto l'unico valore ottenibile era 0 in assenza di + \textit{secure computing}, dato che la chiamata di questa funzione in + \textit{strict mode} avrebbe comportato l'emissione di \signal{SIGKILL} per + il chiamante. La funzione però, a partire dal kernel 2.6.23, era stata + comunque definita per eventuali estensioni future, ed infatti con + l'introduzione del \textit{filter mode} con il kernel 3.5, se essa viene + inclusa nelle funzioni consentite restituisce il valore 2 quando il + \textit{secure computing mode} è attivo (se non inclusa si avrà di nuovo un + \signal{SIGKILL}). \item[\constd{PR\_SET\_SECUREBITS}] Imposta i \textit{securebits} per il processo chiamante al valore indicato da \param{arg2}; per i dettagli sul @@ -296,8 +281,8 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC. generazione di un segnale di \signal{SIGSEGV} (vedi sez.~\ref{sec:sig_prog_error}). La lettura viene automaticamente disabilitata se si attiva il \textit{secure computing mode} (vedi - \const{PR\_SET\_SECCOMP}). Introdotta a partire dal kernel - 2.6.26, solo su x86. + \const{PR\_SET\_SECCOMP} e sez.~\ref{sec:procadv_seccomp}). Introdotta a + partire dal kernel 2.6.26, solo su x86. \item[\constd{PR\_GET\_TSC}] Ottiene il valore del flag che controlla la lettura del contattore dei \textit{timestamp}, salvato all'indirizzo @@ -429,7 +414,7 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC. In questa sezione tratteremo le funzionalità avanzate relative alla creazione dei processi e del loro ambiente, sia per quanto riguarda l'utilizzo delle stesse per la creazione dei \textit{thread} che per la gestione dei -\textit{namespace} che sono alla base dei cosidetti \textit{container}. +\textit{namespace} che sono alla base dei cosiddetti \textit{container}. \subsection{La \textit{system call} \func{clone}} @@ -606,10 +591,10 @@ elenco, che illustra quelle attualmente disponibili:\footnote{si fa informazioni, che saranno così indipendenti per i due processi, come avviene nel comportamento ordinario di un sistema unix-like. -\item[\constd{CLONE\_IO}] se questo flag viene impostato il nuovo il nuovo - processo condividerà con il padre il contesto dell'I/O, altrimenti, come - come avviene nel comportamento ordinario con una \func{fork} otterrà un suo - contesto dell'I/O. +\item[\constd{CLONE\_IO}] se questo flag viene impostato il nuovo processo + condividerà con il padre il contesto dell'I/O, altrimenti, come avviene nel + comportamento ordinario con una \func{fork} otterrà un suo contesto + dell'I/O. Il contesto dell'I/O viene usato dagli \textit{scheduler} di I/O (visti in sez.~\ref{sec:io_priority}) e se questo è lo stesso per diversi processi @@ -716,9 +701,11 @@ degli altri gruppi, che costituisce poi quello che viene chiamato un \label{sec:process_security} Tratteremo in questa sezione le funzionalità più avanzate relative alla -gestione della sicurezza, a partire dalle \textit{capabilities} e dalle -funzionalità di \textit{Secure Computing}, fino alle funzionalità relative -alla gestione delle chiavi crittografiche. +gestione della sicurezza ed il controllo degli accessi all'interno dei +processi, a partire dalle \textit{capabilities} e dalle funzionalità di +\textit{Secure Computing}. Esamineremo inoltre tutte le altre funzionalità +relative alla sicurezza come gestione delle chiavi crittografiche e varie +estensioni e funzionalità disponibili su questo argomento. @@ -748,7 +735,7 @@ definitivamente alcuni privilegi da un certo momento in poi. Per risolvere questo problema sono possibili varie soluzioni ed ad esempio dai kernel 2.5 è stata introdotta la struttura dei -\itindex{Linux~Security~Modules} \textit{Linux Security Modules} che han +\itindex{Linux~Security~Modules~(LSM)} \textit{Linux Security Modules} che han permesso di aggiungere varie forme di \itindex{Mandatory~Access~Control~(DAC)} \textit{Mandatory Access Control} (MAC), in cui si potessero parcellizzare e controllare nei minimi dettagli tutti i privilegi e le modalità in cui questi @@ -999,7 +986,7 @@ riesce così a riottenere il comportamento classico di un sistema unix-like. Una seconda circostanza è quella relativa a cosa succede alle \textit{capabilities} di un processo nelle possibili transizioni da \ids{UID} nullo a \ids{UID} non nullo o viceversa (corrispondenti rispettivamente a -cedere o riottenere i i privilegi di amministratore) che si possono effettuare +cedere o riottenere i privilegi di amministratore) che si possono effettuare con le varie funzioni viste in sez.~\ref{sec:proc_setuid}. In questo caso la casistica è di nuovo alquanto complessa, considerata anche la presenza dei diversi gruppi di identificatori illustrati in tab.~\ref{tab:proc_uid_gid}, si @@ -1129,15 +1116,14 @@ operazioni si rimanda alla rilettura di sez.~\ref{sec:process_prctl}. % http://lwn.net/Articles/211883/ -Un elenco delle delle \textit{capabilities} disponibili su Linux, con una -breve descrizione ed il nome delle costanti che le identificano, è riportato -in tab.~\ref{tab:proc_capabilities};\footnote{l'elenco presentato questa - tabella, ripreso dalla pagina di manuale (accessibile con \texttt{man - capabilities}) e dalle definizioni in - \texttt{include/linux/capabilities.h}, è aggiornato al kernel 3.2.} la -tabella è divisa in due parti, la prima riporta le \textit{capabilities} -previste anche nella bozza dello standard POSIX1.e, la seconda quelle -specifiche di Linux. Come si può notare dalla tabella alcune +Un elenco delle \textit{capabilities} disponibili su Linux, con una breve +descrizione ed il nome delle costanti che le identificano, è riportato in +tab.~\ref{tab:proc_capabilities};\footnote{l'elenco presentato questa tabella, + ripreso dalla pagina di manuale (accessibile con \texttt{man capabilities}) + e dalle definizioni in \texttt{include/linux/capabilities.h}, è aggiornato + al kernel 3.2.} la tabella è divisa in due parti, la prima riporta le +\textit{capabilities} previste anche nella bozza dello standard POSIX1.e, la +seconda quelle specifiche di Linux. Come si può notare dalla tabella alcune \textit{capabilities} attengono a singole funzionalità e sono molto specializzate, mentre altre hanno un campo di applicazione molto vasto, che è opportuno dettagliare maggiormente. @@ -1333,7 +1319,7 @@ sez.~\ref{sec:sock_ioctl_netdevice}) ed impostare la tabella di instradamento. Una terza \textit{capability} con vasto campo di applicazione è \const{CAP\_SYS\_ADMIN}, che copre una serie di operazioni amministrative, come impostare le quote disco (vedi sez.\ref{sec:disk_quota}), attivare e -disattivare la swap, montare, rimontare e smontare filesystem (vedi +disattivare la \textit{swap}, montare, rimontare e smontare filesystem (vedi sez.~\ref{sec:filesystem_mounting}), effettuare operazioni di controllo su qualunque oggetto dell'IPC di SysV (vedi sez.~\ref{sec:ipc_sysv}), operare sugli attributi estesi dei file di classe \texttt{security} o \texttt{trusted} @@ -2020,10 +2006,160 @@ funzione. +\subsection{La gestione del \textit{Secure Computing}.} +\label{sec:procadv_seccomp} + +\itindbeg{secure~computing~mode} + +Il \textit{secure computing mode} è un meccanismo ideato per fornire un +supporto per l'esecuzione di codice esterno non fidato e non verificabile a +scopo di calcolo. L'idea era quello di poter vendere la capacità di calcolo +della propria macchina ad un qualche servizio di calcolo distribuito, senza +comprometterne la sicurezza eseguendo codice non sotto il proprio controllo. + +Nella prima versione del meccanismo, introdotto con il kernel 2.6.23 e +disponibile solo avendo è abilitato il supporto nel kernel con +\texttt{CONFIG\_SECCOMP}, questo veniva attivato con \func{prctl} indicando +l'opzione \const{PR\_SET\_SECCOMP}, che all'epoca supportava soltanto l'uso +del valore \const{SECCOMP\_MODE\_STRICT} per \param{arg2}. + +Una volta abilitato il \textit{secure computing mode} in questa modalità (in +seguito denominata \textit{strict mode}) il processo o il \textit{thread} +chiamante potrà utilizzare soltanto un insieme estremamente limitato di +\textit{system call}: \func{read}, \func{write}, \func{\_exit} e +\funcm{sigreturn}. Ogni altra \textit{system call} porterà all'emissione di un +\signal{SIGKILL} (vedi sez.~\ref{sec:sig_termination}). In questa modalità di +utilizzo i dati vengono letti o scritti grazie ad un socket o una +\textit{pipe}, creati prima di lanciare il processo che eseguirà il codice non +fidato, e per evitare problemi di sicurezza non saranno possibili altre +operazioni se non quelle citate. + + +% TODO a partire dal kernel 3.5 è stato introdotto la possibilità di usare un +% terzo argomento se il secondo è SECCOMP_MODE_FILTER, vedi +% Documentation/prctl/seccomp_filter.txt +% vedi anche http://lwn.net/Articles/600250/ + +% TODO documentare PR_SET_SECCOMP introdotto a partire dal kernel 3.5. Vedi: +% * Documentation/prctl/seccomp_filter.txt +% * http://lwn.net/Articles/475043/ + +% TODO a partire dal kernel 3.17 è stata introdotta la nuova syscall seccomp, +% vedi http://lwn.net/Articles/600250/ e http://lwn.net/Articles/603321/ + + +\itindend{secure~computing~mode} + +\subsection{Altre funzionalità di sicurezza.} +\label{sec:procadv_security_misc} + +Oltre alle funzionalità specifiche esaminate nelle sezioni precedenti, il +kernel supporta una varietà di ulteriori impostazioni di sicurezza, +accessibili nelle maniere più varie, che abbiamo raccolto in questa sezione. + +Una serie di modalità di sicurezza sono attivabili a richiesta attraverso +alcune opzioni di controllo attivabili via \func{sysctl} o il filesystem +\texttt{/proc}, un elenco delle stesse e dei loro effetti è il seguente: + +\begin{basedescript}{\desclabelwidth{1cm}\desclabelstyle{\nextlinelabel}} +\item[\sysctlrelfiled{fs}{protected\_hardlinks}] Un valore nullo, il default, + mantiene il comportamento standard che non pone restrizioni alla creazione + di \textit{hard link}. Se il valore viene posto ad 1 vengono invece attivate + una serie di restrizioni protettive, denominate + \itindex{protected~hardlinks} \textit{protected hardlinks}, che se non + soddisfatte causano il fallimento di \func{link} con un errore di + \errval{EPERM}. Perché questo non avvenga almeno una delle seguenti + condizioni deve essere soddisfatta: + \begin{itemize*} + \item il chiamante deve avere privilegi amministrativi (la + \textit{capability} \const{CAP\_FOWNER}). In caso di utilizzo + dell'\textit{user namespace} oltre a possedere \const{CAP\_FOWNER} è + necessario che l'\ids{UID} del proprietario del file sia mappato nel + \textit{namespace}. + \item il \textit{filesystem} \ids{UID} del chiamante (normalmente + equivalente all'\ids{UID} effettivo) deve corrispondere a quello del + proprietario del file a cui si vuole effettuare il collegamento. + \item devono essere soddisfatte tutte le seguenti condizioni: + \begin{itemize*} + \item il file è un file ordinario + \item il file non ha il \acr{suid} bit attivo + \item il file non ha lo \acr{sgid} bit attivo ed il permesso di esecuzione + per il gruppo + \item il chiamante ha i permessi di lettura e scrittura sul file + \end{itemize*} + \end{itemize*} + + In sostanza in questo caso un utente potrà creare un collegamento diretto ad + un altro file solo se ne è il proprietario o se questo è un file ordinario + senza permessi speciali ed a cui ha accesso in lettura e scrittura. + + Questa funzionalità fornisce una protezione generica che non inficia l'uso + ordinario di \func{link}, ma rende impraticabili una serie di possibili + abusi della stessa; oltre ad impedire l'uso di un \textit{hard link} come + variante in un attacco di \textit{symlink race} (eludendo i + \textit{protected symlinks} di cui al punto successivo), evita anche che si + possa lasciare un riferimento ad un eventuale programma \acr{suid} + vulnerabile, creando un collegamento diretto allo stesso. + + +\item[\sysctlrelfiled{fs}{protected\_symlinks}] Un valore nullo, il default, + mantiene il comportamento standard che non pone restrizioni nel seguire i + link simbolici. Se il valore viene posto ad 1 vengono attivate delle + restrizioni protettive, denominate \itindex{protected~symlinks} + \textit{protected symlinks}. Quando vengono attivate una qualunque funzione + che esegua la risoluzione di un \textit{pathname} contenente un link + simbolico non conforme alle restrizioni fallirà con un errore di + \errval{EACCESS}. Per evitare l'errore deve essere soddisfatta una delle + seguenti condizioni: + \begin{itemize*} + \item il link non è in una directory con permessi analoghi a \file{/tmp} + (scrivibile a tutti e con lo \textit{sticky bit} attivo); + \item il link è in una directory con permessi analoghi a \file{/tmp} ma è + soddisfatta una delle condizioni seguenti: + \begin{itemize*} + \item il link simbolico appartiene al chiamante: il controllo viene fatto + usando il \textit{filesystem} \ids{UID} (che normalmente corrisponde + all'\ids{UID} effettivo). + \item il link simbolico ha lo stesso proprietario della directory. + \end{itemize*} + \end{itemize*} + + Questa funzionalità consente di rendere impraticabili alcuni attacchi in cui + si approfitta di una differenza di tempo fra il controllo e l'uso di un + file, utilizzando quella che viene usualmente chiamata una + \itindex{symlink~race} \textit{symlink race}.\footnote{si tratta di un + sottoinsieme di quella classe di attacchi chiamata genericamente + \textit{TOCTTOU}, acronimo appunto di \textit{Time of check to time of + use}.} + + Un possibile esempio di questo tipo di attacco è quello contro un programma + che viene eseguito per conto di un utente privilegiato (ad esempio un + programma con il \acr{suid} o lo \acr{sgid} bit attivi) che prima controlla + l'esistenza di un file e se non esiste lo crea. Se questa procedura, che è + tipica della creazione di file temporanei sotto \file{/tmp}, non viene + eseguita in maniera corretta,\footnote{ad esempio con le modalità che + abbiamo trattato in sez.~\ref{sec:file_temp_file}, che per quanto note da + tempo continuano ad essere ignorate.} un attaccante ha una finestra di + tempo in cui può creare prima del programma un \textit{link simbolico} ad un + file di sua scelta, compresi file di dispositivo o file a cui non avrebbe + accesso, facendolo poi utilizzare al programma. + + Attivando la funzionalità si rende impossibile seguire un link simbolico in + una directory temporanea come \texttt{/tmp}, a meno che questo non sia di + proprietà del chiamante, o che questo non appartenga al proprietario della + directory. Questo impedisce che i link simbolici creati da un attaccante + possano essere seguiti da un programma privilegiato (perché apparterranno + all'attaccante) mentre quelli creati dall'amministratore (che i genere è il + proprietario di \texttt{/tmp}) saranno seguiti comunque. + +\end{basedescript} + % TODO: trattare keyctl (man 2 keyctl) + + % TODO trattare le funzioni di protezione della memoria pkey_alloc, pkey_free, % pkey_mprotect, introdotte con il kernel 4.8, vedi % http://lwn.net/Articles/689395/ e Documentation/x86/protection-keys.txt @@ -2095,3 +2231,40 @@ Da fare %%% mode: latex %%% TeX-master: "gapil" %%% End: + +% LocalWords: system call namespace prctl IRIX kernel sys int option long +% LocalWords: unsigned arg errno EACCESS EBADF EBUSY EFAULT EINVAL ENXIO PR +% LocalWords: EOPNOTSUPP EPERM CAPBSET READ capability sez tab capabilities +% LocalWords: bounding CAP SETPCAP DUMPABLE dump suid sgid UID DISABLE GET +% LocalWords: ENDIAN endianness BIG big endian LITTLE little PPC PowerPC ia +% LocalWords: FPEMU NOPRINT SIGFPE FPEXC point exception FP EXC SW ENABLE +% LocalWords: OVF overflow UND underflow RES INV DISABLED NONRECOV ASYNC AO +% LocalWords: KEEPCAPS pag exec SECURE KEEP CAPS securebits LOCKED NAME NUL +% LocalWords: char PDEATHSIG SIGCHLD fork PTRACER PID tracer process ptrace +% LocalWords: Security Modules ANY Yama SECCOMP secure computing seccomp vm +% LocalWords: STRICT strict FILTER filter SIGKILL TIMING STATISTICAL TSC fn +% LocalWords: TIMESTAMP timestamp Stamp Counter SIGSEGV UNALIGN SIGBUS MCE +% LocalWords: KILL siginfo MCEERR memory failure early kill CLEAR child cap +% LocalWords: reaper SUBREAPER init value result thread like flags stack FS +% LocalWords: race condition malloc NULL copy write glibc vsyscall sched RT +% LocalWords: void pid ptid struct desc tls ctid EAGAIN ENOMEM exit Posix +% LocalWords: Library PARENT SETTID SETTLS TID CLEARTID futex FILES table +% LocalWords: descriptor umask dell'I scheduler SIGHAND STOPPED SYSVSEM IPC +% LocalWords: UNTRACED VFORK vfork mount filesystem LSM Mandatory Access fs +% LocalWords: Control DAC MAC SELinux Smack Tomoyo AppArmor Discrectionary +% LocalWords: permitted inheritable effective fig security ADMIN forced new +% LocalWords: allowed dall' bound MODULE nell' all' capset sendmail SETGID +% LocalWords: setuid orig IMMUTABLE MKNOD OVERRIDE SEARCH CHOWN FSETID LOCK +% LocalWords: FOWNER saved FIXUP NOROOT AUDIT BLOCK SUSPEND SETFCAP group +% LocalWords: socket domain locking mlock mlockall shmctl mmap OWNER LEASE +% LocalWords: lease immutable append only mknod BIND SERVICE BROADCAST RAW +% LocalWords: broadcast multicast PACKET CHROOT chroot NICE PACCT RAWIO TTY +% LocalWords: accounting ioperm iopl RESOURCE CONFIG hangup vhangup SYSLOG +% LocalWords: WAKE ALARM CLOCK BOOTTIME REALTIME sticky NOATIME fcntl swap +% LocalWords: multicasting dell'IPC SysV trusted IOPRIO CLASS IDLE lookup +% LocalWords: scheduling dcookie NEWNS unshare nice NUMA ioctl journaling +% LocalWords: ext capget header hdrp datap const ESRCH SOURCE undef version +% LocalWords: libcap lcap obj to text dup clear DIFFERS get ncap caps ssize +% LocalWords: argument length all setpcap from string name proc cat capgetp +% LocalWords: capsetp getcap read sigreturn sysctl protected hardlinks tmp +% LocalWords: dell' symlink symlinks pathname TOCTTOU of