Frage:
Zugänglichkeit von Umgebungsvariablen unter Linux
Yoav Aner
2012-04-20 22:47:40 UTC
view on stackexchange narkive permalink

Vielleicht ist dies eine triviale Frage, aber wie zugänglich sind Umgebungsvariablen unter Linux zwischen verschiedenen Benutzern?

z. Wenn Alice

  export FAVORITE_FOOD = `cat /home/alice/fav_food.txt`  

Kann Eve sagen, was Alice am liebsten isst? (Angenommen, Alice und Eve sind normale Benutzer und Eve hat keinen Lesezugriff auf /home/alice/fav_food.txt )

Fünf antworten:
Gilles 'SO- stop being evil'
2012-04-21 03:22:38 UTC
view on stackexchange narkive permalink

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.)

Tolle Antwort Gilles! Viel umfassender und detaillierter als ich erwartet hatte. Gut zu wissen, dass Umgebungsvariablen ziemlich sicher sind und wie (zumindest modern) Linux den Zugriff zwischen Konten trennt.
Ich möchte den Befehl hinzufügen, den ich unter Linux verwende, um die Umgebung eines anderen Prozesses (als Root oder gleicher Benutzer) anzuzeigen: xargs -0 -n1 / environ Ich finde ihn nützlich zum Debuggen.
logicalscope
2012-04-20 23:11:03 UTC
view on stackexchange narkive permalink

Ich wollte anfangs "nein" sagen. Umgebungsvariablenwerte gelten pro Benutzer und kein anderer Benutzer kann in die Umgebung eines anderen Benutzers lesen oder schreiben. vars. Es gibt jedoch einen interessanten Leckerbissen bei SO, der darauf hinweist, dass root diese Informationen zumindest über / proc / <pid> / environ lesen kann. Diese Linux-spezifische Schnittstelle war mir bisher nicht bekannt.

https://stackoverflow.com/a/532284/643314

Vor diesem Hintergrund Es sieht so aus, als ob diese Oberfläche für andere Benutzer immer noch nicht lesbar ist, selbst wenn sie sich in denselben Gruppen befinden. Die Berechtigungen für die Umgebungsdatei sind auf 400 festgelegt, und / proc verhindert, dass chmod sie beeinflusst. Ich vermute, dass die Sicherheitsdomäne für die Trennung von Umgebungsvariablen zwischen Benutzern noch intakt ist und nicht mit normalen Mitteln umgangen werden kann.

Während die Details spezifisch für Linux sind, haben viele Unix-Varianten ein `/ proc`-Dateisystem, das Informationen über einen Prozess, möglicherweise einschließlich der Umgebung, verfügbar macht. Wo es nicht existiert, muss es eine Möglichkeit geben (z. B. einen Systemaufruf), damit "ps" und ähnliche Befehle funktionieren. Es gibt (oder gab es zumindest) sogar Unix-Varianten, bei denen `ps` ein Setuid-Root-Programm ist, das den Kernel-Speicher direkt liest.
Danke @logicalscope. Gute Antwort. Ich hätte es gerne akzeptiert, aber Gilles lieferte eine viel umfassendere und detailliertere Erklärung, dass ich einfach seine auswählen muss. +1 von mir!
/ dev / mem und / dev / kmem bieten beide direkten Zugriff auf den Speicher, wodurch Umgebungsvariablen (und so ziemlich alles andere) gelesen werden können.Diese werden auch von anderen UNIX-Varianten unterstützt - https://www.freebsd.org/cgi/man.cgi?query=mem&sektion=4&apropos=0&manpath=FreeBSD+9.1-RELEASE
slowhand
2014-04-29 23:53:10 UTC
view on stackexchange narkive permalink

Trotz Gilles 'theoretisch korrekter Antwort: Ich würde keine Geheimnisse in Umgebungsvariablen einfügen.

  • Umgebungsvariablen werden normalerweise am oberen Rand des Prozessbaums definiert (z. B. über $ HOME / .profile ).
  • Benutzer behandeln den Inhalt der Umgebung nicht als Geheimnisse.

Es reicht aus, wenn ein einzelner Prozess die Umgebungsvariablen in a protokolliert Weltlesbare Datei: env >> env-traces.txt oder ähnliches. Sie können es nicht steuern.

Es wäre ungewöhnlich, vertrauliche Daten in ".profile" aufzunehmen. Normalerweise werden vertrauliche Daten von einem Programm in die Umgebung gestellt, das Daten an einen bestimmten Unterprozess übergeben möchte, als Alternative zur Verwendung von Befehlszeilenargumenten (die normalerweise für andere Benutzer sichtbar sind).
Ich würde argumentieren, dass die Pfade zu bestimmten SSH-Schlüsseln, die zu SSH-Agent und ähnlichen Dingen hinzugefügt wurden, grenzwertig vertraulich sind und diese ständig in .profile gehen. Ich habe auch einige DB2-Administratoren, die wirklich gerne Verbindungskennwörter in ihr .profile einfügen (eigentlich das .profile eines gemeinsam genutzten "Datenbankadministrator" -Kontos), aber hoffentlich ist das überhaupt nicht üblich. : /
Steven Stewart-Gallus
2014-07-05 10:27:44 UTC
view on stackexchange narkive permalink

In den meisten Fällen kann ein anderer Benutzer Ihre Umgebungsvariablen nicht lesen. Die bekannte Sicherheitslücke, die eine Instanz eines Setuid-Programms als derselbe Benutzer wie jede andere Instanz eines Setuid-Programms ausführt, kann jedoch ausgenutzt werden. Dies bedeutet, dass jemand, der ein Setuid-Programm ausführt und ein anderes Programm, das auf denselben Benutzer eingestellt ist, aus / proc / <pid> / environ lesen kann, die Umgebungsvariablen des Programms lesen kann. Dies ist ein Grund, warum Sie für jeden Daemon, den Sie schreiben, einen neuen Benutzer verwenden sollten, anstatt den Benutzer Nobody zu missbrauchen.

Alexey Vesnin
2016-01-02 10:24:04 UTC
view on stackexchange narkive permalink

Wenn es keine strengen Richtlinien gibt, gibt es theoretisch eine Möglichkeit, wenn dieser Export in einem Bash-Login-Benutzerskript für Alice durchgeführt wird: Eve erstellt ein Skript zum Drucken von env und setzt SETUIDGID-Bits in chmod und dann chown es ist zu Alice, dann führt. Das Skript wird unter Alices UID ausgeführt und sein Bash-Autorun wird Alices sein. Dann leckt es die Daten über stdout heraus =) Aber es muss ein sehr schwaches System-Setup geben, um solche Tricks auszuführen. Ich habe in meiner forensischen Praxis so schrecklich konfigurierte Boxen gesehen, also ist es kein Scherz.



Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...