
setuidビットが設定されたプログラムを実行すると、シェルに設定された特定の環境変数(bashなど)を受信できないことが観察されました。この方法で削除されたいくつかの環境変数はLD_PRELOAD, LD_LIBRARY_PATH, LD_ORIGIN_PATH, LD_DEBUG_OUTPUT, LD_PROFILE, LD_USE_LOAD_BIAS, GCONV_PATH
。
で述べたようにここそしてこの問題、これは予想される動作です。その理由は攻撃ベクトルを減らすためです。マニュアルページld.so (8)
にもこれに関する内容が記載されています。
問題は、Linuxオペレーティングシステムのどのコンポーネントがこのような環境変数を削除するのかということです。
- シェルですか?
- コマンドの実行時にシェルが内部的に呼び出す関数ですか
fork()
?execve()
- うん
ld.so
?
注:どんな答えでも役に立ちます。ただし、どのマニュアルページを読むべきかなど、この問題に関する情報を含むリソースを教えてください。
答え1
これらの変数のほとんどは動的リンカーまたはCライブラリの他のコンポーネントで使用され、setuidバイナリを起動するとその変数を削除する役割を果たします。この内容は次のように記録されます。「環境」セクションman ld.so
(GNU Cライブラリの場合):
セキュリティ上の理由から、動的リンカーがバイナリを安全な実行モードで実行する必要があると判断した場合、特定の環境変数の役割が無効化または変更され、これらの環境変数は環境から削除され、プログラムは実行されません。何でも動作します。定義を参照してください。これらの環境変数のいくつかは、以下に説明するように、動的リンカー自体の動作に影響を与えます。このように処理される他の環境変数には 、、、、、、、、、、、、、、および
GCONV_PATH
があり ます。GETCONF_DIR
HOSTALIASES
LOCALDOMAIN
LOCPATH
MALLOC_TRACE
NIS_PATH
NLSPATH
RESOLV_HOST_CONF
RES_OPTIONS
TMPDIR
TZDIR
影響ld.so
変数は別々に記録されます。
この変数はセーフランモードでは無視されます。
これらの各変数のドキュメントに表示されます。
完全なリストも提供されます。GNU Cライブラリのソースコードから、コード自体を削除することも可能です。動的に接続されたバイナリの場合そして静的にリンクされたバイナリの動的リンク用。
他のCライブラリの動的リンカーは、関心のある変数に対して同様の方法で機能します。musl ファイルは次のことを示します。
この変数は、setuid、setgid、または他のホイストされた関数を呼び出すプログラムでは完全に無視されます。
多くの変数(LD_PRELOAD
、、、)の場合、この場合LD_LIBRARY_PATH
、変数の一部の機能は使用できません。MUSL_LOCPATH
TZ