私bash
は、共通のライブラリを持つユーティリティのコレクションを書いています。私が作成する各スクリプトには、実行可能ファイルに対するライブラリの相対パスを決定するコード ブロックが必要です。実際のコードではありませんが、例:
#!/bin/bash
DIR="$( cd -P "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
. $DIR/../lib/utilities/functions
ライブラリを検索しようとするプリアンブルの代わりに、環境変数を使用してライブラリの場所を示すという優れたアイデアを思いつきました。
#!/bin/bash
. $TOOLS_LIBRARY_PATH
ラッパー プログラムを使用してその環境変数を設定することも、独自のパスに設定することもできます。bash
ツールセットを整理するより良い方法があるかもしれませんが、問題は次のとおりです。
自分の環境変数を信頼できますか?
これは、私が本当に考えたことのない種類の質問の 1 つです。他の言語でプログラミングする場合、ライブラリを見つけるためにパスが使用されます (例: LD_LIBRARY_PATH
、PYTHONPATH
、PERLLIB
、RUBYLIB
) 。CLASSPATH
NODE_PATH
実際、LD_LIBRARY_PATH
has Whyの使用をLD_LIBRARY_PATH
思いとどまらせるのはよくありません。Ruby および Perl のライブラリ パス環境変数は、それぞれのセキュリティ メカニズムが呼び出されている場合、$SAFE
および-T
(テイント モード)の場合は無視されます。
ここまでの思い…
- ユーザーは
TOOLS_PATH_LIBRARY
選択したライブラリに設定できますが、ユーティリティはユーザーの uid で実行されます。悪意のあるライブラリを直接実行するだけで済みますbash
。 - 私のツール
sudo
いくつかのもの。TOOLS_PATH_LIBRARY
誰かがこれを利用するものに設定できます。ただし、ツールは を介して実行されるのではなく、あちこちでsudo
起動するだけです。sudo
いずれにせよ、ユーザーは である必要があり、直接sudoer
呼び出すことができますsudo
。 - 信用できないなら
TOOLS_PATH_LIBRARY
、信用できないPATH
。すべてのプログラム呼び出しは、絶対パスを使用する必要があります。 - シェルプログラムが絶対的なプログラムのエイリアスを使用するのを見たことがあります。そのため、を呼び出す代わりに
ls
、のような変数を使用しますLS=/bin/ls
。私が読んだことによると、これはユーザーがプログラムのデフォルトをエイリアスとして再定義するのを防ぐためです。参照: PATH、関数、およびセキュリティ。Bash スクリプトのベスト プラクティス。 . - Perl の汚染モードは、すべての環境変数を「汚染された」ものとして扱います。これは予感です。そのため、私は環境のリスクについて推論しようとしています。
- ユーザーが root でない限り、あるユーザーが別のユーザーの環境を変更することはできません。したがって、ユーザーが自分の環境を変更して特権をエスカレートすることだけに関心があります。参照:別のプロセスの環境変数を変更する方法はありますか?
私はこれをある種の回答にゴムダックしましたが、それは完全な回答ではないので、まだ投稿します.
更新: 環境変数を使用してライブラリと実行可能ファイルへのパスを指定する際のセキュリティ上の問題は何ですか?