From 516c47edf3aafae9e77eb5a78c26a87f72154314 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Fri, 12 Aug 2011 17:35:17 +0000 Subject: [PATCH] Inizio risistemazione delle capabilities. --- filedir.tex | 99 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 64 insertions(+), 35 deletions(-) diff --git a/filedir.tex b/filedir.tex index a9db2f9..8cd063d 100644 --- a/filedir.tex +++ b/filedir.tex @@ -4188,23 +4188,40 @@ Il meccanismo completo delle \textit{capabilities}\footnote{l'implementazione poi abbandonato.} prevede inoltre la possibilità di associare le stesse ai singoli file eseguibili, in modo da poter stabilire quali capacità possono essere utilizzate quando viene messo in esecuzione uno specifico programma; ma -il supporto per questa funzionalità è stato introdotto soltanto a partire dal -kernel 2.6.24; fino ad allora doveva essere il programma stesso ad eseguire -una riduzione esplicita delle sue capacità, cosa che ha reso l'uso di questa -funzionalità poco diffuso, vista la presenza di meccanismi alternativi come -\index{SELinux} SELinux. - -Per gestire questo meccanismo ciascun processo porta con sé tre distinti -insiemi di \textit{capabilities}, che vengono denominati rispettivamente -\textit{effective}, \textit{permitted} ed \textit{inherited}. Questi insiemi -vengono mantenuti in forma di tre diverse maschere binarie,\footnote{il kernel - li mantiene, come i vari identificatori di sez.~\ref{sec:proc_setuid}, - all'interno della \struct{task\_struct} di ciascun processo (vedi +il supporto per questa funzionalità, chiamata \textit{file capabilities}, è +stato introdotto soltanto a partire dal kernel 2.6.24. Fino ad allora doveva +essere il programma stesso ad eseguire una riduzione esplicita delle sue +capacità, cosa che ha reso l'uso di questa funzionalità poco diffuso, vista la +presenza di meccanismi alternativi per ottenere limitazioni delle capacità +dell'amministratore a livello di sistema operativo, come \index{SELinux} +SELinux. + +Inoltre il meccanismo delle \textit{capabilities} è stato ulteriormente +perfezionato nel kernel 2.6.25 rimovendo il significato che fino ad allora +aveva avuto la capacità \macro{CAP\_SETPCAP} e le modalità di funzionamento +del cosiddetto \itindex{capabilities~bounding~set} \textit{capabilities + bounding set}. Ulteriori modifiche sono state apportate con il kernel 2.6.26 +per consentire la rimozione non ripristinabile dei privilegi di +amministratore. Questo fa sì che il significato ed il comportamento del kernel +finisca per dipendere pesantemente dalla versione dello stesso e dal fatto che +le nuove \textit{file capabilities} siano abilitate o meno. Per capire meglio +la situazione e cosa è cambiato conviene allora spiegare con maggiori dettagli +come funziona il meccanismo delle \textit{capabilities}. + +Il primo passo per frazionare i privilegi garantiti all'amministratore, +supportato fin dalla introduzione iniziale del kernel 2.2, è stato quello in +cui a ciascun processo sono stati associati tre distinti insiemi di +\textit{capabilities}, denominati rispettivamente \textit{effective}, +\textit{permitted} ed \textit{inherited}. Questi insiemi vengono mantenuti in +forma di tre diverse maschere binarie,\footnote{il kernel li mantiene, come i + vari identificatori di sez.~\ref{sec:proc_setuid}, all'interno della + \struct{task\_struct} di ciascun processo (vedi fig.~\ref{fig:proc_task_struct}), nei tre campi \texttt{cap\_effective}, \texttt{cap\_inheritable}, \texttt{cap\_permitted} del tipo - \texttt{kernel\_cap\_t}; questo è attualmente definito come intero a 32 bit, - il che comporta un massimo di 32 \textit{capabilities} distinte.} in cui -ciascun bit corrisponde ad una capacità diversa. + \texttt{kernel\_cap\_t}; questo era, fino al kernel 2.6.25 definito come + intero a 32 bit per un massimo di 32 \textit{capabilities} distinte, + attualmente è stato aggiornato ad un vettore in grado di mantenerne fino a + 64.} in cui ciascun bit corrisponde ad una capacità diversa. L'utilizzo di tre distinti insiemi serve a fornire una interfaccia flessibile per l'uso delle \textit{capabilities}, con scopi analoghi a quelli per cui @@ -4212,14 +4229,16 @@ sono mantenuti i diversi insiemi di identificatori di sez.~\ref{sec:proc_setuid}; il loro significato è il seguente: \begin{basedescript}{\desclabelwidth{2.0cm}\desclabelstyle{\nextlinelabel}} \item[\textit{effective}] l'insieme delle \textit{capabilities} - ``\textsl{effettive}'', cioè di quelle che vengono effettivamente usate dal + ``\textsl{effettive}'', cioè di quelle che vengono effettivamente u-sate dal kernel quando deve eseguire il controllo di accesso per le varie operazioni compiute dal processo. \item[\textit{permitted}] l'insieme delle \textit{capabilities} ``\textsl{permesse}'', cioè l'insieme di quelle capacità che un processo \textsl{può} impostare come \textsl{effettive}. Se un processo cancella una capacità da questo insieme non potrà più riassumerla (almeno che non esegua - un programma che è \acr{suid} di root). + un programma che è \acr{suid} di root).\footnote{e neanche in questo caso se + vengono usate le estensioni introdotte con il kernel 2.6.26 che vedremo + più avanti.} \item[\textit{inherited}] l'insieme delle \textit{capabilities} ``\textsl{ereditabili}'', cioè quelle che vengono trasmesse ad un nuovo programma eseguito attraverso una chiamata ad \func{exec} (con l'eccezione @@ -4227,23 +4246,26 @@ sez.~\ref{sec:proc_setuid}; il loro significato è il seguente: \label{sec:capabilities_set} \end{basedescript} -Oltre a questi tre insiemi, che sono relativi al singolo processo, il kernel -mantiene un insieme generale valido per tutto il sistema, chiamato -\itindex{capabilities~bounding~set} \textit{capabilities bounding set}. Ogni -volta che un programma viene posto in esecuzione con \func{exec} il contenuto -degli insiemi \textit{effective} e \textit{permitted} vengono mascherati con -un \textsl{AND} binario del contenuto corrente del \textit{capabilities - bounding set}, così che il nuovo processo potrà disporre soltanto delle -capacità in esso elencate. - -Il \textit{capabilities bounding set} è un parametro di sistema, accessibile -attraverso il contenuto del file \procfile{/proc/sys/kernel/cap-bound}, che per -questa sua caratteristica consente di impostare un limite generale alle -capacità che possono essere accordate ai vari processi. Questo valore può + + + +Fino al kernel 2.6.25 oltre a questi tre insiemi, che sono relativi al singolo +processo, il kernel manteneva un insieme generale valido per tutto il sistema, +chiamato \itindex{capabilities~bounding~set} \textit{capabilities bounding + set}. Ogni volta che un programma viene posto in esecuzione con \func{exec} +il contenuto degli insiemi \textit{effective} e \textit{permitted} vengono +mascherati con un \textsl{AND} binario del contenuto corrente del +\textit{capabilities bounding set}, così che il nuovo processo potrà disporre +soltanto delle capacità in esso elencate. + +Il \textit{capabilities bounding set} era un parametro di sistema, accessibile +attraverso il contenuto del file \procfile{/proc/sys/kernel/cap-bound}, che +per questa sua caratteristica consentiva di impostare un limite generale alle +capacità che possono essere accordate ai vari processi. Questo valore poteva essere impostato ad un valore arbitrario esclusivamente dal primo processo eseguito nel sistema (di norma cioè da \texttt{/sbin/init}), ogni processo eseguito successivamente (cioè con \textsl{pid} diverso da 1) anche se -eseguito con privilegi di amministratore potrà soltanto rimuovere uno dei bit +eseguito con privilegi di amministratore poteva soltanto rimuovere uno dei bit già presenti dell'insieme: questo significa che una volta rimossa una \textit{capability} dal \textit{capabilities bounding set} essa non sarà più disponibile, neanche per l'amministratore, a meno di un riavvio. @@ -4377,9 +4399,12 @@ che è opportuno dettagliare maggiormente. \itindex{multicast} \textit{multicast}.\\ \const{CAP\_NET\_RAW} & La capacità di usare socket \texttt{RAW} e \texttt{PACKET} (vedi sez.~\ref{sec:sock_type}).\\ - \const{CAP\_SETPCAP} & La capacità di impostare o rimuovere una - capacità.\\ - % TODO cambiata nel 2.4.24 rc1 ? + \const{CAP\_SETPCAP} & Prima del 2.6.24 la capacità di impostare o + rimuovere le \textit{capabilities} da un + processo, dopo quella di impostare una capacità + del \textit{bounding set} nelle proprie + \textit{inheritable} o rimoverla dal + \textit{bounding set} stesso.\\ \const{CAP\_SYS\_ADMIN} & La capacità di eseguire una serie di compiti amministrativi. \\ \const{CAP\_SYS\_BOOT} & La capacità di fare eseguire un riavvio del @@ -4395,7 +4420,7 @@ che è opportuno dettagliare maggiormente. \const{CAP\_SYS\_MODULE}& La capacità di caricare e rimuovere moduli del kernel. \\ \const{CAP\_SYS\_NICE} & La capacità di modificare le priorità dei - processi. \\ + processi.\\ \const{CAP\_SYS\_PACCT} & La capacità di usare le funzioni di \textit{accounting} dei processi (vedi sez.~\ref{sec:sys_bsd_accounting}).\\ @@ -4416,6 +4441,10 @@ che è opportuno dettagliare maggiormente. del kernel, (vedi sez.~\ref{sec:sess_daemon}), introdotta dal kernel 2.6.38 come capacità separata da \const{CAP\_SYS\_ADMIN}.\\ + \const{CAP\_WAKE\_ALARM}& La capacità di usare i timer di tipo + \macro{CLOCK\_BOOTTIME\_ALARM} e + \macro{CLOCK\_REALTIME\_ALARM}, vedi + sez.~\ref{sec:sig_timer_adv} (dal kernel 3.0).\\ \hline \end{tabular} \caption{Le costanti che identificano le \textit{capabilities} presenti nel -- 2.30.2