Analizziamo il flusso dei dati riservati. In questa analisi, si capisce che qualsiasi cosa che Alice può fare, può fare anche root. Anche un osservatore esterno "un livello su" (ad esempio con accesso fisico allo snoop sul bus del disco o nell'hypervisor se il codice è in esecuzione nella macchina virtuale) potrebbe essere in grado di accedere ai dati.
Innanzitutto, i dati vengono caricati da un file. Supponendo che solo Alice abbia il permesso di lettura sul file e che il file non sia altrimenti trapelato, solo Alice può chiamare con successo cat /home/alice/fav_food.txt
. I dati sono quindi nella memoria del processo cat
, in cui solo quel processo può accedervi. I dati vengono trasmessi su una pipe dal comando cat
alla shell chiamante; solo i due processi coinvolti possono vedere i dati sul tubo. I dati sono quindi nella memoria del processo di shell, di nuovo privato di quel processo.
Ad un certo punto, i dati finiranno nell'ambiente della shell. A seconda della shell, ciò può accadere quando viene eseguita l'istruzione export
o solo quando la shell esegue un programma esterno. A questo punto, i dati saranno un argomento di una chiamata di sistema execve
. Dopo quella chiamata, i dati saranno nell'ambiente del processo figlio.
L'ambiente di un processo è altrettanto privato, come il resto di memoria che di processo (da mm->env_start
a mm->env_end
nella mappa della memoria del processo). È contiguo con lo stack del thread iniziale . Tuttavia, v'è uno speciale meccanismo che consente ad altri processi di visualizzare una copia dell'ambiente: il file environ
nel processo di /proc
directory ( /proc/$pid/environ
). Questo file è leggibile solo dal proprietario , che è l'utente che esegue il processo (per un processo privilegiato, questo è l'UID efficace ). (Si noti che gli argomenti della riga di comando in /proc/$pid/cmdline
, d'altra parte, sono leggibili da tutti). È possibile controllare l'origine del kernel per verificare che questo sia l'unico modo per divulgare l'ambiente di un processo.
C'è un'altra fonte potenziale di perdite l'ambiente: durante la chiamata execve
. La chiamata di sistema execve
non perde direttamente l'ambiente. Tuttavia, esiste un generico meccanismo di controllo che può registrare gli argomenti di ogni chiamata di sistema , incluso execve
. Quindi, se il controllo è abilitato, l'ambiente può essere inviato tramite il meccanismo di controllo e finisce in un file di registro. Su un sistema decentemente configurato, solo l'amministratore ha accesso al file di log (sulla mia installazione predefinita di Debian, è /var/log/audit/audit.log
, leggibili solo da root, e scritto da parte del% daemon% co_de esecuzione come root).
Ho mentito sopra: ho scritto che la memoria di un processo non può essere letta da un altro processo. Questo in realtà non è vero: come tutti gli unices, Linux implementa la auditd
chiamata di sistema. Questa chiamata di sistema consente a un processo di ispezionare la memoria e persino eseguire codice nel contesto di un altro processo. È ciò che consente ai debugger di esistere. Solo Alice può tracciare i processi di Alice. Inoltre, se un processo è privilegiato (setuid o setgid), solo root può tracciarlo.
Conclusione: l'ambiente di un processo è disponibile solo per l'utente (euid) che esegue il processo .
Si noti che presumo che non ci siano altri processi che potrebbero far trapelare i dati. Non esiste un programma root setuid su una normale installazione Linux che potrebbe esporre l'ambiente di un processo. (Su alcuni sistemi UNIX più vecchi, ptrace
era un programma setuid root che analizzato alcuni memoria del kernel; alcune varianti sarebbero felicemente visualizzare l'ambiente di un processo per ogni e qualsiasi Su Linux, ps
è senza privilegi e ottiene i dati da ps
come. tutti gli altri.).
(Si noti che questo si applica alle versioni ragionevolmente attuali di Linux: molto tempo fa, penso che nei giorni del kernel 1.x, l'ambiente era leggibile da tutti.)