X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=procadv.tex;h=2859e8b0f6529864d8c424edae9e385e6e23874a;hp=7c88a71d883bd1038953039c64d47cdf17c3d9f6;hb=dc4eaddc9bad8eca47e81b003fefeccaa3372f48;hpb=3b0a632d62b0b9135a101007f0b66a67d433c1b8 diff --git a/procadv.tex b/procadv.tex index 7c88a71..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 @@ -225,11 +225,11 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC. \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 ulteriorimente estesa con il kernel 3.5, salvo poi diventare un + è 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 cosidetto \textit{strict mode} o, dal kernel 3.5, + 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}. @@ -414,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}} @@ -705,7 +705,7 @@ 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 funzionalita disponibili su questo argomento. +estensioni e funzionalità disponibili su questo argomento. @@ -1319,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} @@ -2019,7 +2019,7 @@ 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 attovato con \func{prctl} indicando +\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}. @@ -2053,7 +2053,7 @@ operazioni se non quelle citate. \subsection{Altre funzionalità di sicurezza.} \label{sec:procadv_security_misc} -Oltre alle funzionalità specifiche esaminite nelle sezioni precedenti, il +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. @@ -2061,23 +2061,25 @@ 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{2.2cm}\desclabelstyle{\nextlinelabel}} +\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, 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: + 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 processo chiamante deve avere i privilegi amministrativi (la - \textit{capability}) \const{CAP\_FOWNER}); in caso di utilizzo + \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 sono soddistatte tutte le seguenti condizioni: + \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 @@ -2086,6 +2088,70 @@ alcune opzioni di controllo attivabili via \func{sysctl} o il filesystem \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} @@ -2165,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