From 0a1a6b29cbe72863a00e3d811b6da20e087bb5d1 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Sat, 18 Aug 2018 18:57:36 +0200 Subject: [PATCH] Trattato PR_SET_PTRACER. --- prochand.tex | 108 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 69 insertions(+), 39 deletions(-) diff --git a/prochand.tex b/prochand.tex index 16c51de..1fade9b 100644 --- a/prochand.tex +++ b/prochand.tex @@ -3473,12 +3473,11 @@ l'accesso al singolo disco scrivendo nel file Gli \textit{scheduler} disponibili sono mostrati dal contenuto dello stesso file che riporta fra parentesi quadre quello attivo, il default in tutti i -kernel recenti è proprio il \texttt{cfq},\footnote{nome con cui si indica - appunto lo \textit{scheduler} CFQ.} che supporta le priorità. Per i dettagli -sulle caratteristiche specifiche degli altri \textit{scheduler}, la cui -discussione attiene a problematiche di ambito sistemistico, si consulti la -documentazione nella directory \texttt{Documentation/block/} dei sorgenti del -kernel. +kernel recenti è proprio il \texttt{cfq}, nome con cui si indica appunto lo +\textit{scheduler} CFQ, che supporta le priorità. Per i dettagli sulle +caratteristiche specifiche degli altri \textit{scheduler}, la cui discussione +attiene a problematiche di ambito sistemistico, si consulti la documentazione +nella directory \texttt{Documentation/block/} dei sorgenti del kernel. Una volta che si sia impostato lo \textit{scheduler} CFQ ci sono due specifiche \textit{system call}, specifiche di Linux, che consentono di @@ -3513,11 +3512,11 @@ rispettivi prototipi sono: Le funzioni leggono o impostano la priorità di I/O sulla base dell'indicazione dei due argomenti \param{which} e \param{who} che hanno lo stesso significato già visto per gli omonimi argomenti di \func{getpriority} e -\func{setpriority}. Anche in questo caso si deve specificare il valore -di \param{which} tramite le opportune costanti riportate in +\func{setpriority}. Anche in questo caso si deve specificare il valore di +\param{which} tramite le opportune costanti riportate in tab.~\ref{tab:ioprio_args} che consentono di indicare un singolo processo, i -processi di un \textit{process group} (tratteremo questo argomento in -sez.~\ref{sec:sess_proc_group}) o tutti i processi di un utente. +processi di un \textit{process group} (vedi sez.~\ref{sec:sess_proc_group}) o +tutti i processi di un utente. \begin{table}[htb] \centering @@ -3584,6 +3583,12 @@ da \func{ioprio\_get} e per ottenere rispettivamente la classe di macro viene invece usata per creare un valore di priorità da usare come argomento di \func{ioprio\_set} per eseguire una impostazione. +Le classi di \textit{scheduling} previste dallo \textit{scheduler} CFQ sono +tre, e ricalcano tre diverse modalità di distribuzione delle risorse, analoghe +a quelle già adottate anche nel funzionamento dello \textit{scheduler} del +processore. Ciascuna di esse è identificata tramite una opportuna costante, +secondo quanto riportato in tab.~\ref{tab:IOsched_class}. + \begin{table}[htb] \centering \footnotesize @@ -3603,12 +3608,6 @@ argomento di \func{ioprio\_set} per eseguire una impostazione. \label{tab:IOsched_class} \end{table} -Le classi di \textit{scheduling} previste dallo \textit{scheduler} CFQ sono -tre, e ricalcano tre diverse modalità di distribuzione delle risorse analoghe -a quelle già adottate anche nel funzionamento dello \textit{scheduler} del -processore. Ciascuna di esse è identificata tramite una opportuna costante, -secondo quanto riportato in tab.~\ref{tab:IOsched_class}. - La classe di priorità più bassa è \constd{IOPRIO\_CLASS\_IDLE}; i processi in questa classe riescono ad accedere a disco soltanto quando nessun altro processo richiede l'accesso. Occorre pertanto usarla con molta attenzione, @@ -3616,10 +3615,10 @@ perché un processo in questa classe può venire completamente bloccato quando ci sono altri processi in una qualunque delle altre due classi che stanno accedendo al disco. Quando si usa questa classe non ha senso indicare un valore di priorità, dato che in questo caso non esiste nessuna gerarchia e la -priorità è identica, la minima possibile, per tutti i processi. +priorità è identica, la minima possibile, per tutti i processi che la usano. La seconda classe di priorità di I/O è \constd{IOPRIO\_CLASS\_BE} (il nome sta -per \textit{best-effort}) che è quella usata ordinariamente da tutti +per \textit{best-effort}), che è quella usata ordinariamente da tutti processi. In questo caso esistono priorità diverse che consentono di assegnazione di una maggiore banda passante nell'accesso a disco ad un processo rispetto agli altri, con meccanismo simile a quello dei valori di @@ -3627,8 +3626,7 @@ processo rispetto agli altri, con meccanismo simile a quello dei valori di bloccare indefinitamente quelli a priorità più bassa. In questo caso però le diverse priorità sono soltanto otto, indicate da un valore numerico fra 0 e 7 e come per \textit{nice} anche in questo caso un valore più basso indica una -priorità maggiore. - +priorità maggiore. Infine la classe di priorità di I/O \textit{real-time} \constd{IOPRIO\_CLASS\_RT} ricalca le omonime priorità di processore: un @@ -3691,20 +3689,31 @@ funzione di sistema è \funcd{prctl} ed il suo prototipo è:\footnote{la \phantom{int prctl(}unsigned long arg5)} \fdesc{Esegue una operazione speciale sul processo corrente.} } + {La funzione ritorna $0$ o un valore positivo dipendente dall'operazione in caso di successo e $-1$ per un errore, nel qual caso \var{errno} assumerà - valori diversi a seconda del tipo di operazione richiesta (in genere - \errval{EINVAL} o \errval{EPERM}).} + valori diversi a seconda del tipo di operazione richiesta, sono possibili: + \errval{EACCESS}, \errval{EBADF}, \errval{EBUSY}, \errval{EFAULT}, + \errval{EINVAL}, \errval{ENXIO}, \errval{EOPNOTSUPP} o \errval{EPERM}.} \end{funcproto} -La funzione ritorna un valore nullo o positivo in caso di successo e $-1$ in -caso di errore; il significato degli argomenti della funzione successivi al +La funzione ritorna in caso di successo un valore nullo o positivo, e $-1$ in +caso di errore. Il significato degli argomenti della funzione successivi al primo, il valore di ritorno in caso di successo, il tipo di errore restituito in \var{errno} dipendono dall'operazione eseguita, indicata tramite il primo argomento, \param{option}. Questo è un valore intero che identifica l'operazione, e deve essere specificato con l'uso di una delle costanti -predefinite del seguente elenco, che illustra quelle disponibili al -momento:\footnote{alla stesura di questa sezione, cioè con il kernel 3.2.} +predefinite del seguente elenco.\footnote{l'elenco potrebbe non risultare + aggiornato, in quanto nuove operazioni vengono aggiunte nello sviluppo del + kernel.} Tratteremo esplicitamente per ciascuna di esse il significato del +il valore di ritorno in caso di successo, ma solo quando non corrisponde +all'ordinario valore nullo (dato per implicito). + +%TODO: trattare PR_CAP_AMBIENT, dal 4.3 +%TODO: trattare PR_CAP_FP_*, dal 4.0, solo per MIPS +%TODO: trattare PR_MPX_*_MANAGEMENT, dal 3.19 +%TODO: trattare PR_*NO_NEW_PRIVS, dal 3.5 +%TODO: trattare PR_SET_PTRACER, dal 3.4 \begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}} \item[\constd{PR\_CAPBSET\_READ}] Controlla la disponibilità di una delle @@ -3740,13 +3749,16 @@ momento:\footnote{alla stesura di questa sezione, cioè con il kernel 3.2.} L'operazione è stata introdotta a partire dal kernel 2.3.20, fino al kernel 2.6.12 e per i kernel successivi al 2.6.17 era possibile usare solo un - valore 0 di \param{arg2} per disattivare il flag ed un valore 1 per - attivarlo. Nei kernel dal 2.6.13 al 2.6.17 è stato supportato anche il - valore 2, che causava la generazione di un \textit{core dump} leggibile solo - dall'amministratore, ma questa funzionalità è stata rimossa per motivi di - sicurezza, in quanto consentiva ad un utente normale di creare un file di - \textit{core dump} appartenente all'amministratore in directory dove - l'utente avrebbe avuto permessi di accesso. + valore 0 (espresso anche come \constd{SUID\_DUMP\_DISABLE}) di \param{arg2} + per disattivare il flag ed un valore 1 (espresso anche come + \constd{SUID\_DUMP\_USER}) per attivarlo. Nei kernel dal 2.6.13 al 2.6.17 è + stato supportato anche il valore 2, che causava la generazione di un + \textit{core dump} leggibile solo dall'amministratore, ma questa + funzionalità è stata rimossa per motivi di sicurezza, in quanto consentiva + ad un utente normale di creare un file di \textit{core dump} appartenente + all'amministratore in directory dove l'utente avrebbe avuto permessi di + accesso. Specificando un valore diverso da 0 o 1 si ottiene un errore di + \errval{EINVAL}. \item[\constd{PR\_GET\_DUMPABLE}] Ottiene come valore di ritorno della funzione lo stato corrente del flag che controlla la effettiva generazione dei @@ -3815,7 +3827,9 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC. L'uso di questo flag è stato sostituito, a partire dal kernel 2.6.26, dal flag \const{SECURE\_KEEP\_CAPS} dei \textit{securebits} (vedi sez.~\ref{sec:proc_capabilities} e l'uso di \const{PR\_SET\_SECUREBITS} più - avanti). Introdotta a partire dal kernel 2.2.18. + avanti) e si è impostato con essi \const{SECURE\_KEEP\_CAPS\_LOCKED} si + otterrà un errore di \errval{EPERM}. Introdotta a partire dal kernel + 2.2.18. \item[\constd{PR\_GET\_KEEPCAPS}] Ottiene come valore di ritorno della funzione il valore del flag di controllo delle \textit{capabilities} impostato con @@ -3844,6 +3858,22 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC. puntato \param{arg2}, che deve essere di tipo ``\ctyp{int *}''. Introdotta a partire dal kernel 2.3.15. +\item[\constd{PR\_SET\_PTRACER}] Imposta un \ids{PID} per il ``\textit{tracer + process}'' usando \param{arg2}. Una impostazione successiva sovrascrive la + precedente, ed un valore nullo cancella la disponibilità di un + ``\textit{tracer process}''. Questa è una funzionalità fornita da + \textit{``Yama''}, uno specifico \textit{Linux Security Modules}, e serve a + consentire al processo indicato, quando le restrioni introdotte da questo + modulo sono attive, di usare \func{ptrace}\unavref{ (vedi + sez.\ref{sec:process_ptrace})} sul processo chiamante, anche se quello + indicato non ne è un progenitore. Il valore \constd{PR\_SET\_PTRACER\_ANY} + consente a tutti i processi l'uso di \func{ptrace}. L'uso si \textit{Yama} + attiene alla gestione della sicurezza dei processi, e consente di introdurre + una restrizione all'uso di \func{ptrace}, che è spesso sorgente di + compromissioni. Si tratta di un uso specialistico che va al di là dello + 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à @@ -3868,6 +3898,10 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC. % 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/ @@ -3913,7 +3947,7 @@ 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} più avanti). Introdotta a partire dal kernel + \const{PR\_SET\_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 @@ -4012,10 +4046,6 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC. \itindend{child~reaper} -% TODO documentare PR_SET_SECCOMP introdotto a partire dal kernel 3.5. Vedi: -% * Documentation/prctl/seccomp_filter.txt -% * http://lwn.net/Articles/475043/ - % TODO documentare PR_MPX_INIT e PR_MPX_RELEASE, vedi % http://lwn.net/Articles/582712/ -- 2.30.2