GNU/Linux >> Linux の 問題 >  >> Linux

Linux での環境変数のアクセシビリティ

機密データの流れをたどってみましょう。この分析では、Alice が実行できることはすべて、root も実行できることがわかります。また、「1 レベル上」の外部オブザーバー (たとえば、ディスク バス上で、またはコードが仮想マシンで実行されている場合はハイパーバイザー内でスヌープするための物理アクセスを持つ) は、データにアクセスできる可能性があります。

まず、ファイルからデータを読み込みます。 Alice だけがファイルの読み取り権限を持っており、ファイルが漏洩していないと仮定すると、Alice だけが cat /home/alice/fav_food.txt を呼び出すことができます。 成功しました。その後、データは cat のメモリに格納されます そのプロセスのみがアクセスできるプロセス。データは cat からパイプ経由で送信されます 呼び出しシェルへのコマンド。関連する 2 つのプロセスだけが、パイプ上のデータを見ることができます。その後、データはシェル プロセスのメモリに格納され、再びそのプロセス専用になります。

ある時点で、データはシェルの環境に配置されます。シェルによっては、これは export ステートメントが実行されるか、シェルが外部プログラムを実行するときにのみ実行されます。この時点で、データは execve の引数になります システムコール。その呼び出しの後、データは子プロセスの環境にあります。

プロセスの環境は、そのプロセスの残りのメモリと同じようにプライベートです (mm->env_start から) mm->env_end まで プロセスのメモリ マップ内)。初期スレッドのスタックと連続しています。ただし、他のプロセスが環境のコピーを表示できる特別なメカニズムがあります:environ プロセスの /proc のファイル ディレクトリ (/proc/$pid/environ )。このファイルは、プロセスを実行しているユーザーである所有者のみが読み取ることができます (特権プロセスの場合、それが有効な UID です)。 (/proc/$pid/cmdline のコマンド ライン引数に注意してください。 、一方、すべての人が読み取ることができます。) カーネル ソースを監査して、これがプロセスの環境をリークする唯一の方法であることを確認できます。

環境をリークする別の潜在的な原因があります:execve 電話。 execve システムコールは環境を直接リークしません。ただし、execve を含むすべてのシステム コールの引数をログに記録できる一般的な監査メカニズムがあります。 .そのため、監査が有効になっている場合、環境は監査メカニズムを介して送信され、最終的にログ ファイルに記録されます。適切に構成されたシステムでは、管理者のみがログ ファイルにアクセスできます (デフォルトの Debian インストールでは、/var/log/audit/audit.log です)。 、ルートによってのみ読み取り可能で、auditd によって書き込まれます ルートとして実行されているデーモン)。

私は上で嘘をつきました:私は、プロセスのメモリは別のプロセスによって読み取ることができないと書きました.これは実際には正しくありません。すべてのユニックスと同様に、Linux は ptrace を実装しています。 システムコール。このシステム コールにより、プロセスはメモリを検査し、別のプロセスのコンテキストでコードを実行することさえできます。それがデバッガーの存在を可能にするものです。 Alice のプロセスを追跡できるのは Alice だけです。さらに、プロセスに特権 (setuid または setgid) がある場合、root だけがそれをトレースできます。

結論:プロセスの環境は、プロセスを実行しているユーザー (euid) のみが利用できます .

データを漏らす可能性のある他のプロセスはないと仮定していることに注意してください。通常の Linux インストールには、プロセスの環境を公開する可能性のある setuid root プログラムはありません。 (一部の古いユニバースでは、ps 一部のカーネル メモリを解析する setuid ルート プログラムでした。一部の亜種は、プロセスの環境をすべての人に喜んで表示します。 Linux では ps 権限がなく、/proc からデータを取得します 他のみんなと同じように.)

(これは、かなり最新のバージョンの Linux に適用されることに注意してください。かなり昔、1.x カーネルの時代には、環境は誰でも読み取り可能でした。)


最初は「いいえ」と言うつもりでした。環境変数の値はユーザーごとであり、他のユーザーは別のユーザーの環境を読み書きすることはできません。変数。ただし、SO には、root が少なくとも /proc/<pid>/environ を介してこの情報を読み取ることができることを示す興味深い情報があります。 .私は今まで、この Linux 固有のインターフェースを知りませんでした。

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

そうは言っても、他のユーザーが同じグループに属していても、このインターフェイスはまだ読み取れないようです。環境ファイルのパーミッションは 400 に設定され、/proc は chmod がファイルに影響を与えないようにします。ユーザー間で環境変数を分離するためのセキュリティ ドメインはまだ損なわれておらず、通常の方法ではバイパスできないと思われます。


Gilles の理論的に正しい答えにもかかわらず、私はシークレットを環境変数に入れません。

  • 環境変数は通常、プロセス ツリーの最上部近くで定義されます (例:$HOME/.profile まで)。 ).
  • ユーザーは環境の内容を秘密として扱いません。

単一のプロセスが環境変数を誰でも読み取り可能なファイルに記録するだけで十分です:env >> env-traces.txt または類似。制御することはできません。


Linux
  1. Linux環境変数のヒントとコツ

  2. Linux の起動プロセス

  3. Linux 環境での C#

  1. Linux プロセスの状態

  2. Linux 環境変数名で使用できる文字

  3. Linux の CreateProcess?

  1. Linux でスペースを使用して環境変数を設定する

  2. Linux でのデーモンの作成

  3. Linux:サービスへの処理