Verfolgen wir den Fluss der vertraulichen Daten. In dieser Analyse wird verstanden, dass alles, was Alice kann, auch Root kann. Auch ein externer Beobachter „eine Ebene höher“ (z. B. mit physischem Zugriff auf Snoop auf dem Festplattenbus oder im Hypervisor, wenn der Code in der virtuellen Maschine ausgeführt wird) kann möglicherweise auf die Daten zugreifen.
Zunächst werden die Daten aus einer Datei geladen. Angenommen, nur Alice hat Leseberechtigung für die Datei und die Datei ist nicht anderweitig durchgesickert, kann nur Alice cat /home/alice/fav_food.txt
erfolgreich aufrufen. Die Daten befinden sich dann im Speicher des Prozesses cat
, auf den nur dieser Prozess zugreifen kann. Die Daten werden über eine Pipe vom Befehl cat
an die aufrufende Shell übertragen. Nur die beiden beteiligten Prozesse können die Daten auf der Pipe sehen. Die Daten befinden sich dann im Speicher des Shell-Prozesses, wieder privat für diesen Prozess.
Irgendwann landen die Daten in der Shell-Umgebung. Abhängig von der Shell kann dies passieren, wenn die Anweisung export
ausgeführt wird oder nur, wenn die Shell ein externes Programm ausführt. Zu diesem Zeitpunkt sind die Daten ein Argument für einen Systemaufruf execve
. Nach diesem Aufruf befinden sich die Daten in der Umgebung des untergeordneten Prozesses.
Die Umgebung eines Prozesses ist genauso privat wie der Rest des Speichers dieses Prozesses (von mm->env_start
bis mm->env_end
in die Speicherzuordnung des Prozesses). Es ist zusammenhängend mit dem Stapel des ursprünglichen Threads. Es gibt jedoch einen speziellen Mechanismus, mit dem andere Prozesse eine Kopie der Umgebung anzeigen können: die Datei environ
im Verzeichnis / proc
( / proc / $ pid / environ
). Diese Datei kann nur von ihrem Eigentümer gelesen werden, der der Benutzer ist, der den Prozess ausführt (für einen privilegierten Prozess ist dies die effektive UID). (Beachten Sie, dass die Befehlszeilenargumente in / proc / $ pid / cmdline
andererseits für alle lesbar sind.) Sie können die Kernelquelle überprüfen, um sicherzustellen, dass dies der einzige Weg ist, ein Leck zu verursachen die Umgebung eines Prozesses.
Es gibt eine weitere mögliche Quelle für das Auslaufen der Umgebung: während des Aufrufs
ausführen. Der Systemaufruf execve
leckt die Umgebung nicht direkt. Es gibt jedoch einen generischen Prüfmechanismus, der die Argumente jedes Systemaufrufs protokollieren kann, einschließlich execve
. Wenn also die Überwachung aktiviert ist, kann die Umgebung über den Überwachungsmechanismus gesendet werden und in einer Protokolldatei landen. Auf einem anständig konfigurierten System hat nur der Administrator Zugriff auf die Protokolldatei (bei meiner Standard-Debian-Installation ist es /var/log/audit/audit.log
, nur von root lesbar und von geschrieben der Daemon auditd
, der als root ausgeführt wird).
Ich habe oben gelogen: Ich habe geschrieben, dass der Speicher eines Prozesses nicht von einem anderen Prozess gelesen werden kann. Dies ist in der Tat nicht wahr: Wie alle Unices implementiert Linux den Systemaufruf ptrace
. Dieser Systemaufruf ermöglicht es einem Prozess, den Speicher zu überprüfen und sogar Code im Kontext eines anderen Prozesses auszuführen. Dadurch können Debugger existieren. Nur Alice kann Alices Prozesse verfolgen. Wenn ein Prozess privilegiert ist (setuid oder setgid), kann ihn nur root verfolgen.
Schlussfolgerung: Die Umgebung eines Prozesses steht nur dem Benutzer (euid) zur Verfügung, der den Prozess ausführt. .
Beachten Sie, dass ich davon ausgehe, dass es keinen anderen Prozess gibt, der die Daten verlieren könnte. In einer normalen Linux-Installation gibt es kein setuid-Root-Programm, das die Umgebung eines Prozesses verfügbar machen könnte. (Auf einigen älteren Unices war ps
ein Setuid-Root-Programm, das den Kernelspeicher analysierte. Einige Varianten zeigten die Umgebung eines Prozesses gerne allen an. Unter Linux ist ps
unprivilegiert und bezieht seine Daten wie alle anderen von / proc
.)
(Beachten Sie, dass dies für einigermaßen aktuelle Linux-Versionen gilt. Vor sehr langer Zeit denke ich in der 1.x Kerneltage war die Umgebung weltlesbar.)