web-dev-qa-db-ja.com

(任意のプラットフォームで)環境変数のいくつかの脆弱性は何ですか?

私は小さなクロスプラットフォームPythonアプリケーション(社内で使用されるパッケージマネージャー))を書いていて、似たようなものを使用することを考えています スタックオーバーフローに関するこの回答 管理者/ルート権限をチェックするために著者が環境変数の脆弱性に言及していることに気づきました。

環境変数がオーバーフローなどに対して脆弱であり、それらがおそらく重要な攻撃面を表すことは、私には驚くことではありません。それらに対する攻撃の具体的な例をいくつか教えてもらえますか?特に、アプリケーションがそれらに依存している場合、アプリケーションがさらされる可能性がありますか? WinNTとLinuxの両方の例を歓迎します。

(また、-さまざまな理由により、Nuget/APTなどの既存のパッケージ管理ソリューションを使用できません。内部ソフトウェアの独自の配布を維持し、特に複数のプラットフォームを対象とする小さな特殊なソリューションを作成する方が簡単です)

4
nerflad

外部からのものであり、攻撃者が制御できるものを明示的または暗黙的に信頼することに関連する通常のリスクがあります。また、環境変数は常にではない制限された可視性を提供すると想定するリスクがあります。いくつかの例:

  • PATH、LD_LIBRARY_PATH、Perl5LIBなどの環境変数を暗黙的に信頼すると、これらの変数がプログラムとライブラリを探す場所を決定するため、コードが不要に実行される可能性があります。 IFSのような同様の変数が、プログラムに与えられた情報を解釈する方法を決定します。そして、問題は Shellshock の脆弱性のように、悪意のあるコンテンツを含む任意の変数である場合があります。そのため、昇格された特権(Sudoなど)を使用するプログラムは、特権を持たないユーザーが実行すると、すべての環境変数を削除またはサニタイズする必要があります。また、環境変数を設定するプログラム(CGIインターフェースを備えたWebサーバーなど)は、攻撃者がこれらの変数に入れる情報を制御する可能性があるため、非常に注意する必要があります。
  • 親プロセスから子プロセスに機密情報(パスワードなど)を渡すために環境変数を使用しないでください。 OSによっては、システム上の他のユーザーが環境変数の内容を確認して、これらの機密情報を取得する場合があります。

したがって、環境変数を使用する場合の規則は次のとおりです。

  • これらの変数の内容は、明示的にも暗黙的にも信頼しないでください。つまり、変数が別の特権を持つユーザーによって設定され、プログラムが実行されている場合は特に、変数を削除またはサニタイズします。
  • 他のユーザーがこれらを読む可能性があるため、環境変数に機密情報を入れないでください。
  • 自分で完全に生成しなかった(つまり、攻撃者が制御する可能性がある)データでこれらの変数を設定する場合は、非常に注意して、すべてを無害化して、それを武装解除してください。
3
Steffen Ullrich