X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=prochand.tex;h=bd0cd21c848b4256530a6a3febca997e74b1d899;hp=f94d8635a377835f4d4ad56ff97437bc66bbb9d1;hb=bd6a0ffe99bfb70905408f576010faafb2502916;hpb=6f3f8c6f842c042e5f2660891c941cbf8082a50c diff --git a/prochand.tex b/prochand.tex index f94d863..bd0cd21 100644 --- a/prochand.tex +++ b/prochand.tex @@ -2060,7 +2060,7 @@ implementata.\footnote{per attualmente si intende fino al kernel 2.6.13, e \label{tab:proc_capabilities} \end{table} -\footnotetext[18]{questa capacità è presente soltato a partire dai kernel +\footnotetext[21]{questa capacità è presente soltato a partire dai kernel della serie 2.4.x.} \footnotetext{questa capacità è presente soltato a partire dai kernel della @@ -2089,21 +2089,20 @@ 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è quelle che vengono effettivamente usate dal - kernel per eseguire il controllo di accesso per le operazioni compiute dal - processo. + ``\textsl{effettive}'', cioè di quelle che vengono effettivamente usate 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 che un processo \textsl{può} - impostare come \textsl{effettive} se ha la capacità \const{CAP\_SETPCAP}. Se - un processo cancella una capacità da questo insieme non potrà più - riassumerla (almeno che non esegua un programma che è \acr{suid} di root). + ``\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). \item[\textit{inherited}] l'insieme delle \textit{capabilities} - \textsl{ereditate}, cioè quelle che vengono trasmesse ad un nuovo programma - eseguito attraverso una chiamata ad \func{exec} (con l'eccezione del caso - che questo sia \acr{suid} di root). + ``\textsl{ereditate}'', cioè quelle che vengono trasmesse ad un nuovo + programma eseguito attraverso una chiamata ad \func{exec} (con l'eccezione + del caso che questo sia \acr{suid} di root). \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 @@ -2121,21 +2120,75 @@ 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 può al più rimuovere uno dei bit -dell'insieme: questo significa che una volta rimossa da esso una -\textit{capability} essa non sarà più disponibile, neanche per -l'amministratore, a meno di un riavvio. - +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. -Quando viene messo in esecuzione (con \func{exec}) un processo eredita le +Quando viene messo in esecuzione (con \func{exec}) un processo eredita (nel +senso che assume negli insiemi \textit{effective} e \textit{permitted}) le \textit{capabilities} mantenute nell'insieme \textit{inherited}, a meno che non sia eseguito un programma \acr{suid} di root o la \func{exec} sia stata eseguita da un programma con \textsl{uid} reale zero; in tal caso il programma ottiene tutte le \textit{capabilities} presenti nel \textit{capabilities - bounding set}. + bounding set}. In questo modo si può far si che ad un processo eseguito in +un secondo tempo possano essere trasmesse solo un insieme limitato di +capacità, impedendogli di recuperare quelle assenti nell'insieme +\textit{inherited}. Si tenga presente invece che attraverso una \func{fork} +vengono mantenute le stesse capacità del processo padre. + +Per la gestione delle \textit{capabilities} Linux usa due funzioni, +\funcd{capget} e \funcd{capset}, che permettono rispettivamente di leggerne ed +impostarne i valori, i cui rispettivi prototipi sono: +\begin{functions} + \headdecl{sys/capability.h} + + \funcdecl{int capget(cap\_user\_header\_t hdrp, cap\_user\_data\_t datap)} + Legge le \textit{capabilities}. + + \funcdecl{int capset(cap\_user\_header\_t hdrp, const cap\_user\_data\_t + datap)} + Imposta le \textit{capabilities}. + + + \bodydesc{Entrambe le funzioni ritornano 0 in caso di successo e -1 in caso + di errore, nel qual caso \var{errno} può assumere i valori: + \begin{errlist} + \item[\errcode{ESRCH}] si è fatto riferimento ad un processo inesistente. + \item[\errcode{EPERM}] si è tentato di aggiungere una capacità + nell'insieme delle \textit{capabilities} permesse, o di impostare una + capacità non presente nell'insieme di quelle permesse negli insieme + delle effettive o ereditate, o si è cercato di impostare una + \textit{capability} di un altro processo senza avare + \const{CAP\_SETPCAP}. + \end{errlist} + ed inoltre \errval{EFAULT} ed \errval{EINVAL}} +\end{functions} + +Queste due funzioni costituiscono una interfaccia di basso livello, ed usano +due strutture specifiche di Linux, la cui definizione è riportata in +fig.~\ref{fig:cap_kernel_struct}. Queste ultime, come le due funzioni +precedenti, sono soggette ad essere modificate con il cambiamento del kernel +(in particolare i tipi di dati delle strutture) ed anche se finora +l'interfaccia è risultata stabile, + +\begin{figure}[!htb] + \footnotesize + \centering + \begin{minipage}[c]{15cm} + \includestruct{listati/tms.h} + \end{minipage} + \normalsize + \caption{Le strutture specifiche di Linux per l'interfaccia di gestione di + basso livello delle \textit{capabilities}.} + \label{fig:cap_kernel_struct} +\end{figure} +sono definite in una apposita struttura del kernel, +Per la gestione delle \textit{capabilities} lo standard POSIX.1e prevede l'uso +di uno specifico tipo di dato \type{cap\_t}, che