機密データの流れをたどってみましょう。この分析では、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
または類似。制御することはできません。