Trattato PR_SET_PTRACER.
authorSimone Piccardi <piccardi@gnulinux.it>
Sat, 18 Aug 2018 16:57:36 +0000 (18:57 +0200)
committerSimone Piccardi <piccardi@gnulinux.it>
Sat, 18 Aug 2018 16:57:36 +0000 (18:57 +0200)
prochand.tex

index 16c51de94a0fd6fb69ff199b94eeaf5a0d346948..1fade9b8caad340176687a7ab925ed3df55084ad 100644 (file)
@@ -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/