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 è privato come il resto della memoria di quel processo (da mm->env_start
a mm->env_end
nella mappa della memoria del processo). È contiguo con lo stack del thread iniziale . Tuttavia, esiste un meccanismo speciale che consente ad altri processi di visualizzare una copia dell'ambiente: il file environ
nel processo /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.
Esiste un'altra potenziale fonte di fuga dell'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 configurato correttamente, solo l'amministratore ha accesso al file di log (sulla mia installazione Debian predefinita, è /var/log/audit/audit.log
, leggibile solo da root e scritto dal demone auditd
in 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 ptrace
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 vecchi unic, ps
era un programma root setuid che analizzava la memoria del kernel, alcune varianti mostrerebbero felicemente l'ambiente di un processo a chiunque. Su Linux, ps
non ha alcun privilegio e ottiene i suoi dati da /proc
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.)