From: Simone Piccardi Date: Fri, 26 Oct 2001 17:53:16 +0000 (+0000) Subject: Sistemate setreuid e setresuid X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=commitdiff_plain;h=83de30b430dcc90d2c7799d461974353343caadd;p=gapil.git Sistemate setreuid e setresuid --- diff --git a/prochand.tex b/prochand.tex index 9eb7912..def3864 100644 --- a/prochand.tex +++ b/prochand.tex @@ -1360,8 +1360,11 @@ servano di nuovo. Questo in Linux viene fatto usando altri due gruppi di identificatori, il \textit{saved} ed il \textit{filesystem}, analoghi ai precedenti. Il primo gruppo è lo stesso usato in SVr4, e previsto dallo standard POSIX quando è -definita la costante \macro{\_POSIX\_SAVED\_IDS}, il secondo gruppo è -specifico di Linux e viene usato per migliorare la sicurezza con NFS. +definita la costante \macro{\_POSIX\_SAVED\_IDS}\footnote{in caso si abbia a + cuore la portabilità del programma su altri unix è buona norma controllare + sempre la disponibilità di queste funzioni controllando se questa costante è + definita}, il secondo gruppo è specifico di Linux e viene usato per +migliorare la sicurezza con NFS. Il \textit{saved user id} e il \textit{saved group id} sono copie dell'\textit{effective user id} e dell'\textit{effective group id} del @@ -1478,14 +1481,14 @@ avr \end{eqnarray*} consentendo l'accesso a \file{/var/log/utmp}. -Occorre però tenere conto che tutto questo non è possibile con root, in tal -caso infatti l'esecuzione una \func{setuid} comporta il cambiamento di tutti -gli identificatori associati al processo rendendo impossibile riguadagnare i -privilegi di amministratore. Questo comportamento è corretto per l'uso che ne -fa \cmd{login} una volta che crea una nuova shell per l'utente; ma quando si -vuole cambiare soltanto l'\textit{effective user id} del processo per cedere i -privilegi occorre ricorrere ad altre funzioni (si veda ad esempio -\secref{sec:proc_seteuid}). +Occorre però tenere conto che tutto questo non è possibile con un processo con +i privilegi di root, in tal caso infatti l'esecuzione una \func{setuid} +comporta il cambiamento di tutti gli identificatori associati al processo, +rendendo impossibile riguadagnare i privilegi di amministratore. Questo +comportamento è corretto per l'uso che ne fa \cmd{login} una volta che crea +una nuova shell per l'utente; ma quando si vuole cambiare soltanto +l'\textit{effective user id} del processo per cedere i privilegi occorre +ricorrere ad altre funzioni (si veda ad esempio \secref{sec:proc_seteuid}). \subsection{Le funzioni \func{setreuid} e \func{setresuid}} @@ -1512,11 +1515,13 @@ Le funzioni restituiscono 0 in caso di successo e -1 in caso di fallimento: l'unico errore possibile è \macro{EPERM}. \end{functions} -Gli utenti normali possono settare gli identificatori soltanto ai valori del -loro \textit{effective id} o \textit{real id}, valori diversi comportano il -fallimento della chiamata; l'amministratore invece può specificare un valore -qualunque. Specificando -1 come valore l'identificatore corrispondente viene -lasciato inalterato. +I processi non privileguiati possono settare i \textit{real id} soltanto ai +valori dei loro \textit{effective id} o \textit{real id} e gli +\textit{effective id} ai valori dei loro \textit{real id}, \textit{effective + id} o \textit{saved id}; valori diversi comportano il fallimento della +chiamata; l'amministratore invece può specificare un valore qualunque. +Specificando un valore di -1 l'identificatore corrispondente viene lasciato +inalterato. Con queste funzione si possono scambiare fra loro \textit{real id} e \textit{effective id}, e pertanto è possibile implementare un comportamento @@ -1525,41 +1530,21 @@ un primo scambio, e recuperandoli, eseguito il lavoro non privilegiato, con un secondo scambio. In questo caso però occorre porre molta attenzione quando si creano nuovi -processi nella fase intermedia, questi infatti avranno un \textit{real id} -privilegiato, che dovrà essere esplicitamente eliminato prima di porre in -esecuzione un nuovo processo, che altrimenti potrebbero riottenere detti -privilegi. - -Come accennato le funzioni derivano da un'implementazione che non prevedeva la -presenza di \textit{saved id}, per evitare che questo possa essere -riutilizzato nella fase intermedia per recuperare un \textit{effective id} -(privilegiato) originale, tutte le volte che uno degli identificatori viene -modificato da una di queste funzioni, il \textit{saved id} viene sempre -settato al nuovo valore che viene ad assumere l'\textit{effective id}. - - -\subsection{Le funzioni \func{seteuid} e \func{setegid}} -\label{sec:proc_seteuid} - -Queste funzioni sono un'estensione allo standard POSIX.1 (ma sono comunque -supportate dalla maggior parte degli unix) usate per cambiare gli -\textit{effective id}; i loro prototipi sono: - -\begin{functions} -\headdecl{unistd.h} -\headdecl{sys/types.h} - -\funcdecl{int seteuid(uid\_t uid)} setta l'\textit{effective user ID} del -processo corrente. - -\funcdecl{int setegid(gid\_t gid)} setta l'\textit{effective group ID} del -processo corrente. - -Le funzioni restituiscono 0 in caso di successo e -1 in caso di fallimento: -l'unico errore possibile è \macro{EPERM}. -\end{functions} - - +processi nella fase intermedia in cui si sono scambiati gli identificatori, in +questo caso infatti essi avranno un \textit{real id} privilegiato, che dovrà +essere esplicitamente eliminato prima di porre in esecuzione un nuovo +programma (occorrerà cioè eseguire un'altra chiamata dopo la \func{fork}, e +prima della \func{exec} per uniformare i \textit{real id} agli +\textit{effective id}) in caso contrario quest'ultimo potrebbe a sua volta +effettuare uno scambio e riottenere privilegi non previsti. + +Lo stesso problema di propagazione dei privilegi ad eventuali processi figli +si porrebbe per i \textit{saved id}. Queste funzioni derivano da +un'implementazione che non ne prevede la presenza, e quindi non è possibile +usarle per correggere la situazione come nel caso precedente, per questo +motivo tutte le volte che uno degli identificatori viene modificato ad un +valore diverso dal precedente \textit{real id}, il \textit{saved id} viene +sempre settato al valore dell'\textit{effective id}. \subsection{Le funzioni \func{setresuid} e \func{setresgid}} @@ -1587,6 +1572,38 @@ Le funzioni restituiscono 0 in caso di successo e -1 in caso di fallimento: l'unico errore possibile è \macro{EPERM}. \end{functions} +I processi non privilegiati possono cambiare uno qualunque degli +identificatori usando uno qualunque dei valori correnti di \textit{real id}, +\textit{effective id} o \textit{saved id}, l'ammnistratore può specificare i +valori che vuole; un valore di -1 per un qualunque parametro lascia inalterato +l'dentificatore corrispondente. + +\subsection{Le funzioni \func{seteuid} e \func{setegid}} +\label{sec:proc_seteuid} + +Queste funzioni sono un'estensione allo standard POSIX.1 (ma sono comunque +supportate dalla maggior parte degli unix) e usate per cambiare gli +\textit{effective id}; i loro prototipi sono: + +\begin{functions} +\headdecl{unistd.h} +\headdecl{sys/types.h} + +\funcdecl{int seteuid(uid\_t uid)} setta l'\textit{effective user ID} del +processo corrente. + +\funcdecl{int setegid(gid\_t gid)} setta l'\textit{effective group ID} del +processo corrente. + +Le funzioni restituiscono 0 in caso di successo e -1 in caso di fallimento: +l'unico errore possibile è \macro{EPERM}. +\end{functions} + +Gli utenti normali possono settare l'\textit{effective id} solo al valore del +\textit{real id} o del \textit{saved id}, l'amministratore può specificare +qualunque valore. + + \subsection{Le funzioni \func{setfsuid} e \func{setfsgid}} \label{sec:proc_setfsuid}